ef00cd48928f521ea939965ac1f52ca9047bbf23
[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 ast
24 %}
25
26 %%
27
28 primary_expression
29         : (?E{ast.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{ast.AST.ExpressionFunctionName}FUNC_NAME)
49         ;
50
51 generic_selection
52         : (?E{ast.AST.GenericSelection}GENERIC '(' assignment_expression ',' (?E{ast.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{ast.AST.GenericAssociation}type_name_or_default ':' assignment_expression)
62         ;
63
64 type_name_or_default
65         : type_name
66         | (?E{ast.AST.DefaultTypeName}DEFAULT)
67         ;
68
69 postfix_expression
70         : primary_expression
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}postfix_expression INC_OP)
76         | (?E{ast.AST.ExpressionPostDecrement}postfix_expression DEC_OP)
77         | (?E{ast.AST.ExpressionArray}'(' type_name ')' '{' (?E{ast.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{ast.AST.ExpressionPreIncrement}INC_OP unary_expression)
93         | (?E{ast.AST.ExpressionPreDecrement}DEC_OP unary_expression)
94         | (?E{ast.AST.ExpressionAddressOf}'&' cast_expression)
95         | (?E{ast.AST.ExpressionDereference}'*' cast_expression)
96         | (?E{ast.AST.ExpressionPlus}'+' cast_expression)
97         | (?E{ast.AST.ExpressionMinus}'-' cast_expression)
98         | (?E{ast.AST.ExpressionBitwiseNot}'~' cast_expression)
99         | (?E{ast.AST.ExpressionLogicalNot}'!' cast_expression)
100         | (?E{ast.AST.ExpressionSizeOfExpression}SIZEOF unary_expression)
101         | (?E{ast.AST.ExpressionSizeOfType}SIZEOF '(' type_name ')')
102         | (?E{ast.AST.ExpressionAlignOfType}ALIGNOF '(' type_name ')')
103         ;
104
105 cast_expression
106         : unary_expression
107         | (?E{ast.AST.ExpressionCast}'(' type_name ')' cast_expression)
108         ;
109
110 multiplicative_expression
111         : cast_expression
112         | (?E{ast.AST.ExpressionMultiply}multiplicative_expression '*' cast_expression)
113         | (?E{ast.AST.ExpressionDivide}multiplicative_expression '/' cast_expression)
114         | (?E{ast.AST.ExpressionModulo}multiplicative_expression '%' cast_expression)
115         ;
116
117 additive_expression
118         : multiplicative_expression
119         | (?E{ast.AST.ExpressionAdd}additive_expression '+' multiplicative_expression)
120         | (?E{ast.AST.ExpressionSubtract}additive_expression '-' multiplicative_expression)
121         ;
122
123 shift_expression
124         : additive_expression
125         | (?E{ast.AST.ExpressionShiftLeft}shift_expression LEFT_OP additive_expression)
126         | (?E{ast.AST.ExpressionShiftRight}shift_expression RIGHT_OP additive_expression)
127         ;
128
129 relational_expression
130         : shift_expression
131         | (?E{ast.AST.ExpressionLessThan}relational_expression '<' shift_expression)
132         | (?E{ast.AST.ExpressionGreaterThan}relational_expression '>' shift_expression)
133         | (?E{ast.AST.ExpressionLessThanOrEqual}relational_expression LE_OP shift_expression)
134         | (?E{ast.AST.ExpressionGreaterThanOrEqual}relational_expression GE_OP shift_expression)
135         ;
136
137 equality_expression
138         : relational_expression
139         | (?E{ast.AST.ExpressionEqual}equality_expression EQ_OP relational_expression)
140         | (?E{ast.AST.ExpressionNotEqual}equality_expression NE_OP relational_expression)
141         ;
142
143 and_expression
144         : equality_expression
145         | (?E{ast.AST.ExpressionBitwiseAnd}and_expression '&' equality_expression)
146         ;
147
148 exclusive_or_expression
149         : and_expression
150         | (?E{ast.AST.ExpressionExclusiveOr}exclusive_or_expression '^' and_expression)
151         ;
152
153 inclusive_or_expression
154         : exclusive_or_expression
155         | (?E{ast.AST.ExpressionBitwiseOr}inclusive_or_expression '|' exclusive_or_expression)
156         ;
157
158 logical_and_expression
159         : inclusive_or_expression
160         | (?E{ast.AST.ExpressionLogicalAnd}logical_and_expression AND_OP inclusive_or_expression)
161         ;
162
163 logical_or_expression
164         : logical_and_expression
165         | (?E{ast.AST.ExpressionLogicalOr}logical_or_expression OR_OP logical_and_expression)
166         ;
167
168 conditional_expression
169         : logical_or_expression
170         | (?E{ast.AST.ExpressionConditional}logical_or_expression '?' expression ':' conditional_expression)
171         ;
172
173 assignment_expression_or_asterisk_opt
174         : (?E{ast.AST.ExpressionEmpty})
175         | (?E{ast.AST.ExpressionAsterisk}'*')
176         | assignment_expression
177         ;
178
179 assignment_expression
180         : conditional_expression
181         | (?E{ast.AST.ExpressionAssignment}unary_expression '=' assignment_expression)
182         | (?E{ast.AST.ExpressionMultiplyAssignment}unary_expression MUL_ASSIGN assignment_expression)
183         | (?E{ast.AST.ExpressionDivideAssignment}unary_expression DIV_ASSIGN assignment_expression)
184         | (?E{ast.AST.ExpressionModuloAssignment}unary_expression MOD_ASSIGN assignment_expression)
185         | (?E{ast.AST.ExpressionAddAssignment}unary_expression ADD_ASSIGN assignment_expression)
186         | (?E{ast.AST.ExpressionSubtractAssignment}unary_expression SUB_ASSIGN assignment_expression)
187         | (?E{ast.AST.ExpressionLeftShiftAssignment}unary_expression LEFT_ASSIGN assignment_expression)
188         | (?E{ast.AST.ExpressionRightShiftAssignment}unary_expression RIGHT_ASSIGN assignment_expression)
189         | (?E{ast.AST.ExpressionBitwiseAndAssignment}unary_expression AND_ASSIGN assignment_expression)
190         | (?E{ast.AST.ExpressionExclusiveOrAssignment}unary_expression XOR_ASSIGN assignment_expression)
191         | (?E{ast.AST.ExpressionBitwiseOrAssignment}unary_expression OR_ASSIGN assignment_expression)
192         ;
193
194 expression_opt
195         : (?E{ast.AST.ExpressionEmpty})
196         | expression
197         ;
198
199 expression
200         : assignment_expression
201         | (?E{ast.AST.ExpressionComma}expression ',' assignment_expression)
202         ;
203
204 equals_constant_expression_opt
205         : (?E{ast.AST.ExpressionEmpty})
206         | '=' constant_expression
207         ;
208
209 constant_expression
210         : conditional_expression
211         ;
212
213 declaration
214         : (?E{ast.AST.Declaration}(?E{ast.AST.DeclarationSpecifierList}declaration_specifier_list) (?E{ast.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{ast.AST.InitDeclarator}declarator equals_initializer_opt)
243         ;
244
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)
252         ;
253
254 type_specifier
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
268         | struct_specifier
269         | union_specifier
270         | enum_specifier
271         | TYPEDEF_NAME
272         ;
273
274 struct_specifier
275         : (?E{ast.AST.StructSpecifier}STRUCT identifier_opt '{' (?E{ast.AST.StructDeclarationList}struct_declaration_list_opt) '}')
276         | (?E{ast.AST.StructSpecifier}STRUCT IDENTIFIER)
277         ;
278
279 union_specifier
280         : (?E{ast.AST.UnionSpecifier}UNION identifier_opt '{' (?E{ast.AST.StructDeclarationList}struct_declaration_list_opt) '}')
281         | (?E{ast.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{ast.AST.StructDeclaration}(?E{ast.AST.SpecifierQualifierList}specifier_qualifier_list) (?E{ast.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{ast.AST.StructDeclarator}declarator_opt ':' constant_expression)
321         | declarator
322         ;
323
324 enum_specifier
325         : (?E{ast.AST.EnumSpecifier}ENUM identifier_opt '{' (?E{ast.AST.EnumeratorList}enumerator_list_comma_opt) '}')
326         | (?E{ast.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{ast.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{ast.AST.StorageClassSpecifier, n = 2}STATIC)
361         ;
362
363 type_qualifier
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)
368         ;
369
370 function_specifier
371         : (?E{ast.AST.FunctionSpecifier, n = 0}INLINE)
372         | (?E{ast.AST.FunctionSpecifier, n = 1}NORETURN)
373         ;
374
375 alignment_specifier
376         : (?E{ast.AST.AlignAsType}ALIGNAS '(' type_name ')')
377         | (?E{ast.AST.AlignAsExpression}ALIGNAS '(' constant_expression ')')
378         ;
379
380 declarator_opt
381         : (?E{ast.AST.DeclaratorEmpty})
382         | declarator
383         ;
384
385 declarator
386         : direct_declarator
387         | (?E{ast.AST.DeclaratorPointer}'*' (?E{ast.AST.TypeQualifierList}type_qualifier_list_opt) declarator)
388         ;
389
390 direct_declarator
391         : (?E{ast.AST.DeclaratorIdentifier}IDENTIFIER)
392         | '(' declarator ')'
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}direct_declarator '(' (?E{ast.AST.ParameterDeclarationList}parameter_declaration_list) comma_ellipsis_opt ')')
396         ;
397
398 type_qualifier_list_opt
399         :
400         | type_qualifier_list
401         ;
402
403 type_qualifier_list
404         : type_qualifier
405         | type_qualifier_list type_qualifier
406         ;
407
408 parameter_declaration_list
409         : parameter_declaration
410         | parameter_declaration_list ',' parameter_declaration
411         ;
412
413 parameter_declaration
414         : (?E{ast.AST.ParameterDeclaration}(?E{ast.AST.DeclarationSpecifierList}declaration_specifier_list) declarator)
415         | (?E{ast.AST.ParameterDeclaration}(?E{ast.AST.DeclarationSpecifierList}declaration_specifier_list) abstract_declarator)
416         ;
417
418 identifier_list_opt
419         :
420         | identifier_list
421         ;
422
423 identifier_list
424         : IDENTIFIER
425         | identifier_list ',' IDENTIFIER
426         ;
427
428 type_name
429         : (?E{ast.AST.TypeName}(?E{ast.AST.SpecifierQualifierList}specifier_qualifier_list) abstract_declarator)
430         ;
431
432 abstract_declarator
433         : direct_abstract_declarator_opt
434         | (?E{ast.AST.DeclaratorPointer}'*' (?E{ast.AST.TypeQualifierList}type_qualifier_list_opt) abstract_declarator)
435         ;
436
437 direct_abstract_declarator_opt
438         : (?E{ast.AST.DeclaratorAbstract})
439         | direct_abstract_declarator
440         ;
441
442 /* in the below, ") (" should be ")(", inserted space for now */
443 direct_abstract_declarator
444         : '(' direct_abstract_declarator ')'
445         | '(' (?E{ast.AST.DeclaratorPointer}'*' (?E{ast.AST.TypeQualifierList}type_qualifier_list_opt) abstract_declarator) ')'
446         | (?E{ast.AST.DeclaratorArray}(?E{ast.AST.DeclaratorAbstract})'[' (?E{ast.AST.TypeQualifierOrStaticList}type_qualifier_or_static_list_opt) assignment_expression_or_asterisk_opt ']')
447         | (?E{ast.AST.DeclaratorFunction}(?E{ast.AST.DeclaratorAbstract})'('(?E{ast.AST.ParameterDeclarationList}) (?E{ast.AST.CommaEllipsisEmpty}) ')')
448         | (?E{ast.AST.DeclaratorFunction}(?E{ast.AST.DeclaratorAbstract})'(' (?E{ast.AST.ParameterDeclarationList}parameter_declaration_list) comma_ellipsis_opt ')')
449         | (?E{ast.AST.DeclaratorArray}direct_abstract_declarator '[' (?E{ast.AST.TypeQualifierOrStaticList}type_qualifier_or_static_list_opt) assignment_expression_or_asterisk_opt ']')
450         | (?E{ast.AST.DeclaratorFunction}direct_abstract_declarator '('(?E{ast.AST.ParameterDeclarationList}) (?E{ast.AST.CommaEllipsisEmpty}) ')')
451         | (?E{ast.AST.DeclaratorFunction}direct_abstract_declarator '(' (?E{ast.AST.ParameterDeclarationList}parameter_declaration_list) comma_ellipsis_opt ')')
452         ;
453
454 equals_initializer_opt
455         : (?E{ast.AST.EqualsInitializerEmpty})
456         | '=' initializer
457         ;
458
459 initializer
460         : '{' (?E{ast.AST.DesignatorInitializerList}designator_initializer_list_comma_opt) '}'
461         | assignment_expression
462         ;
463
464 designator_initializer_list_comma_opt
465         :
466         | designator_initializer_list
467         | designator_initializer_list ','
468         ;
469
470 designator_initializer_list
471         : designator_initializer
472         | designator_initializer_list ',' designator_initializer
473         ;
474
475 designator_initializer
476         : (?E{ast.AST.DesignatorInitializer}(?E{ast.AST.DesignatorList}designator_list_equals_opt) initializer)
477         ;
478
479 designator_list_equals_opt
480         :
481         | designator_list '='
482         ;
483
484 designator_list
485         : designator
486         | designator_list designator
487         ;
488
489 designator
490         : (?E{ast.AST.DesignatorIndex}'[' constant_expression ']')
491         | (?E{ast.AST.DesignatorField}'.' IDENTIFIER)
492         ;
493
494 static_assert_declaration
495         : (?E{ast.AST.StaticAssertDeclaration}STATIC_ASSERT '(' constant_expression ',' STRING_LITERAL ')' ';')
496         ;
497
498 statement
499         : (?E{ast.AST.StatementLabel}IDENTIFIER ':' statement)
500         | (?E{ast.AST.StatementCase}CASE constant_expression ':' statement)
501         | (?E{ast.AST.StatementDefault}DEFAULT ':' statement)
502         | (?E{ast.AST.StatementBlock}'{' (?E{ast.AST.BlockItemList}block_item_list_opt) '}')
503         | (?E{ast.AST.StatementExpression}expression_opt ';')
504         | (?E{ast.AST.StatementIfElse}IF '(' expression ')' statement ELSE statement)
505         | (?E{ast.AST.StatementIf}IF '(' expression ')' statement)
506         | (?E{ast.AST.StatementSwitch}SWITCH '(' expression ')' statement)
507         | (?E{ast.AST.StatementWhile}WHILE '(' expression ')' statement)
508         | (?E{ast.AST.StatementDoWhile}DO statement WHILE '(' expression ')' ';')
509         | (?E{ast.AST.StatementFor}FOR '(' expression_opt ';' expression_opt ';' expression_opt ')' statement)
510         | (?E{ast.AST.StatementFor}FOR '(' declaration expression_opt ';' expression_opt ')' statement)
511         | (?E{ast.AST.StatementGoto}GOTO IDENTIFIER ';')
512         | (?E{ast.AST.StatementContinue}CONTINUE ';')
513         | (?E{ast.AST.StatementBreak}BREAK ';')
514         | (?E{ast.AST.StatementReturn}RETURN expression_opt ';')
515         ;
516
517 block_item_list_opt
518         :
519         | block_item_list
520         ;
521
522 block_item_list
523         : block_item
524         | block_item_list block_item
525         ;
526
527 block_item
528         : declaration
529         | statement
530         ;
531
532 translation_unit_opt
533         :
534         | translation_unit
535         ;
536
537 translation_unit
538         : external_declaration
539         | translation_unit external_declaration
540         ;
541
542 external_declaration
543         : function_definition
544         | declaration
545         ;
546
547 function_definition
548         : (?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) '}')
549         ;
550
551 declaration_list_opt
552         :
553         | declaration_list
554         ;
555
556 declaration_list
557         : declaration
558         | declaration_list declaration
559         ;
560
561 identifier_opt
562         : (?E{ast.AST.IdentifierEmpty})
563         | IDENTIFIER
564         ;
565
566 comma_ellipsis_opt
567         : (?E{ast.AST.CommaEllipsisEmpty})
568         | (?E{ast.AST.CommaEllipsis}',' ELLIPSIS)
569         ;