xref: /netbsd-src/sys/external/bsd/acpica/dist/compiler/aslrules.y (revision bdc22b2e01993381dcefeff2bc9b56ca75a4235c)
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 - 2018, 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