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