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
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
14 %token CASE DEFAULT IF ELSE SWITCH WHILE DO FOR GOTO CONTINUE BREAK RETURN
16 %token ALIGNAS ALIGNOF ATOMIC GENERIC NORETURN STATIC_ASSERT THREAD_LOCAL
18 %start translation_unit_opt
29 : (?E{ast.AST.ExpressionIdentifier}IDENTIFIER)
39 | ENUMERATION_CONSTANT
48 | (?E{ast.AST.ExpressionFunctionName}FUNC_NAME)
52 : (?E{ast.AST.GenericSelection}GENERIC '(' assignment_expression ',' (?E{ast.AST.GenericAssociationList}generic_association_list) ')')
55 generic_association_list
57 | generic_association_list ',' generic_association
61 : (?E{ast.AST.GenericAssociation}type_name_or_default ':' assignment_expression)
66 | (?E{ast.AST.DefaultTypeName}DEFAULT)
71 | (?E{ast.AST.ExpressionIndex}postfix_expression '[' expression ']')
72 | (?E{ast.AST.ExpressionCall}postfix_expression '(' (?E{ast.AST.ArgumentExpressionList}argument_expression_list_opt) ')')
73 | (?E{ast.AST.ExpressionField}postfix_expression '.' IDENTIFIER)
74 | (?E{ast.AST.ExpressionFieldDereference}postfix_expression PTR_OP IDENTIFIER)
75 | (?E{ast.AST.ExpressionPostIncrement, unary_operator = '++', postfix = True}postfix_expression INC_OP)
76 | (?E{ast.AST.ExpressionPostDecrement, unary_operator = '--', postfix = True}postfix_expression DEC_OP)
77 | (?E{ast.AST.ExpressionArray}'(' type_name ')' '{' (?E{ast.AST.DesignatorInitializerList}designator_initializer_list_comma_opt) '}')
80 argument_expression_list_opt
82 | argument_expression_list
85 argument_expression_list
86 : assignment_expression
87 | argument_expression_list ',' assignment_expression
92 | (?E{ast.AST.ExpressionPreIncrement, unary_operator = '++'}INC_OP unary_expression)
93 | (?E{ast.AST.ExpressionPreDecrement, unary_operator = '--'}DEC_OP unary_expression)
94 | (?E{ast.AST.ExpressionAddressOf, unary_operator = '&'}'&' cast_expression)
95 | (?E{ast.AST.ExpressionDereference, unary_operator = '*'}'*' cast_expression)
96 | (?E{ast.AST.ExpressionPlus, unary_operator = '+'}'+' cast_expression)
97 | (?E{ast.AST.ExpressionMinus, unary_operator = '-'}'-' cast_expression)
98 | (?E{ast.AST.ExpressionBitwiseNot, unary_operator = '~'}'~' cast_expression)
99 | (?E{ast.AST.ExpressionLogicalNot, unary_operator = 'not '}'!' cast_expression)
100 | (?E{ast.AST.ExpressionSizeOfExpression, unary_operator = 'sizeof '}SIZEOF unary_expression)
101 | (?E{ast.AST.ExpressionSizeOfType}SIZEOF '(' type_name ')')
102 | (?E{ast.AST.ExpressionAlignOfType}ALIGNOF '(' type_name ')')
107 | (?E{ast.AST.ExpressionCast}'(' type_name ')' cast_expression)
110 multiplicative_expression
112 | (?E{ast.AST.ExpressionMultiply, binary_operator = ' * ', precedence = 12}multiplicative_expression '*' cast_expression)
113 | (?E{ast.AST.ExpressionDivide, binary_operator = ' / ', precedence = 12}multiplicative_expression '/' cast_expression)
114 | (?E{ast.AST.ExpressionModulo, binary_operator = ' % ', precedence = 12}multiplicative_expression '%' cast_expression)
118 : multiplicative_expression
119 | (?E{ast.AST.ExpressionAdd, binary_operator = ' + ', precedence = 11}additive_expression '+' multiplicative_expression)
120 | (?E{ast.AST.ExpressionSubtract, binary_operator = ' - ', precedence = 11}additive_expression '-' multiplicative_expression)
124 : additive_expression
125 | (?E{ast.AST.ExpressionShiftLeft, binary_operator = ' << ', precedence = 10}shift_expression LEFT_OP additive_expression)
126 | (?E{ast.AST.ExpressionShiftRight, binary_operator = ' >> ', precedence = 10}shift_expression RIGHT_OP additive_expression)
129 relational_expression
131 | (?E{ast.AST.ExpressionLessThan, binary_operator = ' < ', precedence = 9}relational_expression '<' shift_expression)
132 | (?E{ast.AST.ExpressionGreaterThan, binary_operator = ' > ', precedence = 9}relational_expression '>' shift_expression)
133 | (?E{ast.AST.ExpressionLessThanOrEqual, binary_operator = ' <= ', precedence = 9}relational_expression LE_OP shift_expression)
134 | (?E{ast.AST.ExpressionGreaterThanOrEqual, binary_operator = ' >= ', precedence = 9}relational_expression GE_OP shift_expression)
138 : relational_expression
139 | (?E{ast.AST.ExpressionEqual, binary_operator = ' == ', precedence = 8}equality_expression EQ_OP relational_expression)
140 | (?E{ast.AST.ExpressionNotEqual, binary_operator = ' != ', precedence = 8}equality_expression NE_OP relational_expression)
144 : equality_expression
145 | (?E{ast.AST.ExpressionBitwiseAnd, binary_operator = ' & ', precedence = 7}and_expression '&' equality_expression)
148 exclusive_or_expression
150 | (?E{ast.AST.ExpressionExclusiveOr, binary_operator = ' ^ ', precedence = 6}exclusive_or_expression '^' and_expression)
153 inclusive_or_expression
154 : exclusive_or_expression
155 | (?E{ast.AST.ExpressionBitwiseOr, binary_operator = ' | ', precedence = 5}inclusive_or_expression '|' exclusive_or_expression)
158 logical_and_expression
159 : inclusive_or_expression
160 | (?E{ast.AST.ExpressionLogicalAnd, binary_operator = ' and ', precedence = 4}logical_and_expression AND_OP inclusive_or_expression)
163 logical_or_expression
164 : logical_and_expression
165 | (?E{ast.AST.ExpressionLogicalOr, binary_operator = ' or ', precedence = 3}logical_or_expression OR_OP logical_and_expression)
168 conditional_expression
169 : logical_or_expression
170 | (?E{ast.AST.ExpressionConditional}logical_or_expression '?' expression ':' conditional_expression)
173 assignment_expression_or_asterisk_opt
174 : (?E{ast.AST.ExpressionEmpty})
175 | (?E{ast.AST.ExpressionAsterisk}'*')
176 | assignment_expression
179 assignment_expression
180 : conditional_expression
181 | (?E{ast.AST.ExpressionAssignment, binary_operator = ' = ', precedence = 1, right_to_left = True}unary_expression '=' assignment_expression)
182 | (?E{ast.AST.ExpressionMultiplyAssignment, binary_operator = ' *= ', precedence = 1, right_to_left = True}unary_expression MUL_ASSIGN assignment_expression)
183 | (?E{ast.AST.ExpressionDivideAssignment, binary_operator = ' /= ', precedence = 1, right_to_left = True}unary_expression DIV_ASSIGN assignment_expression)
184 | (?E{ast.AST.ExpressionModuloAssignment, binary_operator = ' %= ', precedence = 1, right_to_left = True}unary_expression MOD_ASSIGN assignment_expression)
185 | (?E{ast.AST.ExpressionAddAssignment, binary_operator = ' += ', precedence = 1, right_to_left = True}unary_expression ADD_ASSIGN assignment_expression)
186 | (?E{ast.AST.ExpressionSubtractAssignment, binary_operator = ' -= ', precedence = 1, right_to_left = True}unary_expression SUB_ASSIGN assignment_expression)
187 | (?E{ast.AST.ExpressionLeftShiftAssignment, binary_operator = ' <<= ', precedence = 1, right_to_left = True}unary_expression LEFT_ASSIGN assignment_expression)
188 | (?E{ast.AST.ExpressionRightShiftAssignment, binary_operator = ' >>= ', precedence = 1, right_to_left = True}unary_expression RIGHT_ASSIGN assignment_expression)
189 | (?E{ast.AST.ExpressionBitwiseAndAssignment, binary_operator = ' &= ', precedence = 1, right_to_left = True}unary_expression AND_ASSIGN assignment_expression)
190 | (?E{ast.AST.ExpressionExclusiveOrAssignment, binary_operator = ' ^= ', precedence = 1, right_to_left = True}unary_expression XOR_ASSIGN assignment_expression)
191 | (?E{ast.AST.ExpressionBitwiseOrAssignment, binary_operator = ' |= ', precedence = 1, right_to_left = True}unary_expression OR_ASSIGN assignment_expression)
195 : (?E{ast.AST.ExpressionEmpty})
200 : assignment_expression
201 | (?E{ast.AST.ExpressionComma, binary_operator = ', ', precedence = 0}expression ',' assignment_expression)
204 equals_constant_expression_opt
205 : (?E{ast.AST.ExpressionEmpty})
206 | '=' constant_expression
210 : conditional_expression
214 : (?E{ast.AST.Declaration}(?E{ast.AST.DeclarationSpecifierList}declaration_specifier_list) (?E{ast.AST.InitDeclaratorList}init_declarator_list_opt) ';')
215 | static_assert_declaration
218 declaration_specifier_list
219 : declaration_specifier
220 | declaration_specifier_list declaration_specifier
223 declaration_specifier
224 : storage_class_specifier
228 | alignment_specifier
231 init_declarator_list_opt
233 | init_declarator_list
238 | init_declarator_list ',' init_declarator
242 : (?E{ast.AST.InitDeclarator}declarator equals_initializer_opt)
245 storage_class_specifier
246 : (?E{ast.AST.StorageClassSpecifier, n = 0}TYPEDEF)
247 | (?E{ast.AST.StorageClassSpecifier, n = 1}EXTERN)
248 | (?E{ast.AST.StorageClassSpecifier, n = 2}STATIC)
249 | (?E{ast.AST.StorageClassSpecifier, n = 3}THREAD_LOCAL)
250 | (?E{ast.AST.StorageClassSpecifier, n = 4}AUTO)
251 | (?E{ast.AST.StorageClassSpecifier, n = 5}REGISTER)
255 : (?E{ast.AST.TypeSpecifier, n = 0}VOID)
256 | (?E{ast.AST.TypeSpecifier, n = 1}CHAR)
257 | (?E{ast.AST.TypeSpecifier, n = 2}SHORT)
258 | (?E{ast.AST.TypeSpecifier, n = 3}INT)
259 | (?E{ast.AST.TypeSpecifier, n = 4}LONG)
260 | (?E{ast.AST.TypeSpecifier, n = 5}FLOAT)
261 | (?E{ast.AST.TypeSpecifier, n = 6}DOUBLE)
262 | (?E{ast.AST.TypeSpecifier, n = 7}SIGNED)
263 | (?E{ast.AST.TypeSpecifier, n = 8}UNSIGNED)
264 | (?E{ast.AST.TypeSpecifier, n = 9}BOOL)
265 | (?E{ast.AST.TypeSpecifier, n = 10}COMPLEX)
266 | (?E{ast.AST.TypeSpecifier, n = 11}IMAGINARY)
267 | atomic_type_specifier
275 : (?E{ast.AST.StructSpecifier}STRUCT identifier_opt '{' (?E{ast.AST.StructDeclarationList}struct_declaration_list_opt) '}')
276 | (?E{ast.AST.StructSpecifier}STRUCT IDENTIFIER)
280 : (?E{ast.AST.UnionSpecifier}UNION identifier_opt '{' (?E{ast.AST.StructDeclarationList}struct_declaration_list_opt) '}')
281 | (?E{ast.AST.UnionSpecifier}UNION IDENTIFIER)
284 struct_declaration_list_opt
286 | struct_declaration_list
289 struct_declaration_list
291 | struct_declaration_list struct_declaration
295 : (?E{ast.AST.StructDeclaration}(?E{ast.AST.SpecifierQualifierList}specifier_qualifier_list) (?E{ast.AST.StructDeclaratorList}struct_declarator_list_opt) ';')
296 | static_assert_declaration
299 specifier_qualifier_list
300 : specifier_qualifier
301 | specifier_qualifier_list specifier_qualifier
309 struct_declarator_list_opt
311 | struct_declarator_list
314 struct_declarator_list
316 | struct_declarator_list ',' struct_declarator
320 : (?E{ast.AST.StructDeclarator}declarator_opt ':' constant_expression)
325 : (?E{ast.AST.EnumSpecifier}ENUM identifier_opt '{' (?E{ast.AST.EnumeratorList}enumerator_list_comma_opt) '}')
326 | (?E{ast.AST.EnumSpecifier}ENUM IDENTIFIER)
329 enumerator_list_comma_opt
332 | enumerator_list ','
337 | enumerator_list ',' enumerator
341 : (?E{ast.AST.Enumerator}enumeration_constant equals_constant_expression_opt)
344 atomic_type_specifier
345 : ATOMIC '(' type_name ')'
348 type_qualifier_or_static_list_opt
350 | type_qualifier_or_static_list
353 type_qualifier_or_static_list
354 : type_qualifier_or_static
355 | type_qualifier_or_static_list type_qualifier_or_static
358 type_qualifier_or_static
360 | (?E{ast.AST.StorageClassSpecifier, n = 2}STATIC)
364 : (?E{ast.AST.TypeQualifier, n = 0}CONST)
365 | (?E{ast.AST.TypeQualifier, n = 1}RESTRICT)
366 | (?E{ast.AST.TypeQualifier, n = 2}VOLATILE)
367 | (?E{ast.AST.TypeQualifier, n = 3}ATOMIC)
371 : (?E{ast.AST.FunctionSpecifier, n = 0}INLINE)
372 | (?E{ast.AST.FunctionSpecifier, n = 1}NORETURN)
376 : (?E{ast.AST.AlignAsType}ALIGNAS '(' type_name ')')
377 | (?E{ast.AST.AlignAsExpression}ALIGNAS '(' constant_expression ')')
381 : (?E{ast.AST.DeclaratorEmpty})
387 | (?E{ast.AST.DeclaratorPointer}'*' (?E{ast.AST.TypeQualifierList}type_qualifier_list_opt) declarator)
391 : (?E{ast.AST.DeclaratorIdentifier}IDENTIFIER)
393 | (?E{ast.AST.DeclaratorArray}direct_declarator '[' (?E{ast.AST.TypeQualifierOrStaticList}type_qualifier_or_static_list_opt) assignment_expression_or_asterisk_opt ']')
394 | (?E{ast.AST.DeclaratorFunctionOldStyle}direct_declarator '(' (?E{ast.AST.IdentifierList}identifier_list_opt) ')')
395 | (?E{ast.AST.DeclaratorFunction, varargs = False}direct_declarator '(' (?E{ast.AST.ParameterDeclarationList}parameter_declaration_list) ')')
396 | (?E{ast.AST.DeclaratorFunction, varargs = True}direct_declarator '(' (?E{ast.AST.ParameterDeclarationList}parameter_declaration_list) ',' ELLIPSIS ')')
399 type_qualifier_list_opt
401 | type_qualifier_list
406 | type_qualifier_list type_qualifier
409 parameter_declaration_list
410 : parameter_declaration
411 | parameter_declaration_list ',' parameter_declaration
414 parameter_declaration
415 : (?E{ast.AST.ParameterDeclaration}(?E{ast.AST.DeclarationSpecifierList}declaration_specifier_list) declarator)
416 | (?E{ast.AST.ParameterDeclaration}(?E{ast.AST.DeclarationSpecifierList}declaration_specifier_list) abstract_declarator)
426 | identifier_list ',' IDENTIFIER
430 : (?E{ast.AST.TypeName}(?E{ast.AST.SpecifierQualifierList}specifier_qualifier_list) abstract_declarator)
434 : direct_abstract_declarator_opt
435 | (?E{ast.AST.DeclaratorPointer}'*' (?E{ast.AST.TypeQualifierList}type_qualifier_list_opt) abstract_declarator)
438 direct_abstract_declarator_opt
439 : (?E{ast.AST.DeclaratorAbstract})
440 | direct_abstract_declarator
443 /* in the below, ") (" should be ")(", inserted space for now */
444 direct_abstract_declarator
445 : '(' direct_abstract_declarator ')'
446 | '(' (?E{ast.AST.DeclaratorPointer}'*' (?E{ast.AST.TypeQualifierList}type_qualifier_list_opt) abstract_declarator) ')'
447 | (?E{ast.AST.DeclaratorArray}(?E{ast.AST.DeclaratorAbstract})'[' (?E{ast.AST.TypeQualifierOrStaticList}type_qualifier_or_static_list_opt) assignment_expression_or_asterisk_opt ']')
448 | (?E{ast.AST.DeclaratorFunction, varargs = False}(?E{ast.AST.DeclaratorAbstract})'('(?E{ast.AST.ParameterDeclarationList}) ')')
449 | (?E{ast.AST.DeclaratorFunction, varargs = False}(?E{ast.AST.DeclaratorAbstract})'(' (?E{ast.AST.ParameterDeclarationList}parameter_declaration_list) ')')
450 | (?E{ast.AST.DeclaratorFunction, varargs = True}(?E{ast.AST.DeclaratorAbstract})'(' (?E{ast.AST.ParameterDeclarationList}parameter_declaration_list) ',' ELLIPSIS ')')
451 | (?E{ast.AST.DeclaratorArray}direct_abstract_declarator '[' (?E{ast.AST.TypeQualifierOrStaticList}type_qualifier_or_static_list_opt) assignment_expression_or_asterisk_opt ']')
452 | (?E{ast.AST.DeclaratorFunction, varargs = False}direct_abstract_declarator '('(?E{ast.AST.ParameterDeclarationList}) ')')
453 | (?E{ast.AST.DeclaratorFunction, varargs = False}direct_abstract_declarator '(' (?E{ast.AST.ParameterDeclarationList}parameter_declaration_list) ')')
454 | (?E{ast.AST.DeclaratorFunction, varargs = True}direct_abstract_declarator '(' (?E{ast.AST.ParameterDeclarationList}parameter_declaration_list) ',' ELLIPSIS ')')
457 equals_initializer_opt
458 : (?E{ast.AST.EqualsInitializerEmpty})
463 : '{' (?E{ast.AST.DesignatorInitializerList}designator_initializer_list_comma_opt) '}'
464 | assignment_expression
467 designator_initializer_list_comma_opt
469 | designator_initializer_list
470 | designator_initializer_list ','
473 designator_initializer_list
474 : designator_initializer
475 | designator_initializer_list ',' designator_initializer
478 designator_initializer
479 : (?E{ast.AST.DesignatorInitializer}designator_list_equals_opt initializer)
482 designator_list_equals_opt
483 : (?E{ast.AST.DesignatorListEqualsEmpty})
484 | (?E{ast.AST.DesignatorList}designator_list) '='
489 | designator_list designator
493 : (?E{ast.AST.DesignatorIndex}'[' constant_expression ']')
494 | (?E{ast.AST.DesignatorField}'.' IDENTIFIER)
497 static_assert_declaration
498 : (?E{ast.AST.StaticAssertDeclaration}STATIC_ASSERT '(' constant_expression ',' STRING_LITERAL ')' ';')
502 : (?E{ast.AST.StatementLabel}IDENTIFIER ':' statement)
503 | (?E{ast.AST.StatementCase}CASE constant_expression ':' statement)
504 | (?E{ast.AST.StatementDefault}DEFAULT ':' statement)
505 | (?E{ast.AST.StatementBlock}'{' (?E{ast.AST.BlockItemList}block_item_list_opt) '}')
506 | (?E{ast.AST.StatementExpression}expression_opt ';')
507 | (?E{ast.AST.StatementIfElse}IF '(' expression ')' statement ELSE statement)
508 | (?E{ast.AST.StatementIf}IF '(' expression ')' statement)
509 | (?E{ast.AST.StatementSwitch}SWITCH '(' expression ')' statement)
510 | (?E{ast.AST.StatementWhile}WHILE '(' expression ')' statement)
511 | (?E{ast.AST.StatementDoWhile}DO statement WHILE '(' expression ')' ';')
512 | (?E{ast.AST.StatementFor}FOR '(' (?E{ast.AST.StatementExpression}expression_opt) ';' expression_opt ';' expression_opt ')' statement)
513 | (?E{ast.AST.StatementFor}FOR '(' declaration expression_opt ';' expression_opt ')' statement)
514 | (?E{ast.AST.StatementGoto}GOTO IDENTIFIER ';')
515 | (?E{ast.AST.StatementContinue}CONTINUE ';')
516 | (?E{ast.AST.StatementBreak}BREAK ';')
517 | (?E{ast.AST.StatementReturn}RETURN expression_opt ';')
527 | block_item_list block_item
541 : external_declaration
542 | translation_unit external_declaration
546 : function_definition
551 : (?E{ast.AST.FunctionDefinition}(?E{ast.AST.DeclarationSpecifierList}declaration_specifier_list) declarator (?E{ast.AST.DeclarationList}declaration_list_opt) '{' (?E{ast.AST.BlockItemList}block_item_list_opt) '}')
561 | declaration_list declaration
565 : (?E{ast.AST.IdentifierEmpty})