1use cfg::Cfg;
2use cfg_load::CfgLoadExt;
3
4pub fn grammar() -> Cfg {
5 Cfg::load(r##"
6start ::= translation_unit;
7primary_expression ::= identifier;
8primary_expression ::= constant;
9primary_expression ::= string_literal;
10primary_expression ::= lparen expression rparen;
11postfix_expression ::= primary_expression;
12postfix_expression ::= postfix_expression lbracket expression rbracket;
13postfix_expression ::= postfix_expression lparen argument_expression_list_opt rparen;
14postfix_expression ::= postfix_expression dot identifier;
15postfix_expression ::= postfix_expression ptr_op identifier;
16postfix_expression ::= postfix_expression inc_op;
17postfix_expression ::= postfix_expression dec_op;
18postfix_expression ::= lparen type_name rparen lbrace initializer_list rbrace;
19postfix_expression ::= lparen type_name rparen lbrace initializer_list comma rbrace;
20argument_expression_list_opt ::= ;
21argument_expression_list_opt ::= argument_expression_list;
22argument_expression_list ::= assignment_expression;
23argument_expression_list ::= argument_expression_list comma assignment_expression;
24unary_expression ::= postfix_expression;
25unary_expression ::= inc_op unary_expression;
26unary_expression ::= dec_op unary_expression;
27unary_expression ::= unary_operator cast_expression;
28unary_expression ::= sizeof_ unary_expression;
29unary_expression ::= sizeof_ lparen type_name rparen;
30unary_operator ::= ampersand;
31unary_operator ::= star;
32unary_operator ::= plus;
33unary_operator ::= minus;
34unary_operator ::= tilde;
35unary_operator ::= exclamation;
36cast_expression ::= unary_expression;
37cast_expression ::= lparen type_name rparen cast_expression;
38multiplicative_expression ::= cast_expression;
39multiplicative_expression ::= multiplicative_expression star cast_expression;
40multiplicative_expression ::= multiplicative_expression slash cast_expression;
41multiplicative_expression ::= multiplicative_expression percent cast_expression;
42additive_expression ::= multiplicative_expression;
43additive_expression ::= additive_expression plus multiplicative_expression;
44additive_expression ::= additive_expression minus multiplicative_expression;
45shift_expression ::= additive_expression;
46shift_expression ::= shift_expression left_op additive_expression;
47shift_expression ::= shift_expression right_op additive_expression;
48relational_expression ::= shift_expression;
49relational_expression ::= relational_expression langle shift_expression;
50relational_expression ::= relational_expression rangle shift_expression;
51relational_expression ::= relational_expression le_op shift_expression;
52relational_expression ::= relational_expression ge_op shift_expression;
53equality_expression ::= relational_expression;
54equality_expression ::= equality_expression eq_op relational_expression;
55equality_expression ::= equality_expression ne_op relational_expression;
56AND_expression ::= equality_expression;
57AND_expression ::= AND_expression ampersand equality_expression;
58exclusive_OR_expression ::= AND_expression;
59exclusive_OR_expression ::= exclusive_OR_expression xor AND_expression;
60inclusive_OR_expression ::= exclusive_OR_expression;
61inclusive_OR_expression ::= inclusive_OR_expression pipe exclusive_OR_expression;
62logical_AND_expression ::= inclusive_OR_expression;
63logical_AND_expression ::= logical_AND_expression and_op inclusive_OR_expression;
64logical_OR_expression ::= logical_AND_expression;
65logical_OR_expression ::= logical_OR_expression or_op logical_AND_expression;
66conditional_expression ::= logical_OR_expression;
67conditional_expression ::= logical_OR_expression question expression colon conditional_expression;
68assignment_expression ::= conditional_expression;
69assignment_expression ::= unary_expression assignment_operator assignment_expression;
70assignment_operator ::= equal;
71assignment_operator ::= mul_assign;
72assignment_operator ::= div_assign;
73assignment_operator ::= mod_assign;
74assignment_operator ::= add_assign;
75assignment_operator ::= sub_assign;
76assignment_operator ::= left_assign;
77assignment_operator ::= right_assign;
78assignment_operator ::= and_assign;
79assignment_operator ::= xor_assign;
80assignment_operator ::= or_assign;
81expression ::= assignment_expression;
82expression ::= expression comma assignment_expression;
83expression ::= error;
84constant_expression ::= conditional_expression;
85declaration ::= declaration_specifiers init_declarator_list_opt semicolon;
86declaration ::= error;
87init_declarator_list_opt ::= ;
88init_declarator_list_opt ::= init_declarator_list;
89declaration_specifiers ::= storage_class_specifier declaration_specifiers_opt;
90declaration_specifiers ::= type_specifier declaration_specifiers_opt;
91declaration_specifiers ::= type_qualifier declaration_specifiers_opt;
92declaration_specifiers ::= function_specifier declaration_specifiers_opt;
93declaration_specifiers_opt ::= ;
94declaration_specifiers_opt ::= declaration_specifiers;
95init_declarator_list ::= init_declarator;
96init_declarator_list ::= init_declarator_list comma init_declarator;
97init_declarator ::= declarator;
98init_declarator ::= declarator equal initializer;
99storage_class_specifier ::= typedef;
100storage_class_specifier ::= extern_;
101storage_class_specifier ::= static_;
102storage_class_specifier ::= auto;
103storage_class_specifier ::= register;
104type_specifier ::= void;
105type_specifier ::= char_;
106type_specifier ::= short;
107type_specifier ::= int;
108type_specifier ::= long;
109type_specifier ::= float;
110type_specifier ::= double;
111type_specifier ::= signed;
112type_specifier ::= unsigned;
113type_specifier ::= bool_;
114type_specifier ::= complex;
115type_specifier ::= imaginary;
116type_specifier ::= struct_or_union_specifier;
117type_specifier ::= enum_specifier;
118type_specifier ::= typedef_name;
119struct_or_union_specifier ::= struct_or_union identifier_opt lbrace struct_declaration_list rbrace;
120struct_or_union_specifier ::= struct_or_union identifier;
121identifier_opt ::= ;
122identifier_opt ::= identifier;
123struct_or_union ::= struct_;
124struct_or_union ::= union;
125struct_declaration_list ::= struct_declaration;
126struct_declaration_list ::= struct_declaration_list struct_declaration;
127struct_declaration ::= specifier_qualifier_list struct_declarator_list semicolon;
128specifier_qualifier_list ::= type_specifier specifier_qualifier_list_opt;
129specifier_qualifier_list ::= type_qualifier specifier_qualifier_list_opt;
130specifier_qualifier_list_opt ::= ;
131specifier_qualifier_list_opt ::= specifier_qualifier_list;
132struct_declarator_list ::= struct_declarator;
133struct_declarator_list ::= struct_declarator_list comma struct_declarator;
134struct_declarator ::= declarator;
135struct_declarator ::= declarator_opt colon constant_expression;
136declarator_opt ::= ;
137declarator_opt ::= declarator;
138enum_specifier ::= enum_ identifier_opt lbrace enumerator_list rbrace;
139enum_specifier ::= enum_ identifier_opt lbrace enumerator_list comma rbrace;
140enum_specifier ::= enum_ identifier;
141enumerator_list ::= enumerator;
142enumerator_list ::= enumerator_list comma enumerator;
143enumerator ::= enumeration_constant;
144enumerator ::= enumeration_constant equal constant_expression;
145type_qualifier ::= const_;
146type_qualifier ::= restrict;
147type_qualifier ::= volatile;
148function_specifier ::= inline;
149declarator ::= pointer_opt direct_declarator;
150pointer_opt ::= ;
151pointer_opt ::= pointer;
152direct_declarator ::= identifier;
153direct_declarator ::= lparen declarator rparen;
154direct_declarator ::= direct_declarator lbracket type_qualifier_list_opt assignment_expression_opt rbracket;
155direct_declarator ::= direct_declarator lbracket static_ type_qualifier_list_opt assignment_expression rbracket;
156direct_declarator ::= direct_declarator lbracket type_qualifier_list static_ assignment_expression rbracket;
157direct_declarator ::= direct_declarator lbracket type_qualifier_list_opt star rbracket;
158direct_declarator ::= direct_declarator lparen parameter_type_list rparen;
159direct_declarator ::= direct_declarator lparen identifier_list_opt rparen;
160type_qualifier_list_opt ::= ;
161type_qualifier_list_opt ::= type_qualifier_list;
162identifier_list_opt ::= ;
163identifier_list_opt ::= identifier_list;
164pointer ::= star type_qualifier_list_opt;
165pointer ::= star type_qualifier_list_opt pointer;
166type_qualifier_list ::= type_qualifier;
167type_qualifier_list ::= type_qualifier_list type_qualifier;
168parameter_type_list ::= parameter_list;
169parameter_type_list ::= parameter_list comma elipsis;
170parameter_list ::= parameter_declaration;
171parameter_list ::= parameter_list comma parameter_declaration;
172parameter_declaration ::= declaration_specifiers declarator;
173parameter_declaration ::= declaration_specifiers abstract_declarator_opt;
174abstract_declarator_opt ::= ;
175abstract_declarator_opt ::= abstract_declarator;
176identifier_list ::= identifier;
177identifier_list ::= identifier_list comma identifier;
178type_name ::= specifier_qualifier_list abstract_declarator_opt;
179abstract_declarator ::= pointer;
180abstract_declarator ::= pointer_opt direct_abstract_declarator;
181direct_abstract_declarator ::= lparen abstract_declarator rparen;
182direct_abstract_declarator ::= direct_abstract_declarator_opt lbracket assignment_expression_opt rbracket;
183direct_abstract_declarator ::= direct_abstract_declarator_opt lbracket star rbracket;
184direct_abstract_declarator ::= direct_abstract_declarator_opt lparen parameter_type_list_opt rparen;
185direct_abstract_declarator_opt ::= ;
186direct_abstract_declarator_opt ::= direct_abstract_declarator;
187assignment_expression_opt ::= ;
188assignment_expression_opt ::= assignment_expression;
189parameter_type_list_opt ::= ;
190parameter_type_list_opt ::= parameter_type_list;
191typedef_name ::= identifier;
192initializer ::= assignment_expression;
193initializer ::= lbrace initializer_list rbrace;
194initializer ::= lbrace initializer_list comma rbrace;
195initializer_list ::= designation_opt initializer;
196initializer_list ::= initializer_list comma designation_opt initializer;
197designation_opt ::= ;
198designation_opt ::= designation;
199designation ::= designator_list equal;
200designator_list ::= designator;
201designator_list ::= designator_list designator;
202designator ::= rbracket constant_expression rbracket;
203designator ::= dot identifier;
204statement ::= labeled_statement;
205statement ::= compound_statement;
206statement ::= expression_statement;
207statement ::= selection_statement;
208statement ::= iteration_statement;
209statement ::= jump_statement;
210statement ::= error;
211labeled_statement ::= identifier colon statement;
212labeled_statement ::= case constant_expression colon statement;
213labeled_statement ::= default colon statement;
214compound_statement ::= lbrace block_item_list_opt rbrace;
215block_item_list_opt ::= ;
216block_item_list_opt ::= block_item_list;
217block_item_list ::= block_item;
218block_item_list ::= block_item_list block_item;
219block_item ::= declaration;
220block_item ::= statement;
221expression_statement ::= expression_opt semicolon;
222expression_opt ::= ;
223expression_opt ::= expression;
224selection_statement ::= if_ lparen expression rparen statement;
225selection_statement ::= if_ lparen expression rparen statement else_ statement;
226selection_statement ::= switch lparen expression rparen statement;
227iteration_statement ::= while_ lparen expression rparen statement;
228iteration_statement ::= do_ statement while_ lparen expression rparen semicolon;
229iteration_statement ::= for_ lparen expression_opt semicolon expression_opt semicolon expression_opt rparen statement;
230iteration_statement ::= for_ lparen declaration expression_opt semicolon expression_opt rparen statement;
231jump_statement ::= goto identifier semicolon;
232jump_statement ::= continue_ semicolon;
233jump_statement ::= break_ semicolon;
234jump_statement ::= return_ expression_opt semicolon;
235translation_unit ::= external_declaration;
236translation_unit ::= translation_unit external_declaration;
237external_declaration ::= function_definition;
238external_declaration ::= declaration;
239function_definition ::= declaration_specifiers declarator declaration_list_opt compound_statement;
240declaration_list_opt ::= ;
241declaration_list_opt ::= declaration_list;
242declaration_list ::= declaration;
243declaration_list ::= declaration_list declaration;
244enumeration_constant ::= identifier;
245 "##).expect("could not load grammar")
246}