Home | History | Annotate | Line # | Download | only in compiler
aslrules.y revision 1.1.1.8
      1 NoEcho('
      2 /******************************************************************************
      3  *
      4  * Module Name: aslrules.y - Main Bison/Yacc production rules
      5  *                         - Keep this file synched with the
      6  *                           CvParseOpBlockType function in cvcompiler.c
      7  *
      8  *****************************************************************************/
      9 
     10 /*
     11  * Copyright (C) 2000 - 2017, Intel Corp.
     12  * All rights reserved.
     13  *
     14  * Redistribution and use in source and binary forms, with or without
     15  * modification, are permitted provided that the following conditions
     16  * are met:
     17  * 1. Redistributions of source code must retain the above copyright
     18  *    notice, this list of conditions, and the following disclaimer,
     19  *    without modification.
     20  * 2. Redistributions in binary form must reproduce at minimum a disclaimer
     21  *    substantially similar to the "NO WARRANTY" disclaimer below
     22  *    ("Disclaimer") and any redistribution must be conditioned upon
     23  *    including a substantially similar Disclaimer requirement for further
     24  *    binary redistribution.
     25  * 3. Neither the names of the above-listed copyright holders nor the names
     26  *    of any contributors may be used to endorse or promote products derived
     27  *    from this software without specific prior written permission.
     28  *
     29  * Alternatively, this software may be distributed under the terms of the
     30  * GNU General Public License ("GPL") version 2 as published by the Free
     31  * Software Foundation.
     32  *
     33  * NO WARRANTY
     34  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
     35  * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
     36  * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR
     37  * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
     38  * HOLDERS OR CONTRIBUTORS BE LIABLE FOR SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
     39  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
     40  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
     41  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
     42  * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
     43  * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
     44  * POSSIBILITY OF SUCH DAMAGES.
     45  */
     46 
     47 ')
     48 
     49 /*******************************************************************************
     50  *
     51  * ASL Root and Secondary Terms
     52  *
     53  ******************************************************************************/
     54 
     55 /*
     56  * Root term. Allow multiple #line directives before the definition block
     57  * to handle output from preprocessors
     58  */
     59 AslCode
     60     : DefinitionBlockList           {$<n>$ = TrLinkOpChildren (
     61                                         TrCreateLeafOp (PARSEOP_ASL_CODE),1, $1);}
     62     | error                         {YYABORT; $$ = NULL;}
     63     ;
     64 
     65 
     66 /*
     67  * Note concerning support for "module-level code".
     68  *
     69  * ACPI 1.0 allowed Type1 and Type2 executable opcodes outside of control
     70  * methods (the so-called module-level code.) This support was explicitly
     71  * removed in ACPI 2.0, but this type of code continues to be created by
     72  * BIOS vendors. In order to support the disassembly and recompilation of
     73  * such code (and the porting of ASL code to iASL), iASL supports this
     74  * code in violation of the current ACPI specification.
     75  *
     76  * The grammar change to support module-level code is to revert the
     77  * {ObjectList} portion of the DefinitionBlockTerm in ACPI 2.0 to the
     78  * original use of {TermList} instead (see below.) This allows the use
     79  * of Type1 and Type2 opcodes at module level.
     80  *
     81  * 04/2016: The module-level code is now allowed in the following terms:
     82  * DeviceTerm, PowerResTerm, ProcessorTerm, ScopeTerm, ThermalZoneTerm.
     83  * The ObjectList term is obsolete and has been removed.
     84  */
     85 DefinitionBlockTerm
     86     : PARSEOP_DEFINITION_BLOCK
     87         PARSEOP_OPEN_PAREN          {$<n>$ = TrCreateLeafOp (PARSEOP_DEFINITION_BLOCK); COMMENT_CAPTURE_OFF;}
     88         String ','
     89         String ','
     90         ByteConst ','
     91         String ','
     92         String ','
     93         DWordConst
     94         PARSEOP_CLOSE_PAREN         {TrSetOpIntegerWidth ($6,$8);
     95                                         TrSetOpEndLineNumber ($<n>3); COMMENT_CAPTURE_ON;}
     96             '{' TermList '}'        {$$ = TrLinkOpChildren ($<n>3,7,
     97                                         $4,$6,$8,$10,$12,$14,$18);}
     98     ;
     99 
    100 DefinitionBlockList
    101     : DefinitionBlockTerm
    102     | DefinitionBlockTerm
    103         DefinitionBlockList         {$$ = TrLinkPeerOps (2, $1,$2);}
    104     ;
    105 
    106 
    107 /******* Basic ASCII identifiers **************************************************/
    108 
    109 /* Allow IO, DMA, IRQ Resource macro and FOR macro names to also be used as identifiers */
    110 
    111 NameString
    112     : NameSeg                       {}
    113     | PARSEOP_NAMESTRING            {$$ = TrCreateValuedLeafOp (PARSEOP_NAMESTRING, (ACPI_NATIVE_INT) $1);}
    114     | PARSEOP_IO                    {$$ = TrCreateValuedLeafOp (PARSEOP_NAMESTRING, (ACPI_NATIVE_INT) "IO");}
    115     | PARSEOP_DMA                   {$$ = TrCreateValuedLeafOp (PARSEOP_NAMESTRING, (ACPI_NATIVE_INT) "DMA");}
    116     | PARSEOP_IRQ                   {$$ = TrCreateValuedLeafOp (PARSEOP_NAMESTRING, (ACPI_NATIVE_INT) "IRQ");}
    117     | PARSEOP_FOR                   {$$ = TrCreateValuedLeafOp (PARSEOP_NAMESTRING, (ACPI_NATIVE_INT) "FOR");}
    118     ;
    119 /*
    120 NameSeg
    121     : PARSEOP_NAMESEG               {$$ = TrCreateValuedLeafOp (PARSEOP_NAMESEG, (ACPI_NATIVE_INT)
    122                                         TrNormalizeNameSeg ($1));}
    123     ;
    124 */
    125 
    126 NameSeg
    127     : PARSEOP_NAMESEG               {$$ = TrCreateValuedLeafOp (PARSEOP_NAMESEG,
    128                                         (ACPI_NATIVE_INT) AslCompilerlval.s);}
    129     ;
    130 
    131 
    132 /******* Fundamental argument/statement types ***********************************/
    133 
    134 Term
    135     : Object                        {}
    136     | Type1Opcode                   {}
    137     | Type2Opcode                   {}
    138     | Type2IntegerOpcode            {$$ = TrSetOpFlags ($1, OP_COMPILE_TIME_CONST);}
    139     | Type2StringOpcode             {$$ = TrSetOpFlags ($1, OP_COMPILE_TIME_CONST);}
    140     | Type2BufferOpcode             {}
    141     | Type2BufferOrStringOpcode     {}
    142     | error                         {$$ = AslDoError(); yyclearin;}
    143     ;
    144 
    145 SuperName
    146     : SimpleName                    {}
    147     | DebugTerm                     {}
    148     | Type6Opcode                   {}
    149     ;
    150 
    151 Target
    152     :                               {$$ = TrCreateNullTargetOp ();} /* Placeholder is a ZeroOp object */
    153     | ','                           {$$ = TrCreateNullTargetOp ();} /* Placeholder is a ZeroOp object */
    154     | ',' SuperName                 {$$ = TrSetOpFlags ($2, OP_IS_TARGET);}
    155     ;
    156 
    157 RequiredTarget
    158     : ',' SuperName                 {$$ = TrSetOpFlags ($2, OP_IS_TARGET);}
    159     ;
    160 
    161 TermArg
    162     : SimpleName                    {$$ = TrSetOpFlags ($1, OP_IS_TERM_ARG);}
    163     | Type2Opcode                   {$$ = TrSetOpFlags ($1, OP_IS_TERM_ARG);}
    164     | DataObject                    {$$ = TrSetOpFlags ($1, OP_IS_TERM_ARG);}
    165     | PARSEOP_OPEN_PAREN
    166         TermArg
    167         PARSEOP_CLOSE_PAREN         {$$ = TrSetOpFlags ($2, OP_IS_TERM_ARG);}
    168     ;
    169 
    170 /*
    171  NOTE: Removed from TermArg due to reduce/reduce conflicts:
    172     | Type2IntegerOpcode            {$$ = TrSetOpFlags ($1, OP_IS_TERM_ARG);}
    173     | Type2StringOpcode             {$$ = TrSetOpFlags ($1, OP_IS_TERM_ARG);}
    174     | Type2BufferOpcode             {$$ = TrSetOpFlags ($1, OP_IS_TERM_ARG);}
    175     | Type2BufferOrStringOpcode     {$$ = TrSetOpFlags ($1, OP_IS_TERM_ARG);}
    176 
    177 */
    178 
    179 MethodInvocationTerm
    180     : NameString
    181         PARSEOP_OPEN_PAREN          {TrSetOpIntegerValue (PARSEOP_METHODCALL, $1); COMMENT_CAPTURE_OFF;}
    182         ArgList
    183         PARSEOP_CLOSE_PAREN         {$$ = TrLinkChildOp ($1,$4); COMMENT_CAPTURE_ON;}
    184     ;
    185 
    186 /* OptionalCount must appear before ByteList or an incorrect reduction will result */
    187 
    188 OptionalCount
    189     :                               {$$ = TrCreateLeafOp (PARSEOP_ONES);}       /* Placeholder is a OnesOp object */
    190     | ','                           {$$ = TrCreateLeafOp (PARSEOP_ONES);}       /* Placeholder is a OnesOp object */
    191     | ',' TermArg                   {$$ = $2;}
    192     ;
    193 
    194 /*
    195  * Data count for buffers and packages (byte count for buffers,
    196  * element count for packages).
    197  */
    198 OptionalDataCount
    199 
    200         /* Legacy ASL */
    201     :                               {$$ = NULL;}
    202     | PARSEOP_OPEN_PAREN
    203         TermArg
    204         PARSEOP_CLOSE_PAREN         {$$ = $2;}
    205     | PARSEOP_OPEN_PAREN
    206         PARSEOP_CLOSE_PAREN         {$$ = NULL;}
    207 
    208         /* C-style (ASL+) -- adds equals term */
    209 
    210     |  PARSEOP_EXP_EQUALS           {$$ = NULL;}
    211 
    212     | PARSEOP_OPEN_PAREN
    213         TermArg
    214         PARSEOP_CLOSE_PAREN
    215         PARSEOP_EXP_EQUALS          {$$ = $2;}
    216 
    217     | PARSEOP_OPEN_PAREN
    218         PARSEOP_CLOSE_PAREN
    219         String
    220         PARSEOP_EXP_EQUALS          {$$ = NULL;}
    221     ;
    222 
    223 
    224 /******* List Terms **************************************************/
    225 
    226     /* ACPI 3.0 -- allow semicolons between terms */
    227 
    228 TermList
    229     :                               {$$ = NULL;}
    230     | TermList Term                 {$$ = TrLinkPeerOp (
    231                                         TrSetOpFlags ($1, OP_RESULT_NOT_USED),$2);}
    232     | TermList Term ';'             {$$ = TrLinkPeerOp (
    233                                         TrSetOpFlags ($1, OP_RESULT_NOT_USED),$2);}
    234     | TermList ';' Term             {$$ = TrLinkPeerOp (
    235                                         TrSetOpFlags ($1, OP_RESULT_NOT_USED),$3);}
    236     | TermList ';' Term ';'         {$$ = TrLinkPeerOp (
    237                                         TrSetOpFlags ($1, OP_RESULT_NOT_USED),$3);}
    238     ;
    239 
    240 ArgList
    241     :                               {$$ = NULL;}
    242     | TermArg
    243     | ArgList ','                   /* Allows a trailing comma at list end */
    244     | ArgList ','
    245         TermArg                     {$$ = TrLinkPeerOp ($1,$3);}
    246     ;
    247 
    248 ByteList
    249     :                               {$$ = NULL;}
    250     | ByteConstExpr
    251     | ByteList ','                  /* Allows a trailing comma at list end */
    252     | ByteList ','
    253         ByteConstExpr               {$$ = TrLinkPeerOp ($1,$3);}
    254     ;
    255 
    256 DWordList
    257     :                               {$$ = NULL;}
    258     | DWordConstExpr
    259     | DWordList ','                 /* Allows a trailing comma at list end */
    260     | DWordList ','
    261         DWordConstExpr              {$$ = TrLinkPeerOp ($1,$3);}
    262     ;
    263 
    264 FieldUnitList
    265     :                               {$$ = NULL;}
    266     | FieldUnit
    267     | FieldUnitList ','             /* Allows a trailing comma at list end */
    268     | FieldUnitList ','
    269         FieldUnit                   {$$ = TrLinkPeerOp ($1,$3);}
    270     ;
    271 
    272 FieldUnit
    273     : FieldUnitEntry                {}
    274     | OffsetTerm                    {}
    275     | AccessAsTerm                  {}
    276     | ConnectionTerm                {}
    277     ;
    278 
    279 FieldUnitEntry
    280     : ',' AmlPackageLengthTerm      {$$ = TrCreateOp (PARSEOP_RESERVED_BYTES,1,$2);}
    281     | NameSeg ','
    282         AmlPackageLengthTerm        {$$ = TrLinkChildOp ($1,$3);}
    283     ;
    284 
    285 Object
    286     : CompilerDirective             {}
    287     | NamedObject                   {}
    288     | NameSpaceModifier             {}
    289 /*    | StructureTerm                 {} */
    290     ;
    291 
    292 PackageList
    293     :                               {$$ = NULL;}
    294     | PackageElement
    295     | PackageList ','               /* Allows a trailing comma at list end */
    296     | PackageList ','
    297         PackageElement              {$$ = TrLinkPeerOp ($1,$3);}
    298     ;
    299 
    300 PackageElement
    301     : DataObject                    {}
    302     | NameString                    {}
    303     ;
    304 
    305     /* Rules for specifying the type of one method argument or return value */
    306 
    307 ParameterTypePackage
    308     :                               {$$ = NULL;}
    309     | ObjectTypeKeyword             {$$ = $1;}
    310     | ParameterTypePackage ','
    311         ObjectTypeKeyword           {$$ = TrLinkPeerOps (2,$1,$3);}
    312     ;
    313 
    314 ParameterTypePackageList
    315     :                               {$$ = NULL;}
    316     | ObjectTypeKeyword             {$$ = $1;}
    317     | '{' ParameterTypePackage '}'  {$$ = $2;}
    318     ;
    319 
    320 OptionalParameterTypePackage
    321     :                               {$$ = TrCreateLeafOp (PARSEOP_DEFAULT_ARG);}
    322     | ',' ParameterTypePackageList  {$$ = TrLinkOpChildren (
    323                                         TrCreateLeafOp (PARSEOP_DEFAULT_ARG),1,$2);}
    324     ;
    325 
    326     /* Rules for specifying the types for method arguments */
    327 
    328 ParameterTypesPackage
    329     : ParameterTypePackageList      {$$ = $1;}
    330     | ParameterTypesPackage ','
    331         ParameterTypePackageList    {$$ = TrLinkPeerOps (2,$1,$3);}
    332     ;
    333 
    334 ParameterTypesPackageList
    335     :                               {$$ = NULL;}
    336     | ObjectTypeKeyword             {$$ = $1;}
    337     | '{' ParameterTypesPackage '}' {$$ = $2;}
    338     ;
    339 
    340 OptionalParameterTypesPackage
    341     :                               {$$ = TrCreateLeafOp (PARSEOP_DEFAULT_ARG);}
    342     | ',' ParameterTypesPackageList {$$ = TrLinkOpChildren (
    343                                         TrCreateLeafOp (PARSEOP_DEFAULT_ARG),1,$2);}
    344     ;
    345 
    346 /*
    347  * Case-Default list; allow only one Default term and unlimited Case terms
    348  */
    349 CaseDefaultTermList
    350     :                               {$$ = NULL;}
    351     | CaseTerm                      {}
    352     | DefaultTerm                   {}
    353     | CaseDefaultTermList
    354         CaseTerm                    {$$ = TrLinkPeerOp ($1,$2);}
    355     | CaseDefaultTermList
    356         DefaultTerm                 {$$ = TrLinkPeerOp ($1,$2);}
    357 
    358 /* Original - attempts to force zero or one default term within the switch */
    359 
    360 /*
    361 CaseDefaultTermList
    362     :                               {$$ = NULL;}
    363     | CaseTermList
    364         DefaultTerm
    365         CaseTermList                {$$ = TrLinkPeerOp ($1,TrLinkPeerOp ($2, $3));}
    366     | CaseTermList
    367         CaseTerm                    {$$ = TrLinkPeerOp ($1,$2);}
    368     ;
    369 
    370 CaseTermList
    371     :                               {$$ = NULL;}
    372     | CaseTerm                      {}
    373     | CaseTermList
    374         CaseTerm                    {$$ = TrLinkPeerOp ($1,$2);}
    375     ;
    376 */
    377 
    378 
    379 /*******************************************************************************
    380  *
    381  * ASL Data and Constant Terms
    382  *
    383  ******************************************************************************/
    384 
    385 DataObject
    386     : BufferData                    {}
    387     | PackageData                   {}
    388     | IntegerData                   {}
    389     | StringData                    {}
    390     ;
    391 
    392 BufferData
    393     : Type5Opcode                   {$$ = TrSetOpFlags ($1, OP_COMPILE_TIME_CONST);}
    394     | Type2BufferOrStringOpcode     {$$ = TrSetOpFlags ($1, OP_COMPILE_TIME_CONST);}
    395     | Type2BufferOpcode             {$$ = TrSetOpFlags ($1, OP_COMPILE_TIME_CONST);}
    396     | BufferTerm                    {}
    397     ;
    398 
    399 PackageData
    400     : PackageTerm                   {}
    401     ;
    402 
    403 IntegerData
    404     : Type2IntegerOpcode            {$$ = TrSetOpFlags ($1, OP_COMPILE_TIME_CONST);}
    405     | Type3Opcode                   {$$ = TrSetOpFlags ($1, OP_COMPILE_TIME_CONST);}
    406     | Integer                       {}
    407     | ConstTerm                     {}
    408     ;
    409 
    410 StringData
    411     : Type2StringOpcode             {$$ = TrSetOpFlags ($1, OP_COMPILE_TIME_CONST);}
    412     | String                        {}
    413     ;
    414 
    415 ByteConst
    416     : Integer                       {$$ = TrSetOpIntegerValue (PARSEOP_BYTECONST, $1);}
    417     ;
    418 
    419 WordConst
    420     : Integer                       {$$ = TrSetOpIntegerValue (PARSEOP_WORDCONST, $1);}
    421     ;
    422 
    423 DWordConst
    424     : Integer                       {$$ = TrSetOpIntegerValue (PARSEOP_DWORDCONST, $1);}
    425     ;
    426 
    427 QWordConst
    428     : Integer                       {$$ = TrSetOpIntegerValue (PARSEOP_QWORDCONST, $1);}
    429     ;
    430 
    431 /*
    432  * The OP_COMPILE_TIME_CONST flag in the following constant expressions
    433  * enables compile-time constant folding to reduce the Type3Opcodes/Type2IntegerOpcodes
    434  * to simple integers. It is an error if these types of expressions cannot be
    435  * reduced, since the AML grammar for ****ConstExpr requires a simple constant.
    436  * Note: The required byte length of the constant is passed through to the
    437  * constant folding code in the node AmlLength field.
    438  */
    439 ByteConstExpr
    440     : Type3Opcode                   {$$ = TrSetOpFlags ($1, OP_COMPILE_TIME_CONST);
    441                                         TrSetOpAmlLength ($1, 1);}
    442     | Type2IntegerOpcode            {$$ = TrSetOpFlags ($1, OP_COMPILE_TIME_CONST);
    443                                         TrSetOpAmlLength ($1, 1);}
    444     | ConstExprTerm                 {$$ = TrSetOpIntegerValue (PARSEOP_BYTECONST, $1);}
    445     | ByteConst                     {}
    446     ;
    447 
    448 WordConstExpr
    449     : Type3Opcode                   {$$ = TrSetOpFlags ($1, OP_COMPILE_TIME_CONST);
    450                                         TrSetOpAmlLength ($1, 2);}
    451     | Type2IntegerOpcode            {$$ = TrSetOpFlags ($1, OP_COMPILE_TIME_CONST);
    452                                         TrSetOpAmlLength ($1, 2);}
    453     | ConstExprTerm                 {$$ = TrSetOpIntegerValue (PARSEOP_WORDCONST, $1);}
    454     | WordConst                     {}
    455     ;
    456 
    457 DWordConstExpr
    458     : Type3Opcode                   {$$ = TrSetOpFlags ($1, OP_COMPILE_TIME_CONST);
    459                                         TrSetOpAmlLength ($1, 4);}
    460     | Type2IntegerOpcode            {$$ = TrSetOpFlags ($1, OP_COMPILE_TIME_CONST);
    461                                         TrSetOpAmlLength ($1, 4);}
    462     | ConstExprTerm                 {$$ = TrSetOpIntegerValue (PARSEOP_DWORDCONST, $1);}
    463     | DWordConst                    {}
    464     ;
    465 
    466 QWordConstExpr
    467     : Type3Opcode                   {$$ = TrSetOpFlags ($1, OP_COMPILE_TIME_CONST);
    468                                         TrSetOpAmlLength ($1, 8);}
    469     | Type2IntegerOpcode            {$$ = TrSetOpFlags ($1, OP_COMPILE_TIME_CONST);
    470                                         TrSetOpAmlLength ($1, 8);}
    471     | ConstExprTerm                 {$$ = TrSetOpIntegerValue (PARSEOP_QWORDCONST, $1);}
    472     | QWordConst                    {}
    473     ;
    474 
    475 ConstTerm
    476     : ConstExprTerm                 {}
    477     | PARSEOP_REVISION              {$$ = TrCreateLeafOp (PARSEOP_REVISION);}
    478     ;
    479 
    480 ConstExprTerm
    481     : PARSEOP_ZERO                  {$$ = TrCreateValuedLeafOp (PARSEOP_ZERO, 0);}
    482     | PARSEOP_ONE                   {$$ = TrCreateValuedLeafOp (PARSEOP_ONE, 1);}
    483     | PARSEOP_ONES                  {$$ = TrCreateValuedLeafOp (PARSEOP_ONES, ACPI_UINT64_MAX);}
    484     | PARSEOP___DATE__              {$$ = TrCreateConstantLeafOp (PARSEOP___DATE__);}
    485     | PARSEOP___FILE__              {$$ = TrCreateConstantLeafOp (PARSEOP___FILE__);}
    486     | PARSEOP___LINE__              {$$ = TrCreateConstantLeafOp (PARSEOP___LINE__);}
    487     | PARSEOP___PATH__              {$$ = TrCreateConstantLeafOp (PARSEOP___PATH__);}
    488     | PARSEOP___METHOD__            {$$ = TrCreateConstantLeafOp (PARSEOP___METHOD__);}
    489     ;
    490 
    491 Integer
    492     : PARSEOP_INTEGER               {$$ = TrCreateValuedLeafOp (PARSEOP_INTEGER,
    493                                         AslCompilerlval.i);}
    494     ;
    495 
    496 String
    497     : PARSEOP_STRING_LITERAL        {$$ = TrCreateValuedLeafOp (PARSEOP_STRING_LITERAL,
    498                                         (ACPI_NATIVE_INT) AslCompilerlval.s);}
    499     ;
    500 
    501 
    502 /*******************************************************************************
    503  *
    504  * ASL Opcode Terms
    505  *
    506  ******************************************************************************/
    507 
    508 CompilerDirective
    509     : IncludeTerm                   {}
    510     | IncludeEndTerm                {}
    511     | ExternalTerm                  {}
    512     ;
    513 
    514 NamedObject
    515     : BankFieldTerm                 {}
    516     | CreateBitFieldTerm            {}
    517     | CreateByteFieldTerm           {}
    518     | CreateDWordFieldTerm          {}
    519     | CreateFieldTerm               {}
    520     | CreateQWordFieldTerm          {}
    521     | CreateWordFieldTerm           {}
    522     | DataRegionTerm                {}
    523     | DeviceTerm                    {}
    524     | EventTerm                     {}
    525     | FieldTerm                     {}
    526     | FunctionTerm                  {}
    527     | IndexFieldTerm                {}
    528     | MethodTerm                    {}
    529     | MutexTerm                     {}
    530     | OpRegionTerm                  {}
    531     | PowerResTerm                  {}
    532     | ProcessorTerm                 {}
    533     | ThermalZoneTerm               {}
    534     ;
    535 
    536 NameSpaceModifier
    537     : AliasTerm                     {}
    538     | NameTerm                      {}
    539 /*    | NameTermAslPlus               {} */
    540     | ScopeTerm                     {}
    541     ;
    542 
    543 SimpleName
    544     : NameString                    {}
    545     | LocalTerm                     {}
    546     | ArgTerm                       {}
    547     ;
    548 
    549 /* For ObjectType(), SuperName except for MethodInvocationTerm */
    550 
    551 ObjectTypeSource
    552     : SimpleName                    {}
    553     | DebugTerm                     {}
    554     | RefOfTerm                     {}
    555     | DerefOfTerm                   {}
    556     | IndexTerm                     {}
    557     | IndexExpTerm                  {}
    558     ;
    559 
    560 /* For DeRefOf(), SuperName except for DerefOf and Debug */
    561 
    562 DerefOfSource
    563     : SimpleName                    {}
    564     | RefOfTerm                     {}
    565     | DerefOfTerm                   {}
    566     | IndexTerm                     {}
    567     | IndexExpTerm                  {}
    568     | StoreTerm                     {}
    569     | EqualsTerm                    {}
    570     | MethodInvocationTerm          {}
    571     ;
    572 
    573 /* For RefOf(), SuperName except for RefOf and MethodInvocationTerm */
    574 
    575 RefOfSource
    576     : SimpleName                    {}
    577     | DebugTerm                     {}
    578     | DerefOfTerm                   {}
    579     | IndexTerm                     {}
    580     | IndexExpTerm                  {}
    581     ;
    582 
    583 /* For CondRefOf(), SuperName except for RefOf and MethodInvocationTerm */
    584 
    585 CondRefOfSource
    586     : SimpleName                    {}
    587     | DebugTerm                     {}
    588     | DerefOfTerm                   {}
    589     | IndexTerm                     {}
    590     | IndexExpTerm                  {}
    591     ;
    592 
    593 /*
    594  * Opcode types, as defined in the ACPI specification
    595  */
    596 Type1Opcode
    597     : BreakTerm                     {}
    598     | BreakPointTerm                {}
    599     | ContinueTerm                  {}
    600     | FatalTerm                     {}
    601     | ForTerm                       {}
    602     | ElseIfTerm                    {}
    603     | LoadTerm                      {}
    604     | NoOpTerm                      {}
    605     | NotifyTerm                    {}
    606     | ReleaseTerm                   {}
    607     | ResetTerm                     {}
    608     | ReturnTerm                    {}
    609     | SignalTerm                    {}
    610     | SleepTerm                     {}
    611     | StallTerm                     {}
    612     | SwitchTerm                    {}
    613     | UnloadTerm                    {}
    614     | WhileTerm                     {}
    615     ;
    616 
    617 Type2Opcode
    618     : AcquireTerm                   {}
    619     | CondRefOfTerm                 {}
    620     | CopyObjectTerm                {}
    621     | DerefOfTerm                   {}
    622     | ObjectTypeTerm                {}
    623     | RefOfTerm                     {}
    624     | SizeOfTerm                    {}
    625     | StoreTerm                     {}
    626     | EqualsTerm                    {}
    627     | TimerTerm                     {}
    628     | WaitTerm                      {}
    629     | MethodInvocationTerm          {}
    630     ;
    631 
    632 /*
    633  * Type 3/4/5 opcodes
    634  */
    635 Type2IntegerOpcode                  /* "Type3" opcodes */
    636     : Expression                    {$$ = TrSetOpFlags ($1, OP_COMPILE_TIME_CONST);}
    637     | AddTerm                       {}
    638     | AndTerm                       {}
    639     | DecTerm                       {}
    640     | DivideTerm                    {}
    641     | FindSetLeftBitTerm            {}
    642     | FindSetRightBitTerm           {}
    643     | FromBCDTerm                   {}
    644     | IncTerm                       {}
    645     | IndexTerm                     {}
    646 /*    | StructureIndexTerm            {} */
    647 /*    | StructurePointerTerm          {} */
    648     | LAndTerm                      {}
    649     | LEqualTerm                    {}
    650     | LGreaterTerm                  {}
    651     | LGreaterEqualTerm             {}
    652     | LLessTerm                     {}
    653     | LLessEqualTerm                {}
    654     | LNotTerm                      {}
    655     | LNotEqualTerm                 {}
    656     | LoadTableTerm                 {}
    657     | LOrTerm                       {}
    658     | MatchTerm                     {}
    659     | ModTerm                       {}
    660     | MultiplyTerm                  {}
    661     | NAndTerm                      {}
    662     | NOrTerm                       {}
    663     | NotTerm                       {}
    664     | OrTerm                        {}
    665     | ShiftLeftTerm                 {}
    666     | ShiftRightTerm                {}
    667     | SubtractTerm                  {}
    668     | ToBCDTerm                     {}
    669     | ToIntegerTerm                 {}
    670     | XOrTerm                       {}
    671     ;
    672 
    673 Type2StringOpcode                   /* "Type4" Opcodes */
    674     : ToDecimalStringTerm           {}
    675     | ToHexStringTerm               {}
    676     | ToStringTerm                  {}
    677     ;
    678 
    679 Type2BufferOpcode                   /* "Type5" Opcodes */
    680     : ToBufferTerm                  {}
    681     | ConcatResTerm                 {}
    682     ;
    683 
    684 Type2BufferOrStringOpcode
    685     : ConcatTerm                    {$$ = TrSetOpFlags ($1, OP_COMPILE_TIME_CONST);}
    686     | PrintfTerm                    {}
    687     | FprintfTerm                   {}
    688     | MidTerm                       {}
    689     ;
    690 
    691 /*
    692  * A type 3 opcode evaluates to an Integer and cannot have a destination operand
    693  */
    694 Type3Opcode
    695     : EISAIDTerm                    {}
    696     ;
    697 
    698 /* Obsolete
    699 Type4Opcode
    700     : ConcatTerm                    {}
    701     | ToDecimalStringTerm           {}
    702     | ToHexStringTerm               {}
    703     | MidTerm                       {}
    704     | ToStringTerm                  {}
    705     ;
    706 */
    707 
    708 /* Type 5 opcodes are a subset of Type2 opcodes, and return a constant */
    709 
    710 Type5Opcode
    711     : ResourceTemplateTerm          {}
    712     | UnicodeTerm                   {}
    713     | ToPLDTerm                     {}
    714     | ToUUIDTerm                    {}
    715     ;
    716 
    717 Type6Opcode
    718     : RefOfTerm                     {}
    719     | DerefOfTerm                   {}
    720     | IndexTerm                     {}
    721     | IndexExpTerm                  {}
    722 /*    | StructureIndexTerm            {} */
    723 /*    | StructurePointerTerm          {} */
    724     | MethodInvocationTerm          {}
    725     ;
    726 
    727 
    728 /*******************************************************************************
    729  *
    730  * ASL Helper Terms
    731  *
    732  ******************************************************************************/
    733 
    734 AmlPackageLengthTerm
    735     : Integer                       {$$ = TrSetOpIntegerValue (PARSEOP_PACKAGE_LENGTH,
    736                                         (ACPI_PARSE_OBJECT *) $1);}
    737     ;
    738 
    739 NameStringItem
    740     : ',' NameString                {$$ = $2;}
    741     | ',' error                     {$$ = AslDoError (); yyclearin;}
    742     ;
    743 
    744 TermArgItem
    745     : ',' TermArg                   {$$ = $2;}
    746     | ',' error                     {$$ = AslDoError (); yyclearin;}
    747     ;
    748 
    749 OptionalReference
    750     :                               {$$ = TrCreateLeafOp (PARSEOP_ZERO);}       /* Placeholder is a ZeroOp object */
    751     | ','                           {$$ = TrCreateLeafOp (PARSEOP_ZERO);}       /* Placeholder is a ZeroOp object */
    752     | ',' TermArg                   {$$ = $2;}
    753     ;
    754 
    755 OptionalReturnArg
    756     :                               {$$ = TrSetOpFlags (TrCreateLeafOp (PARSEOP_ZERO),
    757                                             OP_IS_NULL_RETURN);}       /* Placeholder is a ZeroOp object */
    758     | TermArg                       {$$ = $1;}
    759     ;
    760 
    761 OptionalSerializeRuleKeyword
    762     :                               {$$ = NULL;}
    763     | ','                           {$$ = NULL;}
    764     | ',' SerializeRuleKeyword      {$$ = $2;}
    765     ;
    766 
    767 OptionalTermArg
    768     :                               {$$ = TrCreateLeafOp (PARSEOP_DEFAULT_ARG);}
    769     | TermArg                       {$$ = $1;}
    770     ;
    771 
    772 OptionalWordConst
    773     :                               {$$ = NULL;}
    774     | WordConst                     {$$ = $1;}
    775     ;
    776