Update Makefile to make it compile with recent pilex
[c_to_python.git] / ansi_c.y
1 %token  IDENTIFIER I_CONSTANT F_CONSTANT STRING_LITERAL FUNC_NAME SIZEOF
2 %token  PTR_OP INC_OP DEC_OP LEFT_OP RIGHT_OP LE_OP GE_OP EQ_OP NE_OP
3 %token  AND_OP OR_OP MUL_ASSIGN DIV_ASSIGN MOD_ASSIGN ADD_ASSIGN
4 %token  SUB_ASSIGN LEFT_ASSIGN RIGHT_ASSIGN AND_ASSIGN
5 %token  XOR_ASSIGN OR_ASSIGN
6 %token  TYPEDEF_NAME ENUMERATION_CONSTANT
7
8 %token  TYPEDEF EXTERN STATIC AUTO REGISTER INLINE
9 %token  CONST RESTRICT VOLATILE
10 %token  BOOL CHAR SHORT INT LONG SIGNED UNSIGNED FLOAT DOUBLE VOID
11 %token  COMPLEX IMAGINARY 
12 %token  STRUCT UNION ENUM ELLIPSIS
13
14 %token  CASE DEFAULT IF ELSE SWITCH WHILE DO FOR GOTO CONTINUE BREAK RETURN
15
16 %token  ALIGNAS ALIGNOF ATOMIC GENERIC NORETURN STATIC_ASSERT THREAD_LOCAL
17
18 %start translation_unit_opt
19
20 %expect 2
21
22 %{
23   import t_def
24 %}
25
26 %%
27
28 primary_expression
29         : (?E{t_def.AST.ExpressionIdentifier}IDENTIFIER)
30         | constant
31         | string
32         | '(' expression ')'
33         | generic_selection
34         ;
35
36 constant
37         : I_CONSTANT
38         | F_CONSTANT
39         | ENUMERATION_CONSTANT
40         ;
41
42 enumeration_constant
43         : IDENTIFIER
44         ;
45
46 string
47         : STRING_LITERAL
48         | (?E{t_def.AST.ExpressionFunctionName}FUNC_NAME)
49         ;
50
51 generic_selection
52         : (?E{t_def.AST.GenericSelection}GENERIC '(' assignment_expression ',' (?E{t_def.AST.GenericAssociationList}generic_association_list) ')')
53         ;
54
55 generic_association_list
56         : generic_association
57         | generic_association_list ',' generic_association
58         ;
59
60 generic_association
61         : (?E{t_def.AST.GenericAssociation}type_name_or_default ':' assignment_expression)
62         ;
63
64 type_name_or_default
65         : type_name
66         | (?E{t_def.AST.DefaultTypeName}DEFAULT)
67         ;
68
69 postfix_expression
70         : primary_expression
71         | (?E{t_def.AST.ExpressionIndex}postfix_expression '[' expression ']')
72         | (?E{t_def.AST.ExpressionCall}postfix_expression '(' (?E{t_def.AST.ArgumentExpressionList}argument_expression_list_opt) ')')
73         | (?E{t_def.AST.ExpressionField}postfix_expression '.' IDENTIFIER)
74         | (?E{t_def.AST.ExpressionFieldDereference}postfix_expression PTR_OP IDENTIFIER)
75         | (?E{t_def.AST.ExpressionPostIncrement, unary_operator = '++', postfix = True}postfix_expression INC_OP)
76         | (?E{t_def.AST.ExpressionPostDecrement, unary_operator = '--', postfix = True}postfix_expression DEC_OP)
77         | (?E{t_def.AST.ExpressionArray}'(' type_name ')' '{' (?E{t_def.AST.DesignatorInitializerList}designator_initializer_list_comma_opt) '}')
78         ;
79
80 argument_expression_list_opt
81         :
82         | argument_expression_list
83         ;
84
85 argument_expression_list
86         : assignment_expression
87         | argument_expression_list ',' assignment_expression
88         ;
89
90 unary_expression
91         : postfix_expression
92         | (?E{t_def.AST.ExpressionPreIncrement, unary_operator = '++'}INC_OP unary_expression)
93         | (?E{t_def.AST.ExpressionPreDecrement, unary_operator = '--'}DEC_OP unary_expression)
94         | (?E{t_def.AST.ExpressionAddressOf, unary_operator = '&'}'&' cast_expression)
95         | (?E{t_def.AST.ExpressionDereference, unary_operator = '*'}'*' cast_expression)
96         | (?E{t_def.AST.ExpressionPlus, unary_operator = '+'}'+' cast_expression)
97         | (?E{t_def.AST.ExpressionMinus, unary_operator = '-'}'-' cast_expression)
98         | (?E{t_def.AST.ExpressionBitwiseNot, unary_operator = '~'}'~' cast_expression)
99         | (?E{t_def.AST.ExpressionLogicalNot, unary_operator = 'not '}'!' cast_expression)
100         | (?E{t_def.AST.ExpressionSizeOfExpression, unary_operator = 'sizeof '}SIZEOF unary_expression)
101         | (?E{t_def.AST.ExpressionSizeOfType}SIZEOF '(' type_name ')')
102         | (?E{t_def.AST.ExpressionAlignOfType}ALIGNOF '(' type_name ')')
103         ;
104
105 cast_expression
106         : unary_expression
107         | (?E{t_def.AST.ExpressionCast}'(' type_name ')' cast_expression)
108         ;
109
110 multiplicative_expression
111         : cast_expression
112         | (?E{t_def.AST.ExpressionMultiply, binary_operator = ' * ', precedence = 12}multiplicative_expression '*' cast_expression)
113         | (?E{t_def.AST.ExpressionDivide, binary_operator = ' / ', precedence = 12}multiplicative_expression '/' cast_expression)
114         | (?E{t_def.AST.ExpressionModulo, binary_operator = ' % ', precedence = 12}multiplicative_expression '%' cast_expression)
115         ;
116
117 additive_expression
118         : multiplicative_expression
119         | (?E{t_def.AST.ExpressionAdd, binary_operator = ' + ', precedence = 11}additive_expression '+' multiplicative_expression)
120         | (?E{t_def.AST.ExpressionSubtract, binary_operator = ' - ', precedence = 11}additive_expression '-' multiplicative_expression)
121         ;
122
123 shift_expression
124         : additive_expression
125         | (?E{t_def.AST.ExpressionShiftLeft, binary_operator = ' << ', precedence = 10}shift_expression LEFT_OP additive_expression)
126         | (?E{t_def.AST.ExpressionShiftRight, binary_operator = ' >> ', precedence = 10}shift_expression RIGHT_OP additive_expression)
127         ;
128
129 relational_expression
130         : shift_expression
131         | (?E{t_def.AST.ExpressionLessThan, binary_operator = ' < ', precedence = 9}relational_expression '<' shift_expression)
132         | (?E{t_def.AST.ExpressionGreaterThan, binary_operator = ' > ', precedence = 9}relational_expression '>' shift_expression)
133         | (?E{t_def.AST.ExpressionLessThanOrEqual, binary_operator = ' <= ', precedence = 9}relational_expression LE_OP shift_expression)
134         | (?E{t_def.AST.ExpressionGreaterThanOrEqual, binary_operator = ' >= ', precedence = 9}relational_expression GE_OP shift_expression)
135         ;
136
137 equality_expression
138         : relational_expression
139         | (?E{t_def.AST.ExpressionEqual, binary_operator = ' == ', precedence = 8}equality_expression EQ_OP relational_expression)
140         | (?E{t_def.AST.ExpressionNotEqual, binary_operator = ' != ', precedence = 8}equality_expression NE_OP relational_expression)
141         ;
142
143 and_expression
144         : equality_expression
145         | (?E{t_def.AST.ExpressionBitwiseAnd, binary_operator = ' & ', precedence = 7}and_expression '&' equality_expression)
146         ;
147
148 exclusive_or_expression
149         : and_expression
150         | (?E{t_def.AST.ExpressionExclusiveOr, binary_operator = ' ^ ', precedence = 6}exclusive_or_expression '^' and_expression)
151         ;
152
153 inclusive_or_expression
154         : exclusive_or_expression
155         | (?E{t_def.AST.ExpressionBitwiseOr, binary_operator = ' | ', precedence = 5}inclusive_or_expression '|' exclusive_or_expression)
156         ;
157
158 logical_and_expression
159         : inclusive_or_expression
160         | (?E{t_def.AST.ExpressionLogicalAnd, binary_operator = ' and ', precedence = 4}logical_and_expression AND_OP inclusive_or_expression)
161         ;
162
163 logical_or_expression
164         : logical_and_expression
165         | (?E{t_def.AST.ExpressionLogicalOr, binary_operator = ' or ', precedence = 3}logical_or_expression OR_OP logical_and_expression)
166         ;
167
168 conditional_expression
169         : logical_or_expression
170         | (?E{t_def.AST.ExpressionConditional}logical_or_expression '?' expression ':' conditional_expression)
171         ;
172
173 assignment_expression_or_asterisk_opt
174         : (?E{t_def.AST.ExpressionEmpty})
175         | (?E{t_def.AST.ExpressionAsterisk}'*')
176         | assignment_expression
177         ;
178
179 assignment_expression
180         : conditional_expression
181         | (?E{t_def.AST.ExpressionAssignment, binary_operator = ' = ', precedence = 1, right_to_left = True}unary_expression '=' assignment_expression)
182         | (?E{t_def.AST.ExpressionMultiplyAssignment, binary_operator = ' *= ', precedence = 1, right_to_left = True}unary_expression MUL_ASSIGN assignment_expression)
183         | (?E{t_def.AST.ExpressionDivideAssignment, binary_operator = ' /= ', precedence = 1, right_to_left = True}unary_expression DIV_ASSIGN assignment_expression)
184         | (?E{t_def.AST.ExpressionModuloAssignment, binary_operator = ' %= ', precedence = 1, right_to_left = True}unary_expression MOD_ASSIGN assignment_expression)
185         | (?E{t_def.AST.ExpressionAddAssignment, binary_operator = ' += ', precedence = 1, right_to_left = True}unary_expression ADD_ASSIGN assignment_expression)
186         | (?E{t_def.AST.ExpressionSubtractAssignment, binary_operator = ' -= ', precedence = 1, right_to_left = True}unary_expression SUB_ASSIGN assignment_expression)
187         | (?E{t_def.AST.ExpressionLeftShiftAssignment, binary_operator = ' <<= ', precedence = 1, right_to_left = True}unary_expression LEFT_ASSIGN assignment_expression)
188         | (?E{t_def.AST.ExpressionRightShiftAssignment, binary_operator = ' >>= ', precedence = 1, right_to_left = True}unary_expression RIGHT_ASSIGN assignment_expression)
189         | (?E{t_def.AST.ExpressionBitwiseAndAssignment, binary_operator = ' &= ', precedence = 1, right_to_left = True}unary_expression AND_ASSIGN assignment_expression)
190         | (?E{t_def.AST.ExpressionExclusiveOrAssignment, binary_operator = ' ^= ', precedence = 1, right_to_left = True}unary_expression XOR_ASSIGN assignment_expression)
191         | (?E{t_def.AST.ExpressionBitwiseOrAssignment, binary_operator = ' |= ', precedence = 1, right_to_left = True}unary_expression OR_ASSIGN assignment_expression)
192         ;
193
194 expression_opt
195         : (?E{t_def.AST.ExpressionEmpty})
196         | expression
197         ;
198
199 expression
200         : assignment_expression
201         | (?E{t_def.AST.ExpressionComma, binary_operator = ', ', precedence = 0}expression ',' assignment_expression)
202         ;
203
204 equals_constant_expression_opt
205         : (?E{t_def.AST.ExpressionEmpty})
206         | '=' constant_expression
207         ;
208
209 constant_expression
210         : conditional_expression
211         ;
212
213 declaration
214         : (?E{t_def.AST.Declaration}(?E{t_def.AST.DeclarationSpecifierList}declaration_specifier_list) (?E{t_def.AST.InitDeclaratorList}init_declarator_list_opt) ';')
215         | static_assert_declaration
216         ;
217
218 declaration_specifier_list
219         : declaration_specifier
220         | declaration_specifier_list declaration_specifier
221         ;
222
223 declaration_specifier
224         : storage_class_specifier
225         | type_specifier
226         | type_qualifier
227         | function_specifier
228         | alignment_specifier
229         ;
230
231 init_declarator_list_opt
232         :
233         | init_declarator_list
234         ;
235
236 init_declarator_list
237         : init_declarator
238         | init_declarator_list ',' init_declarator
239         ;
240
241 init_declarator
242         : (?E{t_def.AST.InitDeclarator}declarator equals_initializer_opt)
243         ;
244
245 storage_class_specifier
246         : (?E{t_def.AST.StorageClassSpecifier, n = 0}TYPEDEF)
247         | (?E{t_def.AST.StorageClassSpecifier, n = 1}EXTERN)
248         | (?E{t_def.AST.StorageClassSpecifier, n = 2}STATIC)
249         | (?E{t_def.AST.StorageClassSpecifier, n = 3}THREAD_LOCAL)
250         | (?E{t_def.AST.StorageClassSpecifier, n = 4}AUTO)
251         | (?E{t_def.AST.StorageClassSpecifier, n = 5}REGISTER)
252         ;
253
254 type_specifier
255         : (?E{t_def.AST.TypeSpecifier, n = 0}VOID)
256         | (?E{t_def.AST.TypeSpecifier, n = 1}CHAR)
257         | (?E{t_def.AST.TypeSpecifier, n = 2}SHORT)
258         | (?E{t_def.AST.TypeSpecifier, n = 3}INT)
259         | (?E{t_def.AST.TypeSpecifier, n = 4}LONG)
260         | (?E{t_def.AST.TypeSpecifier, n = 5}FLOAT)
261         | (?E{t_def.AST.TypeSpecifier, n = 6}DOUBLE)
262         | (?E{t_def.AST.TypeSpecifier, n = 7}SIGNED)
263         | (?E{t_def.AST.TypeSpecifier, n = 8}UNSIGNED)
264         | (?E{t_def.AST.TypeSpecifier, n = 9}BOOL)
265         | (?E{t_def.AST.TypeSpecifier, n = 10}COMPLEX)
266         | (?E{t_def.AST.TypeSpecifier, n = 11}IMAGINARY)
267         | atomic_type_specifier
268         | struct_specifier
269         | union_specifier
270         | enum_specifier
271         | TYPEDEF_NAME
272         ;
273
274 struct_specifier
275         : (?E{t_def.AST.StructSpecifier}STRUCT identifier_opt '{' (?E{t_def.AST.StructDeclarationList}struct_declaration_list_opt) '}')
276         | (?E{t_def.AST.StructSpecifier}STRUCT IDENTIFIER)
277         ;
278
279 union_specifier
280         : (?E{t_def.AST.UnionSpecifier}UNION identifier_opt '{' (?E{t_def.AST.StructDeclarationList}struct_declaration_list_opt) '}')
281         | (?E{t_def.AST.UnionSpecifier}UNION IDENTIFIER)
282         ;
283
284 struct_declaration_list_opt
285         :
286         | struct_declaration_list
287         ;
288
289 struct_declaration_list
290         : struct_declaration
291         | struct_declaration_list struct_declaration
292         ;
293
294 struct_declaration
295         : (?E{t_def.AST.StructDeclaration}(?E{t_def.AST.SpecifierQualifierList}specifier_qualifier_list) (?E{t_def.AST.StructDeclaratorList}struct_declarator_list_opt) ';')
296         | static_assert_declaration
297         ;
298
299 specifier_qualifier_list
300         : specifier_qualifier
301         | specifier_qualifier_list specifier_qualifier
302         ;
303
304 specifier_qualifier
305         : type_specifier
306         | type_qualifier
307         ;
308
309 struct_declarator_list_opt
310         :
311         | struct_declarator_list
312         ;
313
314 struct_declarator_list
315         : struct_declarator
316         | struct_declarator_list ',' struct_declarator
317         ;
318
319 struct_declarator
320         : (?E{t_def.AST.StructDeclarator}declarator_opt ':' constant_expression)
321         | declarator
322         ;
323
324 enum_specifier
325         : (?E{t_def.AST.EnumSpecifier}ENUM identifier_opt '{' (?E{t_def.AST.EnumeratorList}enumerator_list_comma_opt) '}')
326         | (?E{t_def.AST.EnumSpecifier}ENUM IDENTIFIER)
327         ;
328
329 enumerator_list_comma_opt
330         :
331         | enumerator_list
332         | enumerator_list ','
333         ;
334
335 enumerator_list
336         : enumerator
337         | enumerator_list ',' enumerator
338         ;
339
340 enumerator
341         : (?E{t_def.AST.Enumerator}enumeration_constant equals_constant_expression_opt)
342         ;
343
344 atomic_type_specifier
345         : ATOMIC '(' type_name ')'
346         ;
347
348 type_qualifier_or_static_list_opt
349         :
350         | type_qualifier_or_static_list
351         ;
352
353 type_qualifier_or_static_list
354         : type_qualifier_or_static
355         | type_qualifier_or_static_list type_qualifier_or_static
356         ;
357
358 type_qualifier_or_static
359         : type_qualifier
360         | (?E{t_def.AST.StorageClassSpecifier, n = 2}STATIC)
361         ;
362
363 type_qualifier
364         : (?E{t_def.AST.TypeQualifier, n = 0}CONST)
365         | (?E{t_def.AST.TypeQualifier, n = 1}RESTRICT)
366         | (?E{t_def.AST.TypeQualifier, n = 2}VOLATILE)
367         | (?E{t_def.AST.TypeQualifier, n = 3}ATOMIC)
368         ;
369
370 function_specifier
371         : (?E{t_def.AST.FunctionSpecifier, n = 0}INLINE)
372         | (?E{t_def.AST.FunctionSpecifier, n = 1}NORETURN)
373         ;
374
375 alignment_specifier
376         : (?E{t_def.AST.AlignAsType}ALIGNAS '(' type_name ')')
377         | (?E{t_def.AST.AlignAsExpression}ALIGNAS '(' constant_expression ')')
378         ;
379
380 declarator_opt
381         : (?E{t_def.AST.DeclaratorEmpty})
382         | declarator
383         ;
384
385 declarator
386         : direct_declarator
387         | (?E{t_def.AST.DeclaratorPointer}'*' (?E{t_def.AST.TypeQualifierList}type_qualifier_list_opt) declarator)
388         ;
389
390 direct_declarator
391         : (?E{t_def.AST.DeclaratorIdentifier}IDENTIFIER)
392         | '(' declarator ')'
393         | (?E{t_def.AST.DeclaratorArray}direct_declarator '[' (?E{t_def.AST.TypeQualifierOrStaticList}type_qualifier_or_static_list_opt) assignment_expression_or_asterisk_opt ']')
394         | (?E{t_def.AST.DeclaratorFunctionOldStyle}direct_declarator '(' (?E{t_def.AST.IdentifierList}identifier_list_opt) ')')
395         | (?E{t_def.AST.DeclaratorFunction, varargs = False}direct_declarator '(' (?E{t_def.AST.ParameterDeclarationList}parameter_declaration_list) ')')
396         | (?E{t_def.AST.DeclaratorFunction, varargs = True}direct_declarator '(' (?E{t_def.AST.ParameterDeclarationList}parameter_declaration_list) ',' ELLIPSIS ')')
397         ;
398
399 type_qualifier_list_opt
400         :
401         | type_qualifier_list
402         ;
403
404 type_qualifier_list
405         : type_qualifier
406         | type_qualifier_list type_qualifier
407         ;
408
409 parameter_declaration_list
410         : parameter_declaration
411         | parameter_declaration_list ',' parameter_declaration
412         ;
413
414 parameter_declaration
415         : (?E{t_def.AST.ParameterDeclaration}(?E{t_def.AST.DeclarationSpecifierList}declaration_specifier_list) declarator)
416         | (?E{t_def.AST.ParameterDeclaration}(?E{t_def.AST.DeclarationSpecifierList}declaration_specifier_list) abstract_declarator)
417         ;
418
419 identifier_list_opt
420         :
421         | identifier_list
422         ;
423
424 identifier_list
425         : IDENTIFIER
426         | identifier_list ',' IDENTIFIER
427         ;
428
429 type_name
430         : (?E{t_def.AST.TypeName}(?E{t_def.AST.SpecifierQualifierList}specifier_qualifier_list) abstract_declarator)
431         ;
432
433 abstract_declarator
434         : direct_abstract_declarator_opt
435         | (?E{t_def.AST.DeclaratorPointer}'*' (?E{t_def.AST.TypeQualifierList}type_qualifier_list_opt) abstract_declarator)
436         ;
437
438 direct_abstract_declarator_opt
439         : (?E{t_def.AST.DeclaratorAbstract})
440         | direct_abstract_declarator
441         ;
442
443 /* in the below, ") (" should be ")(", inserted space for now */
444 direct_abstract_declarator
445         : '(' direct_abstract_declarator ')'
446         | '(' (?E{t_def.AST.DeclaratorPointer}'*' (?E{t_def.AST.TypeQualifierList}type_qualifier_list_opt) abstract_declarator) ')'
447         | (?E{t_def.AST.DeclaratorArray}(?E{t_def.AST.DeclaratorAbstract})'[' (?E{t_def.AST.TypeQualifierOrStaticList}type_qualifier_or_static_list_opt) assignment_expression_or_asterisk_opt ']')
448         | (?E{t_def.AST.DeclaratorFunction, varargs = False}(?E{t_def.AST.DeclaratorAbstract})'('(?E{t_def.AST.ParameterDeclarationList}) ')')
449         | (?E{t_def.AST.DeclaratorFunction, varargs = False}(?E{t_def.AST.DeclaratorAbstract})'(' (?E{t_def.AST.ParameterDeclarationList}parameter_declaration_list) ')')
450         | (?E{t_def.AST.DeclaratorFunction, varargs = True}(?E{t_def.AST.DeclaratorAbstract})'(' (?E{t_def.AST.ParameterDeclarationList}parameter_declaration_list) ',' ELLIPSIS ')')
451         | (?E{t_def.AST.DeclaratorArray}direct_abstract_declarator '[' (?E{t_def.AST.TypeQualifierOrStaticList}type_qualifier_or_static_list_opt) assignment_expression_or_asterisk_opt ']')
452         | (?E{t_def.AST.DeclaratorFunction, varargs = False}direct_abstract_declarator '('(?E{t_def.AST.ParameterDeclarationList}) ')')
453         | (?E{t_def.AST.DeclaratorFunction, varargs = False}direct_abstract_declarator '(' (?E{t_def.AST.ParameterDeclarationList}parameter_declaration_list) ')')
454         | (?E{t_def.AST.DeclaratorFunction, varargs = True}direct_abstract_declarator '(' (?E{t_def.AST.ParameterDeclarationList}parameter_declaration_list) ',' ELLIPSIS ')')
455         ;
456
457 equals_initializer_opt
458         : (?E{t_def.AST.EqualsInitializerEmpty})
459         | '=' initializer
460         ;
461
462 initializer
463         : '{' (?E{t_def.AST.DesignatorInitializerList}designator_initializer_list_comma_opt) '}'
464         | assignment_expression
465         ;
466
467 designator_initializer_list_comma_opt
468         :
469         | designator_initializer_list
470         | designator_initializer_list ','
471         ;
472
473 designator_initializer_list
474         : designator_initializer
475         | designator_initializer_list ',' designator_initializer
476         ;
477
478 designator_initializer
479         : (?E{t_def.AST.DesignatorInitializer}designator_list_equals_opt initializer)
480         ;
481
482 designator_list_equals_opt
483         : (?E{t_def.AST.DesignatorListEqualsEmpty})
484         | (?E{t_def.AST.DesignatorList}designator_list) '='
485         ;
486
487 designator_list
488         : designator
489         | designator_list designator
490         ;
491
492 designator
493         : (?E{t_def.AST.DesignatorIndex}'[' constant_expression ']')
494         | (?E{t_def.AST.DesignatorField}'.' IDENTIFIER)
495         ;
496
497 static_assert_declaration
498         : (?E{t_def.AST.StaticAssertDeclaration}STATIC_ASSERT '(' constant_expression ',' STRING_LITERAL ')' ';')
499         ;
500
501 statement
502         : (?E{t_def.AST.StatementLabel}IDENTIFIER ':' statement)
503         | (?E{t_def.AST.StatementCase}CASE constant_expression ':' statement)
504         | (?E{t_def.AST.StatementDefault}DEFAULT ':' statement)
505         | (?E{t_def.AST.StatementBlock}'{' (?E{t_def.AST.BlockItemList}block_item_list_opt) '}')
506         | (?E{t_def.AST.StatementExpression}expression_opt ';')
507         | (?E{t_def.AST.StatementIfElse}IF '(' expression ')' statement ELSE statement)
508         | (?E{t_def.AST.StatementIf}IF '(' expression ')' statement)
509         | (?E{t_def.AST.StatementSwitch}SWITCH '(' expression ')' statement)
510         | (?E{t_def.AST.StatementWhile}WHILE '(' expression ')' statement)
511         | (?E{t_def.AST.StatementDoWhile}DO statement WHILE '(' expression ')' ';')
512         | (?E{t_def.AST.StatementFor}FOR '(' (?E{t_def.AST.StatementExpression}expression_opt) ';' expression_opt ';' expression_opt ')' statement)
513         | (?E{t_def.AST.StatementFor}FOR '(' declaration expression_opt ';' expression_opt ')' statement)
514         | (?E{t_def.AST.StatementGoto}GOTO IDENTIFIER ';')
515         | (?E{t_def.AST.StatementContinue}CONTINUE ';')
516         | (?E{t_def.AST.StatementBreak}BREAK ';')
517         | (?E{t_def.AST.StatementReturn}RETURN expression_opt ';')
518         ;
519
520 block_item_list_opt
521         :
522         | block_item_list
523         ;
524
525 block_item_list
526         : block_item
527         | block_item_list block_item
528         ;
529
530 block_item
531         : declaration
532         | statement
533         ;
534
535 translation_unit_opt
536         :
537         | translation_unit
538         ;
539
540 translation_unit
541         : external_declaration
542         | translation_unit external_declaration
543         ;
544
545 external_declaration
546         : function_definition
547         | declaration
548         ;
549
550 function_definition
551         : (?E{t_def.AST.FunctionDefinition}(?E{t_def.AST.DeclarationSpecifierList}declaration_specifier_list) declarator (?E{t_def.AST.DeclarationList}declaration_list_opt) '{' (?E{t_def.AST.BlockItemList}block_item_list_opt) '}')
552         ;
553
554 declaration_list_opt
555         :
556         | declaration_list
557         ;
558
559 declaration_list
560         : declaration
561         | declaration_list declaration
562         ;
563
564 identifier_opt
565         : (?E{t_def.AST.IdentifierEmpty})
566         | IDENTIFIER
567         ;