Line | Branch | Exec | Source |
---|---|---|---|
1 | %{ | ||
2 | #include <iostream> | ||
3 | #include <string> | ||
4 | #include <cmath> | ||
5 | #include <memory> | ||
6 | #include <gyoji.l.hpp> | ||
7 | #include <gyoji-frontend.hpp> | ||
8 | #include <gyoji-misc/jstring.hpp> | ||
9 | |||
10 | using namespace Gyoji::context; | ||
11 | using namespace Gyoji::frontend::namespaces; | ||
12 | |||
13 | %} | ||
14 | |||
15 | %require "3.7.4" | ||
16 | %language "C++" | ||
17 | |||
18 | %define api.parser.class {YaccParser} | ||
19 | %define api.namespace {Gyoji::frontend::yacc} | ||
20 | %define api.value.type variant | ||
21 | %param {yyscan_t scanner} | ||
22 | %define parse.error verbose | ||
23 | |||
24 | %code provides | ||
25 | { | ||
26 | #define DEBUG_NONTERMINALS 0 | ||
27 | #if DEBUG_NONTERMINALS | ||
28 | #define PRINT_NONTERMINALS(s) printf("%s\n", s->get_syntax_node()->get_type().c_str()) | ||
29 | #else | ||
30 | #define PRINT_NONTERMINALS(s) /**/ | ||
31 | #endif | ||
32 | |||
33 | #define YY_DECL \ | ||
34 | int yylex(Gyoji::frontend::yacc::YaccParser::semantic_type *yylval, yyscan_t yyscanner) | ||
35 | YY_DECL; | ||
36 | } | ||
37 | |||
38 | %token INVALID_INPUT | ||
39 | %token <Gyoji::owned<Gyoji::frontend::tree::Terminal>> YYEOF | ||
40 | %token <Gyoji::owned<Gyoji::frontend::tree::Terminal>> IDENTIFIER | ||
41 | %token <Gyoji::owned<Gyoji::frontend::tree::Terminal>> NAMESPACE_NAME | ||
42 | %token <Gyoji::owned<Gyoji::frontend::tree::Terminal>> TYPE_NAME | ||
43 | %token <Gyoji::owned<Gyoji::frontend::tree::Terminal>> CLASS | ||
44 | %token <Gyoji::owned<Gyoji::frontend::tree::Terminal>> ENUM | ||
45 | |||
46 | %token <Gyoji::owned<Gyoji::frontend::tree::Terminal>> NAMESPACE | ||
47 | %token <Gyoji::owned<Gyoji::frontend::tree::Terminal>> AS | ||
48 | %token <Gyoji::owned<Gyoji::frontend::tree::Terminal>> USING | ||
49 | %token <Gyoji::owned<Gyoji::frontend::tree::Terminal>> TYPEDEF | ||
50 | %token <Gyoji::owned<Gyoji::frontend::tree::Terminal>> STRUCT | ||
51 | %token <Gyoji::owned<Gyoji::frontend::tree::Terminal>> UNION | ||
52 | %token <Gyoji::owned<Gyoji::frontend::tree::Terminal>> SIZEOF | ||
53 | %token <Gyoji::owned<Gyoji::frontend::tree::Terminal>> TYPEOF | ||
54 | %token <Gyoji::owned<Gyoji::frontend::tree::Terminal>> CAST | ||
55 | %token <Gyoji::owned<Gyoji::frontend::tree::Terminal>> UNSAFE | ||
56 | //%token <Gyoji::owned<Gyoji::frontend::tree::Terminal>> VAR | ||
57 | %token <Gyoji::owned<Gyoji::frontend::tree::Terminal>> CONST | ||
58 | %token <Gyoji::owned<Gyoji::frontend::tree::Terminal>> VOLATILE | ||
59 | |||
60 | %token <Gyoji::owned<Gyoji::frontend::tree::Terminal>> PUBLIC | ||
61 | %token <Gyoji::owned<Gyoji::frontend::tree::Terminal>> PRIVATE | ||
62 | %token <Gyoji::owned<Gyoji::frontend::tree::Terminal>> PROTECTED | ||
63 | |||
64 | /* Logical Operations */ | ||
65 | %token <Gyoji::owned<Gyoji::frontend::tree::Terminal>> LOGICAL_NOT | ||
66 | %token <Gyoji::owned<Gyoji::frontend::tree::Terminal>> LOGICAL_AND | ||
67 | %token <Gyoji::owned<Gyoji::frontend::tree::Terminal>> LOGICAL_OR | ||
68 | |||
69 | /* Control Flow */ | ||
70 | %token <Gyoji::owned<Gyoji::frontend::tree::Terminal>> RETURN | ||
71 | %token <Gyoji::owned<Gyoji::frontend::tree::Terminal>> IF | ||
72 | %token <Gyoji::owned<Gyoji::frontend::tree::Terminal>> ELSE | ||
73 | %token <Gyoji::owned<Gyoji::frontend::tree::Terminal>> WHILE | ||
74 | %token <Gyoji::owned<Gyoji::frontend::tree::Terminal>> FOR | ||
75 | %token <Gyoji::owned<Gyoji::frontend::tree::Terminal>> CONTINUE | ||
76 | %token <Gyoji::owned<Gyoji::frontend::tree::Terminal>> GOTO | ||
77 | %token <Gyoji::owned<Gyoji::frontend::tree::Terminal>> LABEL | ||
78 | %token <Gyoji::owned<Gyoji::frontend::tree::Terminal>> BREAK | ||
79 | %token <Gyoji::owned<Gyoji::frontend::tree::Terminal>> SWITCH | ||
80 | %token <Gyoji::owned<Gyoji::frontend::tree::Terminal>> CASE | ||
81 | %token <Gyoji::owned<Gyoji::frontend::tree::Terminal>> DEFAULT | ||
82 | |||
83 | /* Binary operations */ | ||
84 | %token <Gyoji::owned<Gyoji::frontend::tree::Terminal>> PLUS | ||
85 | %token <Gyoji::owned<Gyoji::frontend::tree::Terminal>> MINUS | ||
86 | %token <Gyoji::owned<Gyoji::frontend::tree::Terminal>> SLASH | ||
87 | %token <Gyoji::owned<Gyoji::frontend::tree::Terminal>> PERCENT | ||
88 | %token <Gyoji::owned<Gyoji::frontend::tree::Terminal>> STAR | ||
89 | %token <Gyoji::owned<Gyoji::frontend::tree::Terminal>> ASSIGNMENT | ||
90 | %token <Gyoji::owned<Gyoji::frontend::tree::Terminal>> BANG | ||
91 | %token <Gyoji::owned<Gyoji::frontend::tree::Terminal>> TILDE | ||
92 | %token <Gyoji::owned<Gyoji::frontend::tree::Terminal>> ANDPERSAND | ||
93 | %token <Gyoji::owned<Gyoji::frontend::tree::Terminal>> MUL_ASSIGNMENT | ||
94 | %token <Gyoji::owned<Gyoji::frontend::tree::Terminal>> DIV_ASSIGNMENT | ||
95 | %token <Gyoji::owned<Gyoji::frontend::tree::Terminal>> MOD_ASSIGNMENT | ||
96 | %token <Gyoji::owned<Gyoji::frontend::tree::Terminal>> ADD_ASSIGNMENT | ||
97 | %token <Gyoji::owned<Gyoji::frontend::tree::Terminal>> SUB_ASSIGNMENT | ||
98 | %token <Gyoji::owned<Gyoji::frontend::tree::Terminal>> LEFT_ASSIGNMENT | ||
99 | %token <Gyoji::owned<Gyoji::frontend::tree::Terminal>> RIGHT_ASSIGNMENT | ||
100 | %token <Gyoji::owned<Gyoji::frontend::tree::Terminal>> AND_ASSIGNMENT | ||
101 | %token <Gyoji::owned<Gyoji::frontend::tree::Terminal>> XOR_ASSIGNMENT | ||
102 | %token <Gyoji::owned<Gyoji::frontend::tree::Terminal>> OR_ASSIGNMENT | ||
103 | |||
104 | %token <Gyoji::owned<Gyoji::frontend::tree::Terminal>> LITERAL_CHAR | ||
105 | %token <Gyoji::owned<Gyoji::frontend::tree::Terminal>> LITERAL_FLOAT | ||
106 | %token <Gyoji::owned<Gyoji::frontend::tree::Terminal>> LITERAL_INT | ||
107 | %token <Gyoji::owned<Gyoji::frontend::tree::Terminal>> LITERAL_STRING | ||
108 | %token <Gyoji::owned<Gyoji::frontend::tree::Terminal>> LITERAL_BOOL | ||
109 | %token <Gyoji::owned<Gyoji::frontend::tree::Terminal>> LITERAL_NULL | ||
110 | |||
111 | %token NST_COMMENT_MULTILINE | ||
112 | %token NST_COMMENT_SINGLE_LINE | ||
113 | %token NST_WHITESPACE | ||
114 | %token NST_FILE_METADATA | ||
115 | |||
116 | %token <Gyoji::owned<Gyoji::frontend::tree::Terminal>> COMPARE_LESS | ||
117 | %token <Gyoji::owned<Gyoji::frontend::tree::Terminal>> COMPARE_GREATER | ||
118 | %token <Gyoji::owned<Gyoji::frontend::tree::Terminal>> COMPARE_LESS_EQUAL | ||
119 | %token <Gyoji::owned<Gyoji::frontend::tree::Terminal>> COMPARE_GREATER_EQUAL | ||
120 | %token <Gyoji::owned<Gyoji::frontend::tree::Terminal>> COMPARE_NOT_EQUAL | ||
121 | %token <Gyoji::owned<Gyoji::frontend::tree::Terminal>> COMPARE_EQUAL | ||
122 | |||
123 | %token <Gyoji::owned<Gyoji::frontend::tree::Terminal>> XOR_OP | ||
124 | %token <Gyoji::owned<Gyoji::frontend::tree::Terminal>> AND_OP | ||
125 | %token <Gyoji::owned<Gyoji::frontend::tree::Terminal>> PIPE | ||
126 | %token <Gyoji::owned<Gyoji::frontend::tree::Terminal>> OR_OP | ||
127 | %token <Gyoji::owned<Gyoji::frontend::tree::Terminal>> LEFT_OP | ||
128 | %token <Gyoji::owned<Gyoji::frontend::tree::Terminal>> RIGHT_OP | ||
129 | |||
130 | /* Common punctuation */ | ||
131 | %token <Gyoji::owned<Gyoji::frontend::tree::Terminal>> COMMA | ||
132 | %token <Gyoji::owned<Gyoji::frontend::tree::Terminal>> INC_OP | ||
133 | %token <Gyoji::owned<Gyoji::frontend::tree::Terminal>> DEC_OP | ||
134 | %token <Gyoji::owned<Gyoji::frontend::tree::Terminal>> PTR_OP | ||
135 | %token <Gyoji::owned<Gyoji::frontend::tree::Terminal>> DOT | ||
136 | %token <Gyoji::owned<Gyoji::frontend::tree::Terminal>> PAREN_L | ||
137 | %token <Gyoji::owned<Gyoji::frontend::tree::Terminal>> PAREN_R | ||
138 | %token <Gyoji::owned<Gyoji::frontend::tree::Terminal>> BRACE_L | ||
139 | %token <Gyoji::owned<Gyoji::frontend::tree::Terminal>> BRACKET_R | ||
140 | %token <Gyoji::owned<Gyoji::frontend::tree::Terminal>> BRACKET_L | ||
141 | %token <Gyoji::owned<Gyoji::frontend::tree::Terminal>> BRACE_R | ||
142 | %token <Gyoji::owned<Gyoji::frontend::tree::Terminal>> SEMICOLON | ||
143 | %token <Gyoji::owned<Gyoji::frontend::tree::Terminal>> COLON | ||
144 | %token <Gyoji::owned<Gyoji::frontend::tree::Terminal>> QUESTIONMARK | ||
145 | |||
146 | %token <Gyoji::owned<Gyoji::frontend::tree::Terminal>> PREC_FIRST | ||
147 | %token <Gyoji::owned<Gyoji::frontend::tree::Terminal>> PREC_SECOND | ||
148 | |||
149 | %nterm <Gyoji::owned<Gyoji::frontend::tree::TranslationUnit>> translation_unit; | ||
150 | |||
151 | %nterm <Gyoji::owned<Gyoji::frontend::tree::FileStatementList>> opt_file_statement_list; | ||
152 | %nterm <Gyoji::owned<Gyoji::frontend::tree::FileStatementList>> file_statement_list; | ||
153 | %nterm <Gyoji::owned<Gyoji::frontend::tree::FileStatement>> file_statement; | ||
154 | %nterm <Gyoji::owned<Gyoji::frontend::tree::FileStatementFunctionDeclStart>> function_decl_start; | ||
155 | %nterm <Gyoji::owned<Gyoji::frontend::tree::FileStatementFunctionDefinition>> file_statement_function_definition; | ||
156 | %nterm <Gyoji::owned<Gyoji::frontend::tree::FileStatementFunctionDeclaration>> file_statement_function_declaration; | ||
157 | %nterm <Gyoji::owned<Gyoji::frontend::tree::TypeDefinition>> type_definition; | ||
158 | %nterm <Gyoji::owned<Gyoji::frontend::tree::ClassDefinition>> class_definition; | ||
159 | %nterm <Gyoji::owned<Gyoji::frontend::tree::ClassDeclaration>> class_declaration; | ||
160 | %nterm <Gyoji::owned<Gyoji::frontend::tree::ClassDeclStart>> class_decl_start; | ||
161 | %nterm <Gyoji::owned<Gyoji::frontend::tree::ClassArgumentList>> opt_class_argument_list; | ||
162 | %nterm <Gyoji::owned<Gyoji::frontend::tree::ClassArgumentList>> class_argument_list; | ||
163 | |||
164 | |||
165 | %nterm <Gyoji::owned<Gyoji::frontend::tree::EnumDefinition>> enum_definition; | ||
166 | %nterm <Gyoji::owned<Gyoji::frontend::tree::EnumDefinitionValueList>> opt_enum_value_list; | ||
167 | %nterm <Gyoji::owned<Gyoji::frontend::tree::EnumDefinitionValueList>> enum_value_list; | ||
168 | %nterm <Gyoji::owned<Gyoji::frontend::tree::EnumDefinitionValue>> enum_value; | ||
169 | |||
170 | %nterm <Gyoji::owned<Gyoji::frontend::tree::UnsafeModifier>> opt_unsafe | ||
171 | %nterm <Gyoji::owned<Gyoji::frontend::tree::NamespaceDeclaration>> namespace_declaration; | ||
172 | %nterm <Gyoji::owned<Gyoji::frontend::tree::FileStatementNamespace>> file_statement_namespace; | ||
173 | %nterm <Gyoji::owned<Gyoji::frontend::tree::UsingAs>> opt_as; | ||
174 | %nterm <Gyoji::owned<Gyoji::frontend::tree::FileStatementUsing>> file_statement_using; | ||
175 | %nterm <Gyoji::owned<Gyoji::frontend::tree::FileStatementGlobalDefinition>> file_statement_global_definition; | ||
176 | %nterm <Gyoji::owned<Gyoji::frontend::tree::GlobalInitializer>> opt_global_initializer; | ||
177 | |||
178 | %nterm <Gyoji::owned<Gyoji::frontend::tree::GlobalInitializerExpressionPrimary>> global_initializer_expression_primary; | ||
179 | %nterm <Gyoji::owned<Gyoji::frontend::tree::GlobalInitializerAddressofExpressionPrimary>> global_initializer_addressof_expression_primary; | ||
180 | %nterm <Gyoji::owned<Gyoji::frontend::tree::GlobalInitializerStructInitializerList>> global_initializer_struct_initializer_list; | ||
181 | %nterm <Gyoji::owned<Gyoji::frontend::tree::GlobalInitializer>> global_initializer; | ||
182 | %nterm <Gyoji::owned<Gyoji::frontend::tree::StructInitializerList>> opt_struct_initializer_list; | ||
183 | %nterm <Gyoji::owned<Gyoji::frontend::tree::StructInitializerList>> struct_initializer_list; | ||
184 | %nterm <Gyoji::owned<Gyoji::frontend::tree::StructInitializer>> struct_initializer; | ||
185 | |||
186 | %nterm <Gyoji::owned<Gyoji::frontend::tree::AccessModifier>> opt_access_modifier; | ||
187 | %nterm <Gyoji::owned<Gyoji::frontend::tree::Terminal>> access_modifier; | ||
188 | |||
189 | %nterm <Gyoji::owned<Gyoji::frontend::tree::ScopeBody>> scope_body; | ||
190 | %nterm <Gyoji::owned<Gyoji::frontend::tree::StatementList>> statement_list; | ||
191 | %nterm <Gyoji::owned<Gyoji::frontend::tree::Statement>> statement; | ||
192 | %nterm <Gyoji::owned<Gyoji::frontend::tree::StatementVariableDeclaration>> statement_variable_declaration; | ||
193 | %nterm <Gyoji::owned<Gyoji::frontend::tree::StatementBlock>> statement_block; | ||
194 | %nterm <Gyoji::owned<Gyoji::frontend::tree::StatementExpression>> statement_expression; | ||
195 | %nterm <Gyoji::owned<Gyoji::frontend::tree::StatementIfElse>> statement_ifelse; | ||
196 | %nterm <Gyoji::owned<Gyoji::frontend::tree::StatementWhile>> statement_while; | ||
197 | %nterm <Gyoji::owned<Gyoji::frontend::tree::StatementFor>> statement_for; | ||
198 | %nterm <Gyoji::owned<Gyoji::frontend::tree::StatementSwitch>> statement_switch; | ||
199 | %nterm <Gyoji::owned<Gyoji::frontend::tree::StatementLabel>> statement_label; | ||
200 | %nterm <Gyoji::owned<Gyoji::frontend::tree::StatementGoto>> statement_goto; | ||
201 | %nterm <Gyoji::owned<Gyoji::frontend::tree::StatementBreak>> statement_break; | ||
202 | %nterm <Gyoji::owned<Gyoji::frontend::tree::StatementContinue>> statement_continue; | ||
203 | %nterm <Gyoji::owned<Gyoji::frontend::tree::StatementReturn>> statement_return; | ||
204 | |||
205 | %nterm <Gyoji::owned<Gyoji::frontend::tree::StatementSwitchBlock>> statement_switch_block; | ||
206 | %nterm <Gyoji::owned<Gyoji::frontend::tree::StatementSwitchContent>> statement_switch_content; | ||
207 | %nterm <Gyoji::owned<Gyoji::frontend::tree::StatementSwitchContent>> opt_statement_switch_content; | ||
208 | |||
209 | %nterm <Gyoji::owned<Gyoji::frontend::tree::FunctionDefinitionArgList>> opt_function_definition_arg_list; | ||
210 | %nterm <Gyoji::owned<Gyoji::frontend::tree::FunctionDefinitionArgList>> function_definition_arg_list; | ||
211 | %nterm <Gyoji::owned<Gyoji::frontend::tree::FunctionDefinitionArg>> function_definition_arg | ||
212 | |||
213 | %nterm <Gyoji::owned<Gyoji::frontend::tree::Expression>> expression_primary; | ||
214 | %nterm <Gyoji::owned<Gyoji::frontend::tree::ExpressionPrimaryNested>> expression_primary_nested; | ||
215 | %nterm <Gyoji::owned<Gyoji::frontend::tree::ExpressionPrimaryIdentifier>> expression_primary_identifier; | ||
216 | %nterm <Gyoji::owned<Gyoji::frontend::tree::ExpressionPrimaryLiteralInt>> expression_primary_literal_int; | ||
217 | %nterm <Gyoji::owned<Gyoji::frontend::tree::ExpressionPrimaryLiteralChar>> expression_primary_literal_char; | ||
218 | %nterm <Gyoji::owned<Gyoji::frontend::tree::ExpressionPrimaryLiteralString>> expression_primary_literal_string; | ||
219 | %nterm <Gyoji::owned<Gyoji::frontend::tree::ExpressionPrimaryLiteralFloat>> expression_primary_literal_float; | ||
220 | %nterm <Gyoji::owned<Gyoji::frontend::tree::ExpressionPrimaryLiteralBool>> expression_primary_literal_bool; | ||
221 | %nterm <Gyoji::owned<Gyoji::frontend::tree::ExpressionPrimaryLiteralNull>> expression_primary_literal_null; | ||
222 | |||
223 | %nterm <Gyoji::owned<Gyoji::frontend::tree::Expression>> expression_postfix; | ||
224 | %nterm <Gyoji::owned<Gyoji::frontend::tree::Expression>> expression_postfix_primary; | ||
225 | %nterm <Gyoji::owned<Gyoji::frontend::tree::Expression>> expression_postfix_arrayindex; | ||
226 | %nterm <Gyoji::owned<Gyoji::frontend::tree::Expression>> expression_postfix_function_call; | ||
227 | %nterm <Gyoji::owned<Gyoji::frontend::tree::Expression>> expression_postfix_dot; | ||
228 | %nterm <Gyoji::owned<Gyoji::frontend::tree::Expression>> expression_postfix_arrow; | ||
229 | %nterm <Gyoji::owned<Gyoji::frontend::tree::Expression>> expression_postfix_increment; | ||
230 | %nterm <Gyoji::owned<Gyoji::frontend::tree::Expression>> expression_postfix_decrement; | ||
231 | |||
232 | %nterm <Gyoji::owned<Gyoji::frontend::tree::Expression>> expression_unary; | ||
233 | %nterm <Gyoji::owned<Gyoji::frontend::tree::Expression>> expression_unary_increment; | ||
234 | %nterm <Gyoji::owned<Gyoji::frontend::tree::Expression>> expression_unary_decrement; | ||
235 | %nterm <Gyoji::owned<Gyoji::frontend::tree::Expression>> expression_unary_prefix; | ||
236 | %nterm <Gyoji::owned<Gyoji::frontend::tree::Expression>> expression_unary_sizeof_type; | ||
237 | |||
238 | %nterm <Gyoji::owned<Gyoji::frontend::tree::Expression>> expression_cast; | ||
239 | %nterm <Gyoji::owned<Gyoji::frontend::tree::Expression>> expression_cast_unary; | ||
240 | %nterm <Gyoji::owned<Gyoji::frontend::tree::Expression>> expression_cast_cast; | ||
241 | |||
242 | %nterm <Gyoji::owned<Gyoji::frontend::tree::Expression>> expression_multiplicative; | ||
243 | %nterm <Gyoji::owned<Gyoji::frontend::tree::Expression>> expression_multiplicative_cast; | ||
244 | %nterm <Gyoji::owned<Gyoji::frontend::tree::Expression>> expression_multiplicative_multiply; | ||
245 | %nterm <Gyoji::owned<Gyoji::frontend::tree::Expression>> expression_multiplicative_divide; | ||
246 | %nterm <Gyoji::owned<Gyoji::frontend::tree::Expression>> expression_multiplicative_modulo; | ||
247 | |||
248 | %nterm <Gyoji::owned<Gyoji::frontend::tree::Expression>> expression_additive; | ||
249 | %nterm <Gyoji::owned<Gyoji::frontend::tree::Expression>> expression_additive_multiplicative; | ||
250 | %nterm <Gyoji::owned<Gyoji::frontend::tree::Expression>> expression_additive_plus; | ||
251 | %nterm <Gyoji::owned<Gyoji::frontend::tree::Expression>> expression_additive_minus; | ||
252 | |||
253 | %nterm <Gyoji::owned<Gyoji::frontend::tree::Expression>> expression_shift; | ||
254 | %nterm <Gyoji::owned<Gyoji::frontend::tree::Expression>> expression_shift_additive; | ||
255 | %nterm <Gyoji::owned<Gyoji::frontend::tree::Expression>> expression_shift_left; | ||
256 | %nterm <Gyoji::owned<Gyoji::frontend::tree::Expression>> expression_shift_right; | ||
257 | |||
258 | %nterm <Gyoji::owned<Gyoji::frontend::tree::Expression>> expression_relational; | ||
259 | %nterm <Gyoji::owned<Gyoji::frontend::tree::Expression>> expression_relational_shift; | ||
260 | %nterm <Gyoji::owned<Gyoji::frontend::tree::Expression>> expression_relational_gt; | ||
261 | %nterm <Gyoji::owned<Gyoji::frontend::tree::Expression>> expression_relational_lt; | ||
262 | %nterm <Gyoji::owned<Gyoji::frontend::tree::Expression>> expression_relational_le; | ||
263 | %nterm <Gyoji::owned<Gyoji::frontend::tree::Expression>> expression_relational_ge; | ||
264 | |||
265 | %nterm <Gyoji::owned<Gyoji::frontend::tree::Expression>> expression_equality; | ||
266 | %nterm <Gyoji::owned<Gyoji::frontend::tree::Expression>> expression_and; | ||
267 | %nterm <Gyoji::owned<Gyoji::frontend::tree::Expression>> expression_exclusive_or; | ||
268 | %nterm <Gyoji::owned<Gyoji::frontend::tree::Expression>> expression_inclusive_or; | ||
269 | %nterm <Gyoji::owned<Gyoji::frontend::tree::Expression>> expression_logical_and; | ||
270 | %nterm <Gyoji::owned<Gyoji::frontend::tree::Expression>> expression_logical_or; | ||
271 | |||
272 | %nterm <Gyoji::owned<Gyoji::frontend::tree::Expression>> expression_conditional; | ||
273 | %nterm <Gyoji::owned<Gyoji::frontend::tree::Expression>> expression_assignment; | ||
274 | |||
275 | %nterm <Gyoji::owned<Gyoji::frontend::tree::InitializerExpression>> initializer_expression; | ||
276 | |||
277 | %nterm <Gyoji::owned<Gyoji::frontend::tree::TypeSpecifier>> type_specifier; | ||
278 | %nterm <Gyoji::owned<Gyoji::frontend::tree::TypeSpecifierCallArgs>> type_specifier_call_args; | ||
279 | %nterm <Gyoji::owned<Gyoji::frontend::tree::TypeName>> type_name; | ||
280 | %nterm <Gyoji::owned<Gyoji::frontend::tree::AccessQualifier>> type_access_qualifier; | ||
281 | |||
282 | %nterm <Gyoji::owned<Gyoji::frontend::tree::ClassMemberDeclarationList>> opt_class_member_declaration_list; | ||
283 | %nterm <Gyoji::owned<Gyoji::frontend::tree::ClassMemberDeclarationList>> class_member_declaration_list; | ||
284 | %nterm <Gyoji::owned<Gyoji::frontend::tree::ClassMemberDeclaration>> class_member_declaration; | ||
285 | |||
286 | %nterm < | ||
287 | std::pair< | ||
288 | Gyoji::frontend::tree::ExpressionUnaryPrefix::OperationType, | ||
289 | Gyoji::owned<Gyoji::frontend::tree::Terminal> | ||
290 | > | ||
291 | > operator_unary; | ||
292 | %nterm < | ||
293 | std::pair< | ||
294 | Gyoji::frontend::tree::ExpressionBinary::OperationType, | ||
295 | Gyoji::owned<Gyoji::frontend::tree::Terminal> | ||
296 | > | ||
297 | > operator_assignment; | ||
298 | %nterm <Gyoji::owned<Gyoji::frontend::tree::ArgumentExpressionList>> opt_argument_expression_list; | ||
299 | %nterm <Gyoji::owned<Gyoji::frontend::tree::ArgumentExpressionList>> argument_expression_list; | ||
300 | |||
301 | %nterm <Gyoji::owned<Gyoji::frontend::tree::Expression>> expression; | ||
302 | |||
303 | %parse-param {Gyoji::frontend::ParseResult & return_data} | ||
304 | |||
305 | %code | ||
306 | { | ||
307 | |||
308 | } // %code | ||
309 | |||
310 | %% | ||
311 | |||
312 | /*** Rules Section ***/ | ||
313 | translation_unit | ||
314 | : opt_file_statement_list YYEOF { | ||
315 | 240 | $$ = std::make_unique<Gyoji::frontend::tree::TranslationUnit>(std::move($1), std::move($2)); | |
316 | PRINT_NONTERMINALS($$); | ||
317 | 240 | return_data.set_translation_unit(std::move($$)); | |
318 | } | ||
319 | ; | ||
320 | |||
321 | opt_file_statement_list | ||
322 | : /**/ YYEOF { | ||
323 | 18 | $$ = std::make_unique<Gyoji::frontend::tree::FileStatementList>(std::move($1)); | |
324 | PRINT_NONTERMINALS($$); | ||
325 | } | ||
326 | | file_statement_list { | ||
327 | 340 | $$ = std::move($1); | |
328 | PRINT_NONTERMINALS($$); | ||
329 | } | ||
330 | ; | ||
331 | |||
332 | file_statement_list | ||
333 | : file_statement { | ||
334 | 342 | $$ = std::make_unique<Gyoji::frontend::tree::FileStatementList>(return_data.compiler_context.get_token_stream().get_current_source_ref()); | |
335 | 342 | $$->add_statement(std::move($1)); | |
336 | PRINT_NONTERMINALS($$); | ||
337 | } | ||
338 | | file_statement_list file_statement { | ||
339 | 938 | $$ = std::move($1); | |
340 | 938 | $$->add_statement(std::move($2)); | |
341 | PRINT_NONTERMINALS($$); | ||
342 | } | ||
343 | ; | ||
344 | |||
345 | file_statement | ||
346 | : file_statement_function_definition { | ||
347 | 444 | const Gyoji::frontend::ast::SyntaxNode &sn = *($1); | |
348 | 888 | $$ = std::make_unique<Gyoji::frontend::tree::FileStatement>( | |
349 | 444 | std::move($1), | |
350 | sn | ||
351 | 444 | ); | |
352 | PRINT_NONTERMINALS($$); | ||
353 | } | ||
354 | | file_statement_function_declaration { | ||
355 | 224 | const Gyoji::frontend::ast::SyntaxNode &sn = *($1); | |
356 | 448 | $$ = std::make_unique<Gyoji::frontend::tree::FileStatement>( | |
357 | 224 | std::move($1), | |
358 | sn | ||
359 | 224 | ); | |
360 | PRINT_NONTERMINALS($$); | ||
361 | } | ||
362 | | file_statement_global_definition { | ||
363 | 124 | const Gyoji::frontend::ast::SyntaxNode &sn = *($1); | |
364 | 248 | $$ = std::make_unique<Gyoji::frontend::tree::FileStatement>( | |
365 | 124 | std::move($1), | |
366 | sn | ||
367 | 124 | ); | |
368 | PRINT_NONTERMINALS($$); | ||
369 | } | ||
370 | | class_declaration { | ||
371 | 56 | const Gyoji::frontend::ast::SyntaxNode &sn = *($1); | |
372 | 112 | $$ = std::make_unique<Gyoji::frontend::tree::FileStatement>( | |
373 | 56 | std::move($1), | |
374 | sn | ||
375 | 56 | ); | |
376 | PRINT_NONTERMINALS($$); | ||
377 | } | ||
378 | | class_definition { | ||
379 | 112 | const Gyoji::frontend::ast::SyntaxNode &sn = *($1); | |
380 | 224 | $$ = std::make_unique<Gyoji::frontend::tree::FileStatement>( | |
381 | 112 | std::move($1), | |
382 | sn | ||
383 | 112 | ); | |
384 | PRINT_NONTERMINALS($$); | ||
385 | } | ||
386 | | enum_definition { | ||
387 | 18 | const Gyoji::frontend::ast::SyntaxNode &sn = *($1); | |
388 | 36 | $$ = std::make_unique<Gyoji::frontend::tree::FileStatement>( | |
389 | 18 | std::move($1), | |
390 | sn | ||
391 | 18 | ); | |
392 | PRINT_NONTERMINALS($$); | ||
393 | } | ||
394 | | type_definition { | ||
395 | 138 | const Gyoji::frontend::ast::SyntaxNode &sn = *($1); | |
396 | 276 | $$ = std::make_unique<Gyoji::frontend::tree::FileStatement>( | |
397 | 138 | std::move($1), | |
398 | sn | ||
399 | 138 | ); | |
400 | PRINT_NONTERMINALS($$); | ||
401 | } | ||
402 | | file_statement_namespace { | ||
403 | 118 | const Gyoji::frontend::ast::SyntaxNode &sn = *($1); | |
404 | 236 | $$ = std::make_unique<Gyoji::frontend::tree::FileStatement>( | |
405 | 118 | std::move($1), | |
406 | sn | ||
407 | 118 | ); | |
408 | PRINT_NONTERMINALS($$); | ||
409 | } | ||
410 | | file_statement_using { | ||
411 | 46 | const Gyoji::frontend::ast::SyntaxNode &sn = *($1); | |
412 | 92 | $$ = std::make_unique<Gyoji::frontend::tree::FileStatement>( | |
413 | 46 | std::move($1), | |
414 | sn | ||
415 | 46 | ); | |
416 | PRINT_NONTERMINALS($$); | ||
417 | } | ||
418 | ; | ||
419 | |||
420 | file_statement_global_definition | ||
421 | : opt_access_modifier opt_unsafe type_specifier IDENTIFIER opt_global_initializer SEMICOLON { | ||
422 | 124 | std::string global_name = $4->get_value(); | |
423 | 124 | NS2Entity *ns2_entity = return_data.identifier_get_or_create($4->get_value(), true, $4->get_source_ref()); | |
424 | 124 | $4->set_ns2_entity(ns2_entity); | |
425 | |||
426 | 248 | $$ = std::make_unique<Gyoji::frontend::tree::FileStatementGlobalDefinition>( | |
427 | 124 | std::move($1), | |
428 | 124 | std::move($2), | |
429 | 124 | std::move($3), | |
430 | 124 | std::move($4), | |
431 | 124 | std::move($5), | |
432 | 124 | std::move($6) | |
433 | 124 | ); | |
434 | PRINT_NONTERMINALS($$); | ||
435 | 124 | } | |
436 | ; | ||
437 | |||
438 | opt_global_initializer | ||
439 | : /**/ { | ||
440 | 116 | $$ = std::make_unique<Gyoji::frontend::tree::GlobalInitializer>(return_data.compiler_context.get_token_stream().get_current_source_ref()); | |
441 | PRINT_NONTERMINALS($$); | ||
442 | } | ||
443 | | global_initializer { | ||
444 | 8 | $$ = std::move($1); | |
445 | PRINT_NONTERMINALS($$); | ||
446 | } | ||
447 | ; | ||
448 | |||
449 | global_initializer | ||
450 | : global_initializer_expression_primary { | ||
451 | 8 | const Gyoji::frontend::ast::SyntaxNode &sn = *($1); | |
452 | 8 | $$ = std::make_unique<Gyoji::frontend::tree::GlobalInitializer>(std::move($1), sn); | |
453 | } | ||
454 | | global_initializer_addressof_expression_primary { | ||
455 | 8 | const Gyoji::frontend::ast::SyntaxNode &sn = *($1); | |
456 | 8 | $$ = std::make_unique<Gyoji::frontend::tree::GlobalInitializer>(std::move($1), sn); | |
457 | } | ||
458 | | global_initializer_struct_initializer_list { | ||
459 | 8 | const Gyoji::frontend::ast::SyntaxNode &sn = *($1); | |
460 | 8 | $$ = std::make_unique<Gyoji::frontend::tree::GlobalInitializer>(std::move($1), sn); | |
461 | } | ||
462 | ; | ||
463 | |||
464 | global_initializer_expression_primary | ||
465 | : ASSIGNMENT expression_primary { | ||
466 | 16 | $$ = std::make_unique<Gyoji::frontend::tree::GlobalInitializerExpressionPrimary>(std::move($1), | |
467 | 16 | std::move($2)); | |
468 | PRINT_NONTERMINALS($$); | ||
469 | } | ||
470 | ; | ||
471 | |||
472 | global_initializer_addressof_expression_primary | ||
473 | : ASSIGNMENT ANDPERSAND expression_primary { | ||
474 | 16 | $$ = std::make_unique<Gyoji::frontend::tree::GlobalInitializerAddressofExpressionPrimary>(std::move($1), | |
475 | 8 | std::move($2), | |
476 | 8 | std::move($3) | |
477 | 8 | ); | |
478 | PRINT_NONTERMINALS($$); | ||
479 | } | ||
480 | ; | ||
481 | |||
482 | global_initializer_struct_initializer_list | ||
483 | : ASSIGNMENT BRACE_L opt_struct_initializer_list BRACE_R { | ||
484 | 16 | $$ = std::make_unique<Gyoji::frontend::tree::GlobalInitializerStructInitializerList>(std::move($1), | |
485 | 8 | std::move($2), | |
486 | 8 | std::move($3), | |
487 | 8 | std::move($4) | |
488 | 8 | ); | |
489 | PRINT_NONTERMINALS($$); | ||
490 | } | ||
491 | ; | ||
492 | |||
493 | |||
494 | opt_struct_initializer_list | ||
495 | : /**/ { | ||
496 | ✗ | $$ = std::make_unique<Gyoji::frontend::tree::StructInitializerList>(return_data.compiler_context.get_token_stream().get_current_source_ref()); | |
497 | PRINT_NONTERMINALS($$); | ||
498 | } | ||
499 | | struct_initializer_list { | ||
500 | 8 | $$ = std::move($1); | |
501 | PRINT_NONTERMINALS($$); | ||
502 | } | ||
503 | ; | ||
504 | |||
505 | struct_initializer_list | ||
506 | : struct_initializer { | ||
507 | 8 | $$ = std::make_unique<Gyoji::frontend::tree::StructInitializerList>($1->get_source_ref()); | |
508 | 8 | $$->add_initializer(std::move($1)); | |
509 | PRINT_NONTERMINALS($$); | ||
510 | } | ||
511 | | struct_initializer_list struct_initializer { | ||
512 | 8 | $$ = std::move($1); | |
513 | 8 | $$->add_initializer(std::move($2)); | |
514 | PRINT_NONTERMINALS($$); | ||
515 | } | ||
516 | ; | ||
517 | |||
518 | struct_initializer | ||
519 | : DOT IDENTIFIER global_initializer SEMICOLON { | ||
520 | 16 | $2->set_identifier_type(Gyoji::frontend::tree::Terminal::IDENTIFIER_LOCAL_SCOPE); | |
521 | |||
522 | 32 | $$ = std::make_unique<Gyoji::frontend::tree::StructInitializer>( | |
523 | 16 | std::move($1), | |
524 | 16 | std::move($2), | |
525 | 16 | std::move($3), | |
526 | 16 | std::move($4) | |
527 | 16 | ); | |
528 | PRINT_NONTERMINALS($$); | ||
529 | } | ||
530 | ; | ||
531 | |||
532 | opt_access_modifier | ||
533 | : /**/ { | ||
534 | 1300 | $$ = std::make_unique<Gyoji::frontend::tree::AccessModifier>(return_data.compiler_context.get_token_stream().get_current_source_ref()); | |
535 | PRINT_NONTERMINALS($$); | ||
536 | } | ||
537 | | access_modifier { | ||
538 | 596 | $$ = std::make_unique<Gyoji::frontend::tree::AccessModifier>( | |
539 | 298 | std::move($1) | |
540 | 298 | ); | |
541 | PRINT_NONTERMINALS($$); | ||
542 | } | ||
543 | ; | ||
544 | |||
545 | access_modifier | ||
546 | : PUBLIC { | ||
547 | 230 | $$ = std::move($1); | |
548 | PRINT_NONTERMINALS($$); | ||
549 | } | ||
550 | | PRIVATE { | ||
551 | 50 | $$ = std::move($1); | |
552 | PRINT_NONTERMINALS($$); | ||
553 | } | ||
554 | | PROTECTED { | ||
555 | 18 | $$ = std::move($1); | |
556 | PRINT_NONTERMINALS($$); | ||
557 | } | ||
558 | ; | ||
559 | |||
560 | namespace_declaration | ||
561 | : opt_access_modifier NAMESPACE IDENTIFIER { | ||
562 | 118 | Gyoji::frontend::namespaces::NS2Entity *ns = return_data.namespace_get_or_create($3->get_value(), $3->get_source_ref()); | |
563 | 118 | $3->set_ns2_entity(ns); | |
564 | 118 | return_data.ns2_context->namespace_push(ns); | |
565 | |||
566 | 236 | $$ = std::make_unique<Gyoji::frontend::tree::NamespaceDeclaration>( | |
567 | 118 | std::move($1), | |
568 | 118 | std::move($2), | |
569 | 118 | std::move($3) | |
570 | 118 | ); | |
571 | |||
572 | PRINT_NONTERMINALS($$); | ||
573 | } | ||
574 | | opt_access_modifier NAMESPACE NAMESPACE_NAME { | ||
575 | ✗ | Gyoji::frontend::namespaces::NS2Entity *ns = return_data.ns2_context->namespace_find($3->get_value()); | |
576 | ✗ | return_data.ns2_context->namespace_push(ns); | |
577 | |||
578 | ✗ | $$ = std::make_unique<Gyoji::frontend::tree::NamespaceDeclaration>( | |
579 | ✗ | std::move($1), | |
580 | ✗ | std::move($2), | |
581 | ✗ | std::move($3) | |
582 | ✗ | ); | |
583 | PRINT_NONTERMINALS($$); | ||
584 | } | ||
585 | ; | ||
586 | |||
587 | file_statement_namespace | ||
588 | : namespace_declaration BRACE_L opt_file_statement_list BRACE_R SEMICOLON { | ||
589 | 236 | $$ = std::make_unique<Gyoji::frontend::tree::FileStatementNamespace>( | |
590 | 118 | std::move($1), | |
591 | 118 | std::move($2), | |
592 | 118 | std::move($3), | |
593 | 118 | std::move($4), | |
594 | 118 | std::move($5) | |
595 | 118 | ); | |
596 | 118 | return_data.ns2_context->namespace_pop(); | |
597 | PRINT_NONTERMINALS($$); | ||
598 | } | ||
599 | ; | ||
600 | |||
601 | opt_as | ||
602 | : /**/ { | ||
603 | 34 | $$ = std::make_unique<Gyoji::frontend::tree::UsingAs>(return_data.compiler_context.get_token_stream().get_current_source_ref()); | |
604 | PRINT_NONTERMINALS($$); | ||
605 | } | ||
606 | | AS IDENTIFIER { | ||
607 | 24 | $$ = std::make_unique<Gyoji::frontend::tree::UsingAs>( | |
608 | 12 | std::move($1), | |
609 | 12 | std::move($2) | |
610 | 12 | ); | |
611 | PRINT_NONTERMINALS($$); | ||
612 | } | ||
613 | ; | ||
614 | |||
615 | file_statement_using | ||
616 | : opt_access_modifier USING NAMESPACE NAMESPACE_NAME opt_as SEMICOLON { | ||
617 | 38 | std::string namespace_name = $4->get_value(); | |
618 | 38 | std::string as_name = $5->get_using_name(); | |
619 | 38 | NS2Entity *entity = return_data.ns2_context->namespace_find(namespace_name); | |
620 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 38 times.
|
38 | if (entity == nullptr) { |
621 | ✗ | auto error = std::make_unique<Gyoji::context::Error>(std::string("Invalid identifier") + namespace_name + std::string(".")); | |
622 | ✗ | error->add_message($4->get_source_ref(), std::string("") + namespace_name + std::string(" is not a namespace.")); | |
623 | ✗ | return_data.get_compiler_context().get_errors().add_error(std::move(error)); | |
624 | ✗ | return -1; | |
625 | ✗ | } | |
626 | 38 | return_data.ns2_context->namespace_using(as_name, entity); | |
627 | |||
628 | 76 | $$ = std::make_unique<Gyoji::frontend::tree::FileStatementUsing>( | |
629 | 38 | std::move($1), | |
630 | 38 | std::move($2), | |
631 | 38 | std::move($3), | |
632 | 38 | std::move($4), | |
633 | 38 | std::move($5), | |
634 | 38 | std::move($6) | |
635 | 38 | ); | |
636 | PRINT_NONTERMINALS($$); | ||
637 |
2/4✓ Branch 1 taken 38 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 38 times.
✗ Branch 5 not taken.
|
38 | } |
638 | | opt_access_modifier USING NAMESPACE TYPE_NAME opt_as SEMICOLON { | ||
639 | 8 | std::string namespace_name = $4->get_value(); | |
640 | 8 | std::string as_name = $5->get_using_name(); | |
641 | |||
642 | 8 | NS2Entity *entity = return_data.ns2_context->namespace_find(namespace_name); | |
643 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 8 times.
|
8 | if (entity == nullptr) { |
644 | ✗ | auto error = std::make_unique<Gyoji::context::Error>(std::string("Invalid identifier") + namespace_name + std::string(".")); | |
645 | ✗ | error->add_message($4->get_source_ref(), std::string("") + namespace_name + std::string(" is not a namespace.")); | |
646 | ✗ | return_data.get_compiler_context().get_errors().add_error(std::move(error)); | |
647 | ✗ | return -1; | |
648 | ✗ | } | |
649 | 8 | return_data.ns2_context->namespace_using(as_name, entity); | |
650 | |||
651 | 16 | $$ = std::make_unique<Gyoji::frontend::tree::FileStatementUsing>( | |
652 | 8 | std::move($1), | |
653 | 8 | std::move($2), | |
654 | 8 | std::move($3), | |
655 | 8 | std::move($4), | |
656 | 8 | std::move($5), | |
657 | 8 | std::move($6) | |
658 | 8 | ); | |
659 | PRINT_NONTERMINALS($$); | ||
660 |
2/4✓ Branch 1 taken 8 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 8 times.
✗ Branch 5 not taken.
|
8 | } |
661 | ; | ||
662 | |||
663 | // If this is the first time we see the declaration, | ||
664 | // it will be an identifier. Once the class has been | ||
665 | // seen before (forward-declared), it will then become | ||
666 | // a type instead of an identifier. | ||
667 | class_decl_start | ||
668 | : opt_access_modifier CLASS IDENTIFIER opt_class_argument_list { | ||
669 | 138 | NS2Entity *ns2_entity = return_data.class_get_or_create($3->get_value(), $3->get_source_ref()); | |
670 | 138 | $3->set_ns2_entity(ns2_entity); | |
671 | 138 | return_data.ns2_context->namespace_push(ns2_entity); | |
672 | 276 | $$ = std::make_unique<Gyoji::frontend::tree::ClassDeclStart>( | |
673 | 138 | std::move($1), | |
674 | 138 | std::move($2), | |
675 | 138 | std::move($3), | |
676 | 138 | std::move($4), | |
677 | 276 | true // is_identifier | |
678 | 138 | ); | |
679 | |||
680 | |||
681 | PRINT_NONTERMINALS($$); | ||
682 | } | ||
683 | | opt_access_modifier CLASS TYPE_NAME opt_class_argument_list { | ||
684 | 46 | return_data.ns2_context->namespace_push($3->get_ns2_entity()); | |
685 | 92 | $$ = std::make_unique<Gyoji::frontend::tree::ClassDeclStart>( | |
686 | 46 | std::move($1), | |
687 | 46 | std::move($2), | |
688 | 46 | std::move($3), | |
689 | 46 | std::move($4), | |
690 | 92 | false // is_identifier | |
691 | 46 | ); | |
692 | } | ||
693 | ; | ||
694 | |||
695 | opt_class_argument_list | ||
696 | : /**/ { | ||
697 | 184 | $$ = std::make_unique<Gyoji::frontend::tree::ClassArgumentList>(return_data.compiler_context.get_token_stream().get_current_source_ref()); | |
698 | PRINT_NONTERMINALS($$); | ||
699 | } | ||
700 | | PAREN_L class_argument_list PAREN_R { | ||
701 | ✗ | $$ = std::move($2); | |
702 | ✗ | $$->add_parens(std::move($1), std::move($3)); | |
703 | PRINT_NONTERMINALS($$); | ||
704 | } | ||
705 | ; | ||
706 | |||
707 | // At this stage, the arguments | ||
708 | // are identifiers. Once they are | ||
709 | // recognized, they are turned into | ||
710 | // types scoped private in the class. | ||
711 | class_argument_list | ||
712 | : IDENTIFIER { | ||
713 | ✗ | NS2Entity *ns2_entity = return_data.identifier_get_or_create($1->get_value(), true, $1->get_source_ref()); | |
714 | ✗ | $1->set_ns2_entity(ns2_entity); | |
715 | ✗ | $$ = std::make_unique<Gyoji::frontend::tree::ClassArgumentList>( | |
716 | ✗ | std::move($1) | |
717 | ✗ | ); | |
718 | PRINT_NONTERMINALS($$); | ||
719 | } | ||
720 | | class_argument_list COMMA IDENTIFIER { | ||
721 | ✗ | NS2Entity *ns2_entity = return_data.identifier_get_or_create($3->get_value(), true, $3->get_source_ref()); | |
722 | ✗ | $3->set_ns2_entity(ns2_entity); | |
723 | ✗ | $$ = std::move($1); | |
724 | ✗ | $$->add_argument(std::move($2), std::move($3)); | |
725 | PRINT_NONTERMINALS($$); | ||
726 | } | ||
727 | ; | ||
728 | |||
729 | // Forwar-declaration of a class. | ||
730 | class_declaration | ||
731 | : class_decl_start SEMICOLON { | ||
732 | 112 | $$ = std::make_unique<Gyoji::frontend::tree::ClassDeclaration>( | |
733 | 56 | std::move($1), | |
734 | 56 | std::move($2) | |
735 | 56 | ); | |
736 | 56 | return_data.ns2_context->namespace_pop(); | |
737 | PRINT_NONTERMINALS($$); | ||
738 | } | ||
739 | ; | ||
740 | |||
741 | class_definition | ||
742 | : class_decl_start BRACE_L opt_class_member_declaration_list BRACE_R SEMICOLON { | ||
743 | 256 | $$ = std::make_unique<Gyoji::frontend::tree::ClassDefinition>( | |
744 | 128 | std::move($1), | |
745 | 128 | std::move($2), | |
746 | 128 | std::move($3), | |
747 | 128 | std::move($4), | |
748 | 128 | std::move($5) | |
749 | 128 | ); | |
750 | 128 | return_data.ns2_context->namespace_pop(); | |
751 | PRINT_NONTERMINALS($$); | ||
752 | } | ||
753 | ; | ||
754 | |||
755 | type_definition | ||
756 | : opt_access_modifier TYPEDEF type_specifier IDENTIFIER SEMICOLON { | ||
757 | 146 | Gyoji::frontend::namespaces::NS2Entity *ns2_entity = return_data.type_get_or_create($4->get_value(), $4->get_source_ref()); | |
758 | 146 | $4->set_ns2_entity(ns2_entity); | |
759 | 146 | fprintf(stderr, "Defined type %s\n", $4->get_fully_qualified_name().c_str()); | |
760 | 292 | $$ = std::make_unique<Gyoji::frontend::tree::TypeDefinition>( | |
761 | 146 | std::move($1), | |
762 | 146 | std::move($2), | |
763 | 146 | std::move($3), | |
764 | 146 | std::move($4), | |
765 | 146 | std::move($5) | |
766 | 146 | ); | |
767 | |||
768 | |||
769 | PRINT_NONTERMINALS($$); | ||
770 | } | ||
771 | ; | ||
772 | |||
773 | enum_definition | ||
774 | : opt_access_modifier ENUM TYPE_NAME IDENTIFIER BRACE_L opt_enum_value_list BRACE_R SEMICOLON { | ||
775 | 26 | Gyoji::frontend::namespaces::NS2Entity *ns2_entity = return_data.type_get_or_create($4->get_value(), $4->get_source_ref()); | |
776 | 26 | $4->set_ns2_entity(ns2_entity); | |
777 | 52 | $$ = std::make_unique<Gyoji::frontend::tree::EnumDefinition>( | |
778 | 26 | std::move($1), | |
779 | 26 | std::move($2), | |
780 | 26 | std::move($3), | |
781 | 26 | std::move($4), | |
782 | 26 | std::move($5), | |
783 | 26 | std::move($6), | |
784 | 26 | std::move($7), | |
785 | 26 | std::move($8) | |
786 | 26 | ); | |
787 | PRINT_NONTERMINALS($$); | ||
788 | } | ||
789 | ; | ||
790 | |||
791 | opt_enum_value_list | ||
792 | : /**/ { | ||
793 | ✗ | $$ = std::make_unique<Gyoji::frontend::tree::EnumDefinitionValueList>(return_data.compiler_context.get_token_stream().get_current_source_ref()); | |
794 | PRINT_NONTERMINALS($$); | ||
795 | } | ||
796 | | enum_value_list { | ||
797 | 26 | $$ = std::move($1); | |
798 | PRINT_NONTERMINALS($$); | ||
799 | } | ||
800 | ; | ||
801 | |||
802 | enum_value_list | ||
803 | : enum_value { | ||
804 | 26 | $$ = std::make_unique<Gyoji::frontend::tree::EnumDefinitionValueList>(return_data.compiler_context.get_token_stream().get_current_source_ref()); | |
805 | 26 | $$->add_value(std::move($1)); | |
806 | PRINT_NONTERMINALS($$); | ||
807 | } | ||
808 | | enum_value_list enum_value { | ||
809 | 42 | $$ = std::move($1); | |
810 | 42 | $$->add_value(std::move($2)); | |
811 | PRINT_NONTERMINALS($$); | ||
812 | } | ||
813 | ; | ||
814 | |||
815 | enum_value | ||
816 | : IDENTIFIER ASSIGNMENT expression_primary SEMICOLON { | ||
817 | 68 | Gyoji::frontend::namespaces::NS2Entity *ns2_entity = return_data.type_get_or_create($1->get_value(), $1->get_source_ref()); | |
818 | 68 | $1->set_ns2_entity(ns2_entity); | |
819 | 136 | $$ = std::make_unique<Gyoji::frontend::tree::EnumDefinitionValue>( | |
820 | 68 | std::move($1), | |
821 | 68 | std::move($2), | |
822 | 68 | std::move($3), | |
823 | 68 | std::move($4) | |
824 | 68 | ); | |
825 | PRINT_NONTERMINALS($$); | ||
826 | } | ||
827 | ; | ||
828 | |||
829 | opt_unsafe | ||
830 | : /**/ { | ||
831 | 788 | $$ = std::make_unique<Gyoji::frontend::tree::UnsafeModifier>(return_data.compiler_context.get_token_stream().get_current_source_ref()); | |
832 | PRINT_NONTERMINALS($$); | ||
833 | } | ||
834 | | UNSAFE { | ||
835 | 28 | $$ = std::make_unique<Gyoji::frontend::tree::UnsafeModifier>(std::move($1)); | |
836 | PRINT_NONTERMINALS($$); | ||
837 | } | ||
838 | ; | ||
839 | |||
840 | file_statement_function_declaration | ||
841 | : function_decl_start PAREN_L opt_function_definition_arg_list PAREN_R SEMICOLON { | ||
842 | // This is the point at which we need to fully-qualify our symbol name | ||
843 | // because it may be in a namespace and we need to find it unambiguously | ||
844 | // in a possibly large namespace. We don't want the MIR or code-gen layers | ||
845 | // to have to care about how we name functions. | ||
846 | // In future, we may support name mangling, but again, that's not the concern of the | ||
847 | // back-end layers. | ||
848 | 448 | $$ = std::make_unique<Gyoji::frontend::tree::FileStatementFunctionDeclaration>( | |
849 | 224 | std::move($1), | |
850 | 224 | std::move($2), | |
851 | 224 | std::move($3), | |
852 | 224 | std::move($4), | |
853 | 224 | std::move($5) | |
854 | 224 | ); | |
855 | 224 | return_data.ns2_context->namespace_pop(); | |
856 | PRINT_NONTERMINALS($$); | ||
857 | } | ||
858 | ; | ||
859 | |||
860 | function_decl_start | ||
861 | : opt_access_modifier opt_unsafe type_specifier IDENTIFIER { | ||
862 | 668 | NS2Entity *ns2_entity = return_data.identifier_get_or_create($4->get_value(), true, $4->get_source_ref()); | |
863 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 668 times.
|
668 | if (ns2_entity == nullptr) { |
864 | ✗ | return -1; | |
865 | } | ||
866 | 668 | $4->set_ns2_entity(ns2_entity); | |
867 | 668 | return_data.ns2_context->namespace_push(ns2_entity); | |
868 | 1336 | $$ = std::make_unique<Gyoji::frontend::tree::FileStatementFunctionDeclStart>( | |
869 | 668 | std::move($1), | |
870 | 668 | std::move($2), | |
871 | 668 | std::move($3), | |
872 | 668 | std::move($4) | |
873 | 668 | ); | |
874 | } | ||
875 | ; | ||
876 | |||
877 | file_statement_function_definition | ||
878 | : function_decl_start PAREN_L opt_function_definition_arg_list PAREN_R scope_body { | ||
879 | // This is the point at which we need to fully-qualify our symbol name | ||
880 | // because it may be in a namespace and we need to find it unambiguously | ||
881 | // in a possibly large namespace. We don't want the MIR or code-gen layers | ||
882 | // to have to care about how we name functions. | ||
883 | // In future, we may support name mangling, but again, that's not the concern of the | ||
884 | // back-end layers. | ||
885 | |||
886 | // For a function definition, we may want to also 'push' the namespace | ||
887 | // resolution context for a class if the identifier is declared inside | ||
888 | // a class' namespace. but that needs to happen before we actually push the scope | ||
889 | // and function identifiers. | ||
890 | |||
891 | 888 | $$ = std::make_unique<Gyoji::frontend::tree::FileStatementFunctionDefinition>( | |
892 | 444 | std::move($1), | |
893 | 444 | std::move($2), | |
894 | 444 | std::move($3), | |
895 | 444 | std::move($4), | |
896 | 444 | std::move($5) | |
897 | 444 | ); | |
898 | 444 | return_data.ns2_context->namespace_pop(); | |
899 | PRINT_NONTERMINALS($$); | ||
900 | } | ||
901 | ; | ||
902 | |||
903 | opt_function_definition_arg_list | ||
904 | : /**/ { | ||
905 | 110 | $$ = std::make_unique<Gyoji::frontend::tree::FunctionDefinitionArgList>(return_data.compiler_context.get_token_stream().get_current_source_ref()); | |
906 | PRINT_NONTERMINALS($$); | ||
907 | } | ||
908 | | function_definition_arg_list { | ||
909 | 592 | $$ = std::move($1); | |
910 | PRINT_NONTERMINALS($$); | ||
911 | } | ||
912 | ; | ||
913 | |||
914 | function_definition_arg_list | ||
915 | : function_definition_arg { | ||
916 | 592 | $$ = std::make_unique<Gyoji::frontend::tree::FunctionDefinitionArgList>($1->get_source_ref()); | |
917 | 592 | $$->add_argument(std::move($1)); | |
918 | PRINT_NONTERMINALS($$); | ||
919 | } | ||
920 | | function_definition_arg_list COMMA function_definition_arg { | ||
921 | 502 | $$ = std::move($1); | |
922 | 502 | $$->add_comma(std::move($2)); | |
923 | 502 | $$->add_argument(std::move($3)); | |
924 | PRINT_NONTERMINALS($$); | ||
925 | } | ||
926 | ; | ||
927 | function_definition_arg | ||
928 | : type_specifier IDENTIFIER { | ||
929 | 1094 | NS2Entity *ns2_entity = return_data.identifier_get_or_create($2->get_value(), true, $2->get_source_ref()); | |
930 | 1094 | $2->set_ns2_entity(ns2_entity); | |
931 | 2188 | $$ = std::make_unique<Gyoji::frontend::tree::FunctionDefinitionArg>( | |
932 | 1094 | std::move($1), | |
933 | 1094 | std::move($2) | |
934 | 1094 | ); | |
935 | PRINT_NONTERMINALS($$); | ||
936 | } | ||
937 | ; | ||
938 | |||
939 | scope_body | ||
940 | : BRACE_L statement_list BRACE_R { | ||
941 | 1648 | $$ = std::make_unique<Gyoji::frontend::tree::ScopeBody>( | |
942 | 824 | std::move($1), | |
943 | 824 | std::move($2), | |
944 | 824 | std::move($3) | |
945 | 824 | ); | |
946 | PRINT_NONTERMINALS($$); | ||
947 | } | ||
948 | ; | ||
949 | |||
950 | statement_list | ||
951 | : /**/ { | ||
952 | 824 | $$ = std::make_unique<Gyoji::frontend::tree::StatementList>(return_data.compiler_context.get_token_stream().get_current_source_ref()); | |
953 | PRINT_NONTERMINALS($$); | ||
954 | } | ||
955 | | statement_list statement { | ||
956 | 3220 | $$ = std::move($1); | |
957 | 3220 | $$->add_statement(std::move($2)); | |
958 | PRINT_NONTERMINALS($$); | ||
959 | } | ||
960 | ; | ||
961 | |||
962 | statement | ||
963 | : statement_variable_declaration { | ||
964 | 516 | const Gyoji::frontend::ast::SyntaxNode &sn = *($1); | |
965 | 516 | $$ = std::make_unique<Gyoji::frontend::tree::Statement>(std::move($1), sn); | |
966 | PRINT_NONTERMINALS($$); | ||
967 | } | ||
968 | | statement_block { | ||
969 | 22 | const Gyoji::frontend::ast::SyntaxNode &sn = *($1); | |
970 | 22 | $$ = std::make_unique<Gyoji::frontend::tree::Statement>(std::move($1), sn); | |
971 | PRINT_NONTERMINALS($$); | ||
972 | } | ||
973 | | statement_expression { | ||
974 | 1918 | const Gyoji::frontend::ast::SyntaxNode &sn = *($1); | |
975 | 1918 | $$ = std::make_unique<Gyoji::frontend::tree::Statement>(std::move($1), sn); | |
976 | PRINT_NONTERMINALS($$); | ||
977 | } | ||
978 | | statement_ifelse { | ||
979 | 186 | const Gyoji::frontend::ast::SyntaxNode &sn = *($1); | |
980 | 186 | $$ = std::make_unique<Gyoji::frontend::tree::Statement>(std::move($1), sn); | |
981 | PRINT_NONTERMINALS($$); | ||
982 | } | ||
983 | | statement_while { | ||
984 | 34 | const Gyoji::frontend::ast::SyntaxNode &sn = *($1); | |
985 | 34 | $$ = std::make_unique<Gyoji::frontend::tree::Statement>(std::move($1), sn); | |
986 | PRINT_NONTERMINALS($$); | ||
987 | } | ||
988 | | statement_for { | ||
989 | 2 | const Gyoji::frontend::ast::SyntaxNode &sn = *($1); | |
990 | 2 | $$ = std::make_unique<Gyoji::frontend::tree::Statement>(std::move($1), sn); | |
991 | PRINT_NONTERMINALS($$); | ||
992 | } | ||
993 | | statement_switch { | ||
994 | 8 | const Gyoji::frontend::ast::SyntaxNode &sn = *($1); | |
995 | 8 | $$ = std::make_unique<Gyoji::frontend::tree::Statement>(std::move($1), sn); | |
996 | PRINT_NONTERMINALS($$); | ||
997 | } | ||
998 | | statement_label { | ||
999 | 10 | const Gyoji::frontend::ast::SyntaxNode &sn = *($1); | |
1000 | 10 | $$ = std::make_unique<Gyoji::frontend::tree::Statement>(std::move($1), sn); | |
1001 | PRINT_NONTERMINALS($$); | ||
1002 | } | ||
1003 | | statement_goto { | ||
1004 | 10 | const Gyoji::frontend::ast::SyntaxNode &sn = *($1); | |
1005 | 10 | $$ = std::make_unique<Gyoji::frontend::tree::Statement>(std::move($1), sn); | |
1006 | PRINT_NONTERMINALS($$); | ||
1007 | } | ||
1008 | | statement_break { | ||
1009 | 10 | const Gyoji::frontend::ast::SyntaxNode &sn = *($1); | |
1010 | 10 | $$ = std::make_unique<Gyoji::frontend::tree::Statement>(std::move($1), sn); | |
1011 | PRINT_NONTERMINALS($$); | ||
1012 | } | ||
1013 | | statement_continue { | ||
1014 | 10 | const Gyoji::frontend::ast::SyntaxNode &sn = *($1); | |
1015 | 10 | $$ = std::make_unique<Gyoji::frontend::tree::Statement>(std::move($1), sn); | |
1016 | PRINT_NONTERMINALS($$); | ||
1017 | } | ||
1018 | | statement_return { | ||
1019 | 494 | const Gyoji::frontend::ast::SyntaxNode &sn = *($1); | |
1020 | 494 | $$ = std::make_unique<Gyoji::frontend::tree::Statement>(std::move($1), sn); | |
1021 | PRINT_NONTERMINALS($$); | ||
1022 | } | ||
1023 | ; | ||
1024 | |||
1025 | initializer_expression | ||
1026 | : /**/ { | ||
1027 | 496 | $$ = std::make_unique<Gyoji::frontend::tree::InitializerExpression>(return_data.compiler_context.get_token_stream().get_current_source_ref()); | |
1028 | PRINT_NONTERMINALS($$); | ||
1029 | } | ||
1030 | | ASSIGNMENT expression { | ||
1031 | 40 | $$ = std::make_unique<Gyoji::frontend::tree::InitializerExpression>( | |
1032 | 20 | std::move($1), | |
1033 | 20 | std::move($2) | |
1034 | 20 | ); | |
1035 | PRINT_NONTERMINALS($$); | ||
1036 | } | ||
1037 | ; | ||
1038 | |||
1039 | statement_variable_declaration | ||
1040 | : type_specifier IDENTIFIER initializer_expression SEMICOLON { | ||
1041 | 516 | NS2Entity *ns2_entity = return_data.identifier_get_or_create($2->get_value(), true, $2->get_source_ref()); | |
1042 | 516 | $2->set_ns2_entity(ns2_entity); | |
1043 | 1032 | $$ = std::make_unique<Gyoji::frontend::tree::StatementVariableDeclaration>( | |
1044 | 516 | std::move($1), | |
1045 | 516 | std::move($2), | |
1046 | 516 | std::move($3), | |
1047 | 516 | std::move($4) | |
1048 | 516 | ); | |
1049 | PRINT_NONTERMINALS($$); | ||
1050 | } | ||
1051 | ; | ||
1052 | |||
1053 | statement_block | ||
1054 | : opt_unsafe scope_body { | ||
1055 | 44 | $$ = std::make_unique<Gyoji::frontend::tree::StatementBlock>( | |
1056 | 22 | std::move($1), | |
1057 | 22 | std::move($2) | |
1058 | 22 | ); | |
1059 | PRINT_NONTERMINALS($$); | ||
1060 | } | ||
1061 | ; | ||
1062 | |||
1063 | statement_expression | ||
1064 | : expression SEMICOLON { | ||
1065 | 3836 | $$ = std::make_unique<Gyoji::frontend::tree::StatementExpression>( | |
1066 | 1918 | std::move($1), | |
1067 | 1918 | std::move($2) | |
1068 | 1918 | ); | |
1069 | PRINT_NONTERMINALS($$); | ||
1070 | } | ||
1071 | ; | ||
1072 | statement_goto | ||
1073 | : GOTO IDENTIFIER SEMICOLON { | ||
1074 | 10 | NS2Entity *ns2_entity = return_data.identifier_get_or_create($2->get_value(), true, $2->get_source_ref()); | |
1075 | 10 | $2->set_ns2_entity(ns2_entity); | |
1076 | 20 | $$ = std::make_unique<Gyoji::frontend::tree::StatementGoto>( | |
1077 | 10 | std::move($1), | |
1078 | 10 | std::move($2), | |
1079 | 10 | std::move($3) | |
1080 | 10 | ); | |
1081 | PRINT_NONTERMINALS($$); | ||
1082 | } | ||
1083 | ; | ||
1084 | statement_break | ||
1085 | : BREAK SEMICOLON { | ||
1086 | 20 | $$ = std::make_unique<Gyoji::frontend::tree::StatementBreak>( | |
1087 | 10 | std::move($1), | |
1088 | 10 | std::move($2) | |
1089 | 10 | ); | |
1090 | PRINT_NONTERMINALS($$); | ||
1091 | } | ||
1092 | ; | ||
1093 | statement_continue | ||
1094 | : CONTINUE SEMICOLON { | ||
1095 | 20 | $$ = std::make_unique<Gyoji::frontend::tree::StatementContinue>( | |
1096 | 10 | std::move($1), | |
1097 | 10 | std::move($2) | |
1098 | 10 | ); | |
1099 | PRINT_NONTERMINALS($$); | ||
1100 | } | ||
1101 | ; | ||
1102 | statement_label | ||
1103 | : LABEL IDENTIFIER COLON { | ||
1104 | 10 | NS2Entity *ns2_entity = return_data.identifier_get_or_create($2->get_value(), true, $2->get_source_ref()); | |
1105 | 10 | $2->set_ns2_entity(ns2_entity); | |
1106 | 20 | $$ = std::make_unique<Gyoji::frontend::tree::StatementLabel>( | |
1107 | 10 | std::move($1), | |
1108 | 10 | std::move($2), | |
1109 | 10 | std::move($3) | |
1110 | 10 | ); | |
1111 | PRINT_NONTERMINALS($$); | ||
1112 | } | ||
1113 | ; | ||
1114 | |||
1115 | statement_return | ||
1116 | : RETURN expression SEMICOLON { | ||
1117 | 984 | $$ = std::make_unique<Gyoji::frontend::tree::StatementReturn>( | |
1118 | 492 | std::move($1), | |
1119 | 492 | std::move($2), | |
1120 | 492 | std::move($3) | |
1121 | 492 | ); | |
1122 | PRINT_NONTERMINALS($$); | ||
1123 | } | ||
1124 | | RETURN SEMICOLON { | ||
1125 | 4 | $$ = std::make_unique<Gyoji::frontend::tree::StatementReturn>( | |
1126 | 2 | std::move($1), | |
1127 | 2 | std::move($2) | |
1128 | 2 | ); | |
1129 | PRINT_NONTERMINALS($$); | ||
1130 | } | ||
1131 | |||
1132 | ; | ||
1133 | |||
1134 | statement_ifelse | ||
1135 | : IF PAREN_L expression PAREN_R scope_body { | ||
1136 | 228 | $$ = std::make_unique<Gyoji::frontend::tree::StatementIfElse>( | |
1137 | 114 | std::move($1), | |
1138 | 114 | std::move($2), | |
1139 | 114 | std::move($3), | |
1140 | 114 | std::move($4), | |
1141 | 114 | std::move($5) | |
1142 | 114 | ); | |
1143 | PRINT_NONTERMINALS($$); | ||
1144 | } | ||
1145 | | IF PAREN_L expression PAREN_R scope_body ELSE statement_ifelse { | ||
1146 | 64 | $$ = std::make_unique<Gyoji::frontend::tree::StatementIfElse>( | |
1147 | 32 | std::move($1), | |
1148 | 32 | std::move($2), | |
1149 | 32 | std::move($3), | |
1150 | 32 | std::move($4), | |
1151 | 32 | std::move($5), | |
1152 | 32 | std::move($6), | |
1153 | 32 | std::move($7) | |
1154 | 32 | ); | |
1155 | PRINT_NONTERMINALS($$); | ||
1156 | } | ||
1157 | | IF PAREN_L expression PAREN_R scope_body ELSE scope_body { | ||
1158 | 144 | $$ = std::make_unique<Gyoji::frontend::tree::StatementIfElse>( | |
1159 | 72 | std::move($1), | |
1160 | 72 | std::move($2), | |
1161 | 72 | std::move($3), | |
1162 | 72 | std::move($4), | |
1163 | 72 | std::move($5), | |
1164 | 72 | std::move($6), | |
1165 | 72 | std::move($7) | |
1166 | 72 | ); | |
1167 | PRINT_NONTERMINALS($$); | ||
1168 | } | ||
1169 | ; | ||
1170 | |||
1171 | statement_while | ||
1172 | : WHILE PAREN_L expression PAREN_R scope_body { | ||
1173 | 68 | $$ = std::make_unique<Gyoji::frontend::tree::StatementWhile>( | |
1174 | 34 | std::move($1), | |
1175 | 34 | std::move($2), | |
1176 | 34 | std::move($3), | |
1177 | 34 | std::move($4), | |
1178 | 34 | std::move($5) | |
1179 | 34 | ); | |
1180 | PRINT_NONTERMINALS($$); | ||
1181 | } | ||
1182 | ; | ||
1183 | |||
1184 | statement_for | ||
1185 | : FOR PAREN_L expression SEMICOLON expression SEMICOLON expression PAREN_R scope_body { | ||
1186 | // This variation is just a plain expression. | ||
1187 | ✗ | $$ = std::make_unique<Gyoji::frontend::tree::StatementFor>( | |
1188 | ✗ | std::move($1), | |
1189 | ✗ | std::move($2), | |
1190 | ✗ | std::move($3), | |
1191 | ✗ | std::move($4), | |
1192 | ✗ | std::move($5), | |
1193 | ✗ | std::move($6), | |
1194 | ✗ | std::move($7), | |
1195 | ✗ | std::move($8), | |
1196 | ✗ | std::move($9) | |
1197 | ✗ | ); | |
1198 | PRINT_NONTERMINALS($$); | ||
1199 | } | ||
1200 | | FOR PAREN_L type_specifier IDENTIFIER ASSIGNMENT expression SEMICOLON expression SEMICOLON expression PAREN_R scope_body { | ||
1201 | 2 | NS2Entity *ns2_entity = return_data.identifier_get_or_create($4->get_value(), true, $4->get_source_ref()); | |
1202 | 2 | $2->set_ns2_entity(ns2_entity); | |
1203 | // This variation is a declaration and assignment | ||
1204 | 4 | $$ = std::make_unique<Gyoji::frontend::tree::StatementFor>( | |
1205 | 2 | std::move($1), | |
1206 | 2 | std::move($2), | |
1207 | 2 | std::move($3), | |
1208 | 2 | std::move($4), | |
1209 | 2 | std::move($5), | |
1210 | 2 | std::move($6), | |
1211 | 2 | std::move($7), | |
1212 | 2 | std::move($8), | |
1213 | 2 | std::move($9), | |
1214 | 2 | std::move($10), | |
1215 | 2 | std::move($11), | |
1216 | 2 | std::move($12) | |
1217 | 2 | ); | |
1218 | PRINT_NONTERMINALS($$); | ||
1219 | } | ||
1220 | ; | ||
1221 | |||
1222 | statement_switch | ||
1223 | : SWITCH PAREN_L expression PAREN_R BRACE_L opt_statement_switch_content BRACE_R { | ||
1224 | 16 | $$ = std::make_unique<Gyoji::frontend::tree::StatementSwitch>( | |
1225 | 8 | std::move($1), | |
1226 | 8 | std::move($2), | |
1227 | 8 | std::move($3), | |
1228 | 8 | std::move($4), | |
1229 | 8 | std::move($5), | |
1230 | 8 | std::move($6), | |
1231 | 8 | std::move($7) | |
1232 | 8 | ); | |
1233 | PRINT_NONTERMINALS($$); | ||
1234 | } | ||
1235 | ; | ||
1236 | |||
1237 | opt_statement_switch_content | ||
1238 | : /**/ { | ||
1239 | ✗ | $$ = std::make_unique<Gyoji::frontend::tree::StatementSwitchContent>(return_data.compiler_context.get_token_stream().get_current_source_ref()); | |
1240 | PRINT_NONTERMINALS($$); | ||
1241 | } | ||
1242 | | statement_switch_content { | ||
1243 | 8 | $$ = std::move($1); | |
1244 | PRINT_NONTERMINALS($$); | ||
1245 | } | ||
1246 | ; | ||
1247 | |||
1248 | statement_switch_content | ||
1249 | : statement_switch_block { | ||
1250 | 8 | $$ = std::make_unique<Gyoji::frontend::tree::StatementSwitchContent>($1->get_source_ref()); | |
1251 | 8 | $$->add_block(std::move($1)); | |
1252 | PRINT_NONTERMINALS($$); | ||
1253 | } | ||
1254 | | statement_switch_content statement_switch_block { | ||
1255 | 24 | $$ = std::move($1); | |
1256 | 24 | $$->add_block(std::move($2)); | |
1257 | PRINT_NONTERMINALS($$); | ||
1258 | } | ||
1259 | ; | ||
1260 | |||
1261 | statement_switch_block | ||
1262 | : DEFAULT COLON scope_body { | ||
1263 | 16 | $$ = std::make_unique<Gyoji::frontend::tree::StatementSwitchBlock>( | |
1264 | 8 | std::move($1), | |
1265 | 8 | std::move($2), | |
1266 | 8 | std::move($3) | |
1267 | 8 | ); | |
1268 | PRINT_NONTERMINALS($$); | ||
1269 | } | ||
1270 | | CASE expression COLON scope_body { | ||
1271 | 48 | $$ = std::make_unique<Gyoji::frontend::tree::StatementSwitchBlock>( | |
1272 | 24 | std::move($1), | |
1273 | 24 | std::move($2), | |
1274 | 24 | std::move($3), | |
1275 | 24 | std::move($4) | |
1276 | 24 | ); | |
1277 | PRINT_NONTERMINALS($$); | ||
1278 | } | ||
1279 | ; | ||
1280 | |||
1281 | expression_primary | ||
1282 | : expression_primary_identifier { | ||
1283 | 3168 | const Gyoji::frontend::ast::SyntaxNode &sn = *($1); | |
1284 | 3168 | $$ = std::make_unique<Gyoji::frontend::tree::Expression>(std::move($1), sn); | |
1285 | PRINT_NONTERMINALS($$); | ||
1286 | } | ||
1287 | | expression_primary_nested { | ||
1288 | 76 | const Gyoji::frontend::ast::SyntaxNode &sn = *($1); | |
1289 | 76 | $$ = std::make_unique<Gyoji::frontend::tree::Expression>(std::move($1), sn); | |
1290 | PRINT_NONTERMINALS($$); | ||
1291 | } | ||
1292 | | expression_primary_literal_int { | ||
1293 | 1110 | const Gyoji::frontend::ast::SyntaxNode &sn = *($1); | |
1294 | 1110 | $$ = std::make_unique<Gyoji::frontend::tree::Expression>(std::move($1), sn); | |
1295 | PRINT_NONTERMINALS($$); | ||
1296 | } | ||
1297 | | expression_primary_literal_char { | ||
1298 | 168 | const Gyoji::frontend::ast::SyntaxNode &sn = *($1); | |
1299 | 168 | $$ = std::make_unique<Gyoji::frontend::tree::Expression>(std::move($1), sn); | |
1300 | PRINT_NONTERMINALS($$); | ||
1301 | } | ||
1302 | | expression_primary_literal_string { | ||
1303 | 122 | const Gyoji::frontend::ast::SyntaxNode &sn = *($1); | |
1304 | 122 | $$ = std::make_unique<Gyoji::frontend::tree::Expression>(std::move($1), sn); | |
1305 | PRINT_NONTERMINALS($$); | ||
1306 | } | ||
1307 | | expression_primary_literal_float { | ||
1308 | 78 | const Gyoji::frontend::ast::SyntaxNode &sn = *($1); | |
1309 | 78 | $$ = std::make_unique<Gyoji::frontend::tree::Expression>(std::move($1), sn); | |
1310 | PRINT_NONTERMINALS($$); | ||
1311 | } | ||
1312 | | expression_primary_literal_bool { | ||
1313 | ✗ | const Gyoji::frontend::ast::SyntaxNode &sn = *($1); | |
1314 | ✗ | $$ = std::make_unique<Gyoji::frontend::tree::Expression>(std::move($1), sn); | |
1315 | PRINT_NONTERMINALS($$); | ||
1316 | } | ||
1317 | | expression_primary_literal_null { | ||
1318 | ✗ | const Gyoji::frontend::ast::SyntaxNode &sn = *($1); | |
1319 | ✗ | $$ = std::make_unique<Gyoji::frontend::tree::Expression>(std::move($1), sn); | |
1320 | PRINT_NONTERMINALS($$); | ||
1321 | } | ||
1322 | ; | ||
1323 | |||
1324 | expression_primary_identifier | ||
1325 | : IDENTIFIER { | ||
1326 | 3168 | NS2Entity *ns2_entity = return_data.identifier_get_or_create($1->get_value(), true, $1->get_source_ref()); | |
1327 | 3168 | $1->set_ns2_entity(ns2_entity); | |
1328 | 3168 | $$ = std::make_unique<Gyoji::frontend::tree::ExpressionPrimaryIdentifier>(std::move($1)); | |
1329 | PRINT_NONTERMINALS($$); | ||
1330 | } | ||
1331 | ; | ||
1332 | |||
1333 | expression_primary_literal_int | ||
1334 | : LITERAL_INT { | ||
1335 | 1110 | $$ = std::make_unique<Gyoji::frontend::tree::ExpressionPrimaryLiteralInt>(std::move($1)); | |
1336 | PRINT_NONTERMINALS($$); | ||
1337 | } | ||
1338 | ; | ||
1339 | expression_primary_literal_char | ||
1340 | : LITERAL_CHAR { | ||
1341 | 168 | $$ = std::make_unique<Gyoji::frontend::tree::ExpressionPrimaryLiteralChar>(std::move($1)); | |
1342 | PRINT_NONTERMINALS($$); | ||
1343 | } | ||
1344 | ; | ||
1345 | expression_primary_literal_string | ||
1346 | : LITERAL_STRING { | ||
1347 | 122 | $$ = std::make_unique<Gyoji::frontend::tree::ExpressionPrimaryLiteralString>(std::move($1)); | |
1348 | PRINT_NONTERMINALS($$); | ||
1349 | } | ||
1350 | | expression_primary_literal_string LITERAL_STRING { | ||
1351 | 10 | $$ = std::move($1); | |
1352 | 10 | $$->add_string(std::move($2)); | |
1353 | PRINT_NONTERMINALS($$); | ||
1354 | } | ||
1355 | ; | ||
1356 | |||
1357 | expression_primary_literal_float | ||
1358 | : LITERAL_FLOAT { | ||
1359 | 78 | $$ = std::make_unique<Gyoji::frontend::tree::ExpressionPrimaryLiteralFloat>(std::move($1)); | |
1360 | PRINT_NONTERMINALS($$); | ||
1361 | } | ||
1362 | ; | ||
1363 | |||
1364 | expression_primary_literal_bool | ||
1365 | : LITERAL_BOOL { | ||
1366 | ✗ | $$ = std::make_unique<Gyoji::frontend::tree::ExpressionPrimaryLiteralBool>(std::move($1)); | |
1367 | PRINT_NONTERMINALS($$); | ||
1368 | } | ||
1369 | ; | ||
1370 | |||
1371 | expression_primary_literal_null | ||
1372 | : LITERAL_NULL { | ||
1373 | ✗ | $$ = std::make_unique<Gyoji::frontend::tree::ExpressionPrimaryLiteralNull>(std::move($1)); | |
1374 | PRINT_NONTERMINALS($$); | ||
1375 | } | ||
1376 | ; | ||
1377 | |||
1378 | expression_primary_nested | ||
1379 | : PAREN_L expression PAREN_R { | ||
1380 | 152 | $$ = std::make_unique<Gyoji::frontend::tree::ExpressionPrimaryNested>( | |
1381 | 76 | std::move($1), | |
1382 | 76 | std::move($2), | |
1383 | 76 | std::move($3) | |
1384 | 76 | ); | |
1385 | PRINT_NONTERMINALS($$); | ||
1386 | } | ||
1387 | ; | ||
1388 | |||
1389 | expression_postfix | ||
1390 | : expression_postfix_primary { | ||
1391 | 4638 | $$ = std::move($1); | |
1392 | PRINT_NONTERMINALS($$); | ||
1393 | } | ||
1394 | | expression_postfix_arrayindex { | ||
1395 | 58 | $$ = std::move($1); | |
1396 | PRINT_NONTERMINALS($$); | ||
1397 | } | ||
1398 | | expression_postfix_function_call { | ||
1399 | 450 | $$ = std::move($1); | |
1400 | PRINT_NONTERMINALS($$); | ||
1401 | } | ||
1402 | | expression_postfix_dot { | ||
1403 | 66 | $$ = std::move($1); | |
1404 | PRINT_NONTERMINALS($$); | ||
1405 | } | ||
1406 | | expression_postfix_arrow { | ||
1407 | 50 | $$ = std::move($1); | |
1408 | PRINT_NONTERMINALS($$); | ||
1409 | } | ||
1410 | | expression_postfix_increment { | ||
1411 | 210 | $$ = std::move($1); | |
1412 | PRINT_NONTERMINALS($$); | ||
1413 | } | ||
1414 | | expression_postfix_decrement { | ||
1415 | 72 | $$ = std::move($1); | |
1416 | PRINT_NONTERMINALS($$); | ||
1417 | } | ||
1418 | ; | ||
1419 | |||
1420 | expression_postfix_primary | ||
1421 | : expression_primary { | ||
1422 | 4638 | $$ = std::move($1); | |
1423 | PRINT_NONTERMINALS($$); | ||
1424 | } | ||
1425 | ; | ||
1426 | |||
1427 | expression_postfix_arrayindex | ||
1428 | : expression_postfix BRACKET_L expression BRACKET_R { | ||
1429 | auto expr = std::make_unique<Gyoji::frontend::tree::ExpressionPostfixArrayIndex>( | ||
1430 | 58 | std::move($1), | |
1431 | 58 | std::move($2), | |
1432 | 58 | std::move($3), | |
1433 | 58 | std::move($4) | |
1434 | 58 | ); | |
1435 | 58 | const Gyoji::frontend::ast::SyntaxNode &sn = *(expr); | |
1436 | 58 | $$ = std::make_unique<Gyoji::frontend::tree::Expression>(std::move(expr), sn); | |
1437 | PRINT_NONTERMINALS($$); | ||
1438 | 58 | } | |
1439 | ; | ||
1440 | |||
1441 | expression_postfix_function_call | ||
1442 | : expression_postfix PAREN_L opt_argument_expression_list PAREN_R { | ||
1443 | auto expr = std::make_unique<Gyoji::frontend::tree::ExpressionPostfixFunctionCall>( | ||
1444 | 450 | std::move($1), | |
1445 | 450 | std::move($2), | |
1446 | 450 | std::move($3), | |
1447 | 450 | std::move($4) | |
1448 | 450 | ); | |
1449 | 450 | const Gyoji::frontend::ast::SyntaxNode &sn = *(expr); | |
1450 | 450 | $$ = std::make_unique<Gyoji::frontend::tree::Expression>(std::move(expr), sn); | |
1451 | PRINT_NONTERMINALS($$); | ||
1452 | 450 | } | |
1453 | ; | ||
1454 | |||
1455 | expression_postfix_dot | ||
1456 | : expression_postfix DOT IDENTIFIER { | ||
1457 | 66 | $3->set_identifier_type(Gyoji::frontend::tree::Terminal::IDENTIFIER_LOCAL_SCOPE); | |
1458 | auto expr = std::make_unique<Gyoji::frontend::tree::ExpressionPostfixDot>( | ||
1459 | 66 | std::move($1), | |
1460 | 66 | std::move($2), | |
1461 | 66 | std::move($3) | |
1462 | 66 | ); | |
1463 | 66 | const Gyoji::frontend::ast::SyntaxNode &sn = *(expr); | |
1464 | 66 | $$ = std::make_unique<Gyoji::frontend::tree::Expression>(std::move(expr), sn); | |
1465 | PRINT_NONTERMINALS($$); | ||
1466 | 66 | } | |
1467 | ; | ||
1468 | |||
1469 | expression_postfix_arrow | ||
1470 | : expression_postfix PTR_OP IDENTIFIER { | ||
1471 | 50 | $3->set_identifier_type(Gyoji::frontend::tree::Terminal::IDENTIFIER_LOCAL_SCOPE); | |
1472 | auto expr = std::make_unique<Gyoji::frontend::tree::ExpressionPostfixArrow>( | ||
1473 | 50 | std::move($1), | |
1474 | 50 | std::move($2), | |
1475 | 50 | std::move($3) | |
1476 | 50 | ); | |
1477 | 50 | const Gyoji::frontend::ast::SyntaxNode &sn = *(expr); | |
1478 | 50 | $$ = std::make_unique<Gyoji::frontend::tree::Expression>(std::move(expr), sn); | |
1479 | PRINT_NONTERMINALS($$); | ||
1480 | 50 | } | |
1481 | ; | ||
1482 | |||
1483 | expression_postfix_increment | ||
1484 | : expression_postfix INC_OP { | ||
1485 | auto expr = std::make_unique<Gyoji::frontend::tree::ExpressionPostfixIncDec>( | ||
1486 | 210 | std::move($1), | |
1487 | 210 | std::move($2), | |
1488 | 210 | Gyoji::frontend::tree::ExpressionPostfixIncDec::INCREMENT | |
1489 | 210 | ); | |
1490 | 210 | const Gyoji::frontend::ast::SyntaxNode &sn = *(expr); | |
1491 | 210 | $$ = std::make_unique<Gyoji::frontend::tree::Expression>(std::move(expr), sn); | |
1492 | PRINT_NONTERMINALS($$); | ||
1493 | 210 | } | |
1494 | ; | ||
1495 | |||
1496 | expression_postfix_decrement | ||
1497 | : expression_postfix DEC_OP { | ||
1498 | auto expr = std::make_unique<Gyoji::frontend::tree::ExpressionPostfixIncDec>( | ||
1499 | 72 | std::move($1), | |
1500 | 72 | std::move($2), | |
1501 | 72 | Gyoji::frontend::tree::ExpressionPostfixIncDec::DECREMENT | |
1502 | 72 | ); | |
1503 | 72 | const Gyoji::frontend::ast::SyntaxNode &sn = *(expr); | |
1504 | 72 | $$ = std::make_unique<Gyoji::frontend::tree::Expression>(std::move(expr), sn); | |
1505 | PRINT_NONTERMINALS($$); | ||
1506 | 72 | } | |
1507 | ; | ||
1508 | |||
1509 | expression_unary | ||
1510 | : expression_postfix { | ||
1511 | 4638 | $$ = std::move($1); | |
1512 | PRINT_NONTERMINALS($$); | ||
1513 | } | ||
1514 | | expression_unary_increment { | ||
1515 | 16 | $$ = std::move($1); | |
1516 | PRINT_NONTERMINALS($$); | ||
1517 | } | ||
1518 | | expression_unary_decrement { | ||
1519 | 72 | $$ = std::move($1); | |
1520 | PRINT_NONTERMINALS($$); | ||
1521 | } | ||
1522 | | expression_unary_prefix { | ||
1523 | 190 | $$ = std::move($1); | |
1524 | PRINT_NONTERMINALS($$); | ||
1525 | } | ||
1526 | | expression_unary_sizeof_type { | ||
1527 | 72 | $$ = std::move($1); | |
1528 | PRINT_NONTERMINALS($$); | ||
1529 | } | ||
1530 | ; | ||
1531 | |||
1532 | expression_unary_increment | ||
1533 | : INC_OP expression_unary { | ||
1534 | auto expr = std::make_unique<Gyoji::frontend::tree::ExpressionUnaryPrefix>( | ||
1535 | 16 | std::move($1), | |
1536 | 16 | std::move($2), | |
1537 | 16 | Gyoji::frontend::tree::ExpressionUnaryPrefix::INCREMENT | |
1538 | 16 | ); | |
1539 | 16 | const Gyoji::frontend::ast::SyntaxNode &sn = *(expr); | |
1540 | 16 | $$ = std::make_unique<Gyoji::frontend::tree::Expression>(std::move(expr), sn); | |
1541 | PRINT_NONTERMINALS($$); | ||
1542 | 16 | } | |
1543 | ; | ||
1544 | expression_unary_decrement | ||
1545 | : DEC_OP expression_unary { | ||
1546 | auto expr = std::make_unique<Gyoji::frontend::tree::ExpressionUnaryPrefix>( | ||
1547 | 72 | std::move($1), | |
1548 | 72 | std::move($2), | |
1549 | 72 | Gyoji::frontend::tree::ExpressionUnaryPrefix::DECREMENT | |
1550 | 72 | ); | |
1551 | 72 | const Gyoji::frontend::ast::SyntaxNode &sn = *(expr); | |
1552 | 72 | $$ = std::make_unique<Gyoji::frontend::tree::Expression>(std::move(expr), sn); | |
1553 | PRINT_NONTERMINALS($$); | ||
1554 | 72 | } | |
1555 | ; | ||
1556 | expression_unary_prefix | ||
1557 | : operator_unary expression_cast { | ||
1558 | auto expr = std::make_unique<Gyoji::frontend::tree::ExpressionUnaryPrefix>( | ||
1559 | 190 | std::move($1.second), | |
1560 | std::move($2), | ||
1561 | $1.first | ||
1562 | ); | ||
1563 | const Gyoji::frontend::ast::SyntaxNode &sn = *(expr); | ||
1564 | 190 | $$ = std::make_unique<Gyoji::frontend::tree::Expression>(std::move(expr), sn); | |
1565 | 190 | PRINT_NONTERMINALS($$); | |
1566 | 190 | } | |
1567 | ; | ||
1568 | expression_unary_sizeof_type | ||
1569 | : SIZEOF PAREN_L type_specifier PAREN_R { | ||
1570 | auto expr = std::make_unique<Gyoji::frontend::tree::ExpressionUnarySizeofType>( | ||
1571 | 262 | std::move($1), | |
1572 | 262 | std::move($2), | |
1573 | 262 | std::move($3), | |
1574 | 262 | std::move($4) | |
1575 | 72 | ); | |
1576 | 262 | const Gyoji::frontend::ast::SyntaxNode &sn = *(expr); | |
1577 | 72 | $$ = std::make_unique<Gyoji::frontend::tree::Expression>(std::move(expr), sn); | |
1578 | PRINT_NONTERMINALS($$); | ||
1579 | 72 | } | |
1580 | ; | ||
1581 | |||
1582 | |||
1583 | |||
1584 | operator_unary | ||
1585 | : ANDPERSAND { | ||
1586 | $$ = std::pair( | ||
1587 | Gyoji::frontend::tree::ExpressionUnaryPrefix::ADDRESSOF, | ||
1588 | std::move($1) | ||
1589 | ); | ||
1590 | PRINT_NONTERMINALS(($$.second)); | ||
1591 | 64 | } | |
1592 | 64 | | STAR { | |
1593 | 32 | $$ = std::pair( | |
1594 | 32 | Gyoji::frontend::tree::ExpressionUnaryPrefix::DEREFERENCE, | |
1595 | std::move($1) | ||
1596 | ); | ||
1597 | PRINT_NONTERMINALS(($$.second)); | ||
1598 | 168 | } | |
1599 | 168 | | PLUS { | |
1600 | 84 | $$ = std::pair( | |
1601 | 84 | Gyoji::frontend::tree::ExpressionUnaryPrefix::PLUS, | |
1602 | std::move($1) | ||
1603 | ); | ||
1604 | PRINT_NONTERMINALS(($$.second)); | ||
1605 | ✗ | } | |
1606 | ✗ | | MINUS { | |
1607 | ✗ | $$ = std::pair( | |
1608 | ✗ | Gyoji::frontend::tree::ExpressionUnaryPrefix::MINUS, | |
1609 | std::move($1) | ||
1610 | ); | ||
1611 | PRINT_NONTERMINALS(($$.second)); | ||
1612 | 16 | } | |
1613 | 16 | | TILDE { | |
1614 | 8 | $$ = std::pair( | |
1615 | 8 | Gyoji::frontend::tree::ExpressionUnaryPrefix::BITWISE_NOT, | |
1616 | std::move($1) | ||
1617 | ); | ||
1618 | PRINT_NONTERMINALS(($$.second)); | ||
1619 | 64 | } | |
1620 | 64 | | BANG { | |
1621 | 32 | $$ = std::pair( | |
1622 | 32 | Gyoji::frontend::tree::ExpressionUnaryPrefix::LOGICAL_NOT, | |
1623 | std::move($1) | ||
1624 | ); | ||
1625 | PRINT_NONTERMINALS(($$.second)); | ||
1626 | 68 | } | |
1627 | 68 | ; | |
1628 | 34 | ||
1629 | 34 | expression_cast | |
1630 | : expression_cast_unary { | ||
1631 | 4016 | $$ = std::move($1); | |
1632 | PRINT_NONTERMINALS($$); | ||
1633 | } | ||
1634 | | expression_cast_cast { | ||
1635 | 104 | $$ = std::move($1); | |
1636 | PRINT_NONTERMINALS($$); | ||
1637 | } | ||
1638 | ; | ||
1639 | |||
1640 | expression_cast_unary | ||
1641 | : expression_unary { | ||
1642 | 4016 | $$ = std::move($1); | |
1643 | PRINT_NONTERMINALS($$); | ||
1644 | } | ||
1645 | ; | ||
1646 | |||
1647 | expression_cast_cast | ||
1648 | : CAST PAREN_L type_specifier COMMA expression PAREN_R { | ||
1649 | auto expr = std::make_unique<Gyoji::frontend::tree::ExpressionCast>( | ||
1650 | 104 | std::move($1), | |
1651 | 104 | std::move($2), | |
1652 | 104 | std::move($3), | |
1653 | 104 | std::move($4), | |
1654 | 104 | std::move($5), | |
1655 | 104 | std::move($6) | |
1656 | 104 | ); | |
1657 | 104 | const Gyoji::frontend::ast::SyntaxNode &sn = *(expr); | |
1658 | 104 | $$ = std::make_unique<Gyoji::frontend::tree::Expression>(std::move(expr), sn); | |
1659 | PRINT_NONTERMINALS($$); | ||
1660 | 104 | } | |
1661 | ; | ||
1662 | |||
1663 | |||
1664 | expression_multiplicative | ||
1665 | : expression_multiplicative_cast { | ||
1666 | 3736 | $$ = std::move($1); | |
1667 | PRINT_NONTERMINALS($$); | ||
1668 | } | ||
1669 | | expression_multiplicative_multiply { | ||
1670 | 104 | $$ = std::move($1); | |
1671 | PRINT_NONTERMINALS($$); | ||
1672 | } | ||
1673 | | expression_multiplicative_divide { | ||
1674 | 48 | $$ = std::move($1); | |
1675 | PRINT_NONTERMINALS($$); | ||
1676 | } | ||
1677 | | expression_multiplicative_modulo { | ||
1678 | 42 | $$ = std::move($1); | |
1679 | PRINT_NONTERMINALS($$); | ||
1680 | } | ||
1681 | ; | ||
1682 | |||
1683 | expression_multiplicative_cast | ||
1684 | : expression_cast { | ||
1685 | 3736 | $$ = std::move($1); | |
1686 | PRINT_NONTERMINALS($$); | ||
1687 | } | ||
1688 | ; | ||
1689 | expression_multiplicative_multiply | ||
1690 | : expression_multiplicative STAR expression_cast { | ||
1691 | auto expr = std::make_unique<Gyoji::frontend::tree::ExpressionBinary>( | ||
1692 | 104 | std::move($1), | |
1693 | 104 | std::move($2), | |
1694 | 104 | std::move($3), | |
1695 | 104 | Gyoji::frontend::tree::ExpressionBinary::MULTIPLY | |
1696 | 104 | ); | |
1697 | 104 | const Gyoji::frontend::ast::SyntaxNode &sn = *(expr); | |
1698 | 104 | $$ = std::make_unique<Gyoji::frontend::tree::Expression>(std::move(expr), sn); | |
1699 | PRINT_NONTERMINALS($$); | ||
1700 | 104 | } | |
1701 | ; | ||
1702 | expression_multiplicative_divide | ||
1703 | : expression_multiplicative SLASH expression_cast { | ||
1704 | auto expr = std::make_unique<Gyoji::frontend::tree::ExpressionBinary>( | ||
1705 | 48 | std::move($1), | |
1706 | 48 | std::move($2), | |
1707 | 48 | std::move($3), | |
1708 | 48 | Gyoji::frontend::tree::ExpressionBinary::DIVIDE | |
1709 | 48 | ); | |
1710 | 48 | const Gyoji::frontend::ast::SyntaxNode &sn = *(expr); | |
1711 | 48 | $$ = std::make_unique<Gyoji::frontend::tree::Expression>(std::move(expr), sn); | |
1712 | PRINT_NONTERMINALS($$); | ||
1713 | 48 | } | |
1714 | ; | ||
1715 | expression_multiplicative_modulo | ||
1716 | : expression_multiplicative PERCENT expression_cast { | ||
1717 | auto expr = std::make_unique<Gyoji::frontend::tree::ExpressionBinary>( | ||
1718 | 42 | std::move($1), | |
1719 | 42 | std::move($2), | |
1720 | 42 | std::move($3), | |
1721 | 42 | Gyoji::frontend::tree::ExpressionBinary::MODULO | |
1722 | 42 | ); | |
1723 | 42 | const Gyoji::frontend::ast::SyntaxNode &sn = *(expr); | |
1724 | 42 | $$ = std::make_unique<Gyoji::frontend::tree::Expression>(std::move(expr), sn); | |
1725 | PRINT_NONTERMINALS($$); | ||
1726 | 42 | } | |
1727 | ; | ||
1728 | |||
1729 | expression_additive | ||
1730 | : expression_additive_multiplicative { | ||
1731 | 3600 | $$ = std::move($1); | |
1732 | PRINT_NONTERMINALS($$); | ||
1733 | } | ||
1734 | | expression_additive_plus { | ||
1735 | 88 | $$ = std::move($1); | |
1736 | PRINT_NONTERMINALS($$); | ||
1737 | } | ||
1738 | | expression_additive_minus { | ||
1739 | 48 | $$ = std::move($1); | |
1740 | PRINT_NONTERMINALS($$); | ||
1741 | } | ||
1742 | ; | ||
1743 | expression_additive_multiplicative | ||
1744 | : expression_multiplicative { | ||
1745 | 3600 | $$ = std::move($1); | |
1746 | PRINT_NONTERMINALS($$); | ||
1747 | } | ||
1748 | ; | ||
1749 | expression_additive_plus | ||
1750 | : expression_additive PLUS expression_multiplicative { | ||
1751 | auto expr = std::make_unique<Gyoji::frontend::tree::ExpressionBinary>( | ||
1752 | 88 | std::move($1), | |
1753 | 88 | std::move($2), | |
1754 | 88 | std::move($3), | |
1755 | 88 | Gyoji::frontend::tree::ExpressionBinary::ADD | |
1756 | 88 | ); | |
1757 | 88 | const Gyoji::frontend::ast::SyntaxNode &sn = *(expr); | |
1758 | 88 | $$ = std::make_unique<Gyoji::frontend::tree::Expression>(std::move(expr), sn); | |
1759 | PRINT_NONTERMINALS($$); | ||
1760 | 88 | } | |
1761 | ; | ||
1762 | expression_additive_minus | ||
1763 | : expression_additive MINUS expression_multiplicative { | ||
1764 | auto expr = std::make_unique<Gyoji::frontend::tree::ExpressionBinary>( | ||
1765 | 48 | std::move($1), | |
1766 | 48 | std::move($2), | |
1767 | 48 | std::move($3), | |
1768 | 48 | Gyoji::frontend::tree::ExpressionBinary::SUBTRACT | |
1769 | 48 | ); | |
1770 | 48 | const Gyoji::frontend::ast::SyntaxNode &sn = *(expr); | |
1771 | 48 | $$ = std::make_unique<Gyoji::frontend::tree::Expression>(std::move(expr), sn); | |
1772 | PRINT_NONTERMINALS($$); | ||
1773 | 48 | } | |
1774 | ; | ||
1775 | |||
1776 | expression_shift | ||
1777 | : expression_shift_additive { | ||
1778 | 3568 | $$ = std::move($1); | |
1779 | PRINT_NONTERMINALS($$); | ||
1780 | } | ||
1781 | | expression_shift_left { | ||
1782 | 8 | $$ = std::move($1); | |
1783 | PRINT_NONTERMINALS($$); | ||
1784 | } | ||
1785 | | expression_shift_right { | ||
1786 | 24 | $$ = std::move($1); | |
1787 | PRINT_NONTERMINALS($$); | ||
1788 | } | ||
1789 | ; | ||
1790 | |||
1791 | expression_shift_additive | ||
1792 | : expression_additive { | ||
1793 | 3568 | $$ = std::move($1); | |
1794 | PRINT_NONTERMINALS($$); | ||
1795 | } | ||
1796 | ; | ||
1797 | expression_shift_left | ||
1798 | : expression_shift LEFT_OP expression_additive { | ||
1799 | auto expr = std::make_unique<Gyoji::frontend::tree::ExpressionBinary>( | ||
1800 | 8 | std::move($1), | |
1801 | 8 | std::move($2), | |
1802 | 8 | std::move($3), | |
1803 | 8 | Gyoji::frontend::tree::ExpressionBinary::SHIFT_LEFT | |
1804 | 8 | ); | |
1805 | 8 | const Gyoji::frontend::ast::SyntaxNode &sn = *(expr); | |
1806 | 8 | $$ = std::make_unique<Gyoji::frontend::tree::Expression>(std::move(expr), sn); | |
1807 | PRINT_NONTERMINALS($$); | ||
1808 | 8 | } | |
1809 | ; | ||
1810 | expression_shift_right | ||
1811 | : expression_shift RIGHT_OP expression_additive { | ||
1812 | auto expr = std::make_unique<Gyoji::frontend::tree::ExpressionBinary>( | ||
1813 | 24 | std::move($1), | |
1814 | 24 | std::move($2), | |
1815 | 24 | std::move($3), | |
1816 | 24 | Gyoji::frontend::tree::ExpressionBinary::SHIFT_RIGHT | |
1817 | 24 | ); | |
1818 | 24 | const Gyoji::frontend::ast::SyntaxNode &sn = *(expr); | |
1819 | 24 | $$ = std::make_unique<Gyoji::frontend::tree::Expression>(std::move(expr), sn); | |
1820 | PRINT_NONTERMINALS($$); | ||
1821 | 24 | } | |
1822 | ; | ||
1823 | |||
1824 | |||
1825 | expression_relational | ||
1826 | : expression_relational_shift { | ||
1827 | 3514 | $$ = std::move($1); | |
1828 | PRINT_NONTERMINALS($$); | ||
1829 | } | ||
1830 | | expression_relational_lt { | ||
1831 | 22 | $$ = std::move($1); | |
1832 | PRINT_NONTERMINALS($$); | ||
1833 | } | ||
1834 | | expression_relational_gt { | ||
1835 | 8 | $$ = std::move($1); | |
1836 | PRINT_NONTERMINALS($$); | ||
1837 | } | ||
1838 | | expression_relational_le { | ||
1839 | 8 | $$ = std::move($1); | |
1840 | PRINT_NONTERMINALS($$); | ||
1841 | } | ||
1842 | | expression_relational_ge { | ||
1843 | 16 | $$ = std::move($1); | |
1844 | PRINT_NONTERMINALS($$); | ||
1845 | } | ||
1846 | ; | ||
1847 | |||
1848 | expression_relational_shift | ||
1849 | : expression_shift { | ||
1850 | 3514 | $$ = std::move($1); | |
1851 | PRINT_NONTERMINALS($$); | ||
1852 | } | ||
1853 | ; | ||
1854 | expression_relational_lt | ||
1855 | : expression_relational COMPARE_LESS expression_shift { | ||
1856 | auto expr = std::make_unique<Gyoji::frontend::tree::ExpressionBinary>( | ||
1857 | 22 | std::move($1), | |
1858 | 22 | std::move($2), | |
1859 | 22 | std::move($3), | |
1860 | 22 | Gyoji::frontend::tree::ExpressionBinary::COMPARE_LESS | |
1861 | 22 | ); | |
1862 | 22 | const Gyoji::frontend::ast::SyntaxNode &sn = *(expr); | |
1863 | 22 | $$ = std::make_unique<Gyoji::frontend::tree::Expression>(std::move(expr), sn); | |
1864 | PRINT_NONTERMINALS($$); | ||
1865 | 22 | } | |
1866 | ; | ||
1867 | expression_relational_gt | ||
1868 | : expression_relational COMPARE_GREATER expression_shift { | ||
1869 | auto expr = std::make_unique<Gyoji::frontend::tree::ExpressionBinary>( | ||
1870 | 8 | std::move($1), | |
1871 | 8 | std::move($2), | |
1872 | 8 | std::move($3), | |
1873 | 8 | Gyoji::frontend::tree::ExpressionBinary::COMPARE_GREATER | |
1874 | 8 | ); | |
1875 | 8 | const Gyoji::frontend::ast::SyntaxNode &sn = *(expr); | |
1876 | 8 | $$ = std::make_unique<Gyoji::frontend::tree::Expression>(std::move(expr), sn); | |
1877 | PRINT_NONTERMINALS($$); | ||
1878 | 8 | } | |
1879 | ; | ||
1880 | expression_relational_le | ||
1881 | : expression_relational COMPARE_LESS_EQUAL expression_shift { | ||
1882 | auto expr = std::make_unique<Gyoji::frontend::tree::ExpressionBinary>( | ||
1883 | 8 | std::move($1), | |
1884 | 8 | std::move($2), | |
1885 | 8 | std::move($3), | |
1886 | 8 | Gyoji::frontend::tree::ExpressionBinary::COMPARE_LESS_EQUAL | |
1887 | 8 | ); | |
1888 | 8 | const Gyoji::frontend::ast::SyntaxNode &sn = *(expr); | |
1889 | 8 | $$ = std::make_unique<Gyoji::frontend::tree::Expression>(std::move(expr), sn); | |
1890 | PRINT_NONTERMINALS($$); | ||
1891 | 8 | } | |
1892 | ; | ||
1893 | expression_relational_ge | ||
1894 | : expression_relational COMPARE_GREATER_EQUAL expression_shift { | ||
1895 | auto expr = std::make_unique<Gyoji::frontend::tree::ExpressionBinary>( | ||
1896 | 16 | std::move($1), | |
1897 | 16 | std::move($2), | |
1898 | 16 | std::move($3), | |
1899 | 16 | Gyoji::frontend::tree::ExpressionBinary::COMPARE_GREATER_EQUAL | |
1900 | 16 | ); | |
1901 | 16 | const Gyoji::frontend::ast::SyntaxNode &sn = *(expr); | |
1902 | 16 | $$ = std::make_unique<Gyoji::frontend::tree::Expression>(std::move(expr), sn); | |
1903 | PRINT_NONTERMINALS($$); | ||
1904 | 16 | } | |
1905 | ; | ||
1906 | |||
1907 | expression_equality | ||
1908 | : expression_relational { | ||
1909 | 3282 | $$ = std::move($1); | |
1910 | PRINT_NONTERMINALS($$); | ||
1911 | } | ||
1912 | | expression_equality COMPARE_EQUAL expression_relational { | ||
1913 | auto expr = std::make_unique<Gyoji::frontend::tree::ExpressionBinary>( | ||
1914 | 142 | std::move($1), | |
1915 | 142 | std::move($2), | |
1916 | 142 | std::move($3), | |
1917 | 142 | Gyoji::frontend::tree::ExpressionBinary::COMPARE_EQUAL | |
1918 | 142 | ); | |
1919 | 142 | const Gyoji::frontend::ast::SyntaxNode &sn = *(expr); | |
1920 | 142 | $$ = std::make_unique<Gyoji::frontend::tree::Expression>(std::move(expr), sn); | |
1921 | PRINT_NONTERMINALS($$); | ||
1922 | 142 | } | |
1923 | | expression_equality COMPARE_NOT_EQUAL expression_relational { | ||
1924 | auto expr = std::make_unique<Gyoji::frontend::tree::ExpressionBinary>( | ||
1925 | 90 | std::move($1), | |
1926 | 90 | std::move($2), | |
1927 | 90 | std::move($3), | |
1928 | 90 | Gyoji::frontend::tree::ExpressionBinary::COMPARE_NOT_EQUAL | |
1929 | 90 | ); | |
1930 | 90 | const Gyoji::frontend::ast::SyntaxNode &sn = *(expr); | |
1931 | 90 | $$ = std::make_unique<Gyoji::frontend::tree::Expression>(std::move(expr), sn); | |
1932 | PRINT_NONTERMINALS($$); | ||
1933 | 90 | } | |
1934 | ; | ||
1935 | |||
1936 | expression_and | ||
1937 | : expression_equality { | ||
1938 | 3266 | $$ = std::move($1); | |
1939 | PRINT_NONTERMINALS($$); | ||
1940 | } | ||
1941 | | expression_and ANDPERSAND expression_equality { | ||
1942 | auto expr = std::make_unique<Gyoji::frontend::tree::ExpressionBinary>( | ||
1943 | 16 | std::move($1), | |
1944 | 16 | std::move($2), | |
1945 | 16 | std::move($3), | |
1946 | 16 | Gyoji::frontend::tree::ExpressionBinary::BITWISE_AND | |
1947 | 16 | ); | |
1948 | 16 | const Gyoji::frontend::ast::SyntaxNode &sn = *(expr); | |
1949 | 16 | $$ = std::make_unique<Gyoji::frontend::tree::Expression>(std::move(expr), sn); | |
1950 | PRINT_NONTERMINALS($$); | ||
1951 | 16 | } | |
1952 | ; | ||
1953 | |||
1954 | expression_exclusive_or | ||
1955 | : expression_and { | ||
1956 | 3258 | $$ = std::move($1); | |
1957 | PRINT_NONTERMINALS($$); | ||
1958 | } | ||
1959 | | expression_exclusive_or XOR_OP expression_and { | ||
1960 | auto expr = std::make_unique<Gyoji::frontend::tree::ExpressionBinary>( | ||
1961 | 8 | std::move($1), | |
1962 | 8 | std::move($2), | |
1963 | 8 | std::move($3), | |
1964 | 8 | Gyoji::frontend::tree::ExpressionBinary::BITWISE_XOR | |
1965 | 8 | ); | |
1966 | 8 | const Gyoji::frontend::ast::SyntaxNode &sn = *(expr); | |
1967 | 8 | $$ = std::make_unique<Gyoji::frontend::tree::Expression>(std::move(expr), sn); | |
1968 | PRINT_NONTERMINALS($$); | ||
1969 | 8 | } | |
1970 | ; | ||
1971 | |||
1972 | expression_inclusive_or | ||
1973 | : expression_exclusive_or { | ||
1974 | 3250 | $$ = std::move($1); | |
1975 | PRINT_NONTERMINALS($$); | ||
1976 | } | ||
1977 | | expression_inclusive_or PIPE expression_exclusive_or { | ||
1978 | auto expr = std::make_unique<Gyoji::frontend::tree::ExpressionBinary>( | ||
1979 | 8 | std::move($1), | |
1980 | 8 | std::move($2), | |
1981 | 8 | std::move($3), | |
1982 | 8 | Gyoji::frontend::tree::ExpressionBinary::BITWISE_OR | |
1983 | 8 | ); | |
1984 | 8 | const Gyoji::frontend::ast::SyntaxNode &sn = *(expr); | |
1985 | 8 | $$ = std::make_unique<Gyoji::frontend::tree::Expression>(std::move(expr), sn); | |
1986 | PRINT_NONTERMINALS($$); | ||
1987 | 8 | } | |
1988 | ; | ||
1989 | |||
1990 | expression_logical_and | ||
1991 | : expression_inclusive_or { | ||
1992 | 3250 | $$ = std::move($1); | |
1993 | PRINT_NONTERMINALS($$); | ||
1994 | } | ||
1995 | | expression_logical_and ANDPERSAND ANDPERSAND expression_inclusive_or { | ||
1996 | auto expr = std::make_unique<Gyoji::frontend::tree::ExpressionBinary>( | ||
1997 | ✗ | std::move($1), | |
1998 | ✗ | std::move($2), | |
1999 | ✗ | std::move($3), | |
2000 | ✗ | std::move($4), | |
2001 | ✗ | Gyoji::frontend::tree::ExpressionBinary::LOGICAL_AND | |
2002 | ✗ | ); | |
2003 | ✗ | const Gyoji::frontend::ast::SyntaxNode &sn = *(expr); | |
2004 | ✗ | $$ = std::make_unique<Gyoji::frontend::tree::Expression>(std::move(expr), sn); | |
2005 | PRINT_NONTERMINALS($$); | ||
2006 | ✗ | } | |
2007 | ; | ||
2008 | |||
2009 | expression_logical_or | ||
2010 | : expression_logical_and { | ||
2011 | 3234 | $$ = std::move($1); | |
2012 | PRINT_NONTERMINALS($$); | ||
2013 | } | ||
2014 | | expression_logical_or OR_OP expression_logical_and { | ||
2015 | auto expr = std::make_unique<Gyoji::frontend::tree::ExpressionBinary>( | ||
2016 | 16 | std::move($1), | |
2017 | 16 | std::move($2), | |
2018 | 16 | std::move($3), | |
2019 | 16 | Gyoji::frontend::tree::ExpressionBinary::LOGICAL_OR | |
2020 | 16 | ); | |
2021 | 16 | const Gyoji::frontend::ast::SyntaxNode &sn = *(expr); | |
2022 | 16 | $$ = std::make_unique<Gyoji::frontend::tree::Expression>(std::move(expr), sn); | |
2023 | PRINT_NONTERMINALS($$); | ||
2024 | 16 | } | |
2025 | ; | ||
2026 | |||
2027 | expression_conditional | ||
2028 | : expression_logical_or { | ||
2029 | 3234 | $$ = std::move($1); | |
2030 | PRINT_NONTERMINALS($$); | ||
2031 | } | ||
2032 | | expression_logical_or QUESTIONMARK expression COLON expression_conditional { | ||
2033 | auto expr = std::make_unique<Gyoji::frontend::tree::ExpressionTrinary>( | ||
2034 | ✗ | std::move($1), | |
2035 | ✗ | std::move($2), | |
2036 | ✗ | std::move($3), | |
2037 | ✗ | std::move($4), | |
2038 | ✗ | std::move($5) | |
2039 | ✗ | ); | |
2040 | ✗ | const Gyoji::frontend::ast::SyntaxNode &sn = *(expr); | |
2041 | ✗ | $$ = std::make_unique<Gyoji::frontend::tree::Expression>(std::move(expr), sn); | |
2042 | PRINT_NONTERMINALS($$); | ||
2043 | ✗ | } | |
2044 | ; | ||
2045 | |||
2046 | expression_assignment | ||
2047 | : expression_conditional { | ||
2048 | 3234 | $$ = std::move($1); | |
2049 | PRINT_NONTERMINALS($$); | ||
2050 | } | ||
2051 | | expression_unary operator_assignment expression_assignment { | ||
2052 | auto expr = std::make_unique<Gyoji::frontend::tree::ExpressionBinary>( | ||
2053 | 884 | std::move($1), | |
2054 | 884 | std::move($2.second), | |
2055 | std::move($3), | ||
2056 | $2.first | ||
2057 | ); | ||
2058 | const Gyoji::frontend::ast::SyntaxNode &sn = *(expr); | ||
2059 | 884 | $$ = std::make_unique<Gyoji::frontend::tree::Expression>(std::move(expr), sn); | |
2060 | 884 | PRINT_NONTERMINALS($$); | |
2061 | 884 | } | |
2062 | ; | ||
2063 | |||
2064 | operator_assignment | ||
2065 | : ASSIGNMENT { | ||
2066 | 884 | $$ = std::pair( | |
2067 | 884 | Gyoji::frontend::tree::ExpressionBinary::ASSIGNMENT, | |
2068 | 884 | std::move($1) | |
2069 | 884 | ); | |
2070 | PRINT_NONTERMINALS(($$.second)); | ||
2071 | 2548 | } | |
2072 | 1664 | | MUL_ASSIGNMENT { | |
2073 | 832 | $$ = std::pair( | |
2074 | 832 | Gyoji::frontend::tree::ExpressionBinary::MUL_ASSIGNMENT, | |
2075 | std::move($1) | ||
2076 | ); | ||
2077 | PRINT_NONTERMINALS(($$.second)); | ||
2078 | 16 | } | |
2079 | 16 | | DIV_ASSIGNMENT { | |
2080 | 8 | $$ = std::pair( | |
2081 | 8 | Gyoji::frontend::tree::ExpressionBinary::DIV_ASSIGNMENT, | |
2082 | std::move($1) | ||
2083 | ); | ||
2084 | PRINT_NONTERMINALS(($$.second)); | ||
2085 | 16 | } | |
2086 | 16 | | MOD_ASSIGNMENT { | |
2087 | 8 | $$ = std::pair( | |
2088 | 8 | Gyoji::frontend::tree::ExpressionBinary::MOD_ASSIGNMENT, | |
2089 | std::move($1) | ||
2090 | ); | ||
2091 | PRINT_NONTERMINALS(($$.second)); | ||
2092 | ✗ | } | |
2093 | ✗ | | ADD_ASSIGNMENT { | |
2094 | ✗ | $$ = std::pair( | |
2095 | ✗ | Gyoji::frontend::tree::ExpressionBinary::ADD_ASSIGNMENT, | |
2096 | std::move($1) | ||
2097 | ); | ||
2098 | PRINT_NONTERMINALS(($$.second)); | ||
2099 | 24 | } | |
2100 | 24 | | SUB_ASSIGNMENT { | |
2101 | 12 | $$ = std::pair( | |
2102 | 12 | Gyoji::frontend::tree::ExpressionBinary::SUB_ASSIGNMENT, | |
2103 | std::move($1) | ||
2104 | ); | ||
2105 | PRINT_NONTERMINALS(($$.second)); | ||
2106 | 16 | } | |
2107 | 16 | | LEFT_ASSIGNMENT { | |
2108 | 8 | $$ = std::pair( | |
2109 | 8 | Gyoji::frontend::tree::ExpressionBinary::LEFT_ASSIGNMENT, | |
2110 | std::move($1) | ||
2111 | ); | ||
2112 | PRINT_NONTERMINALS(($$.second)); | ||
2113 | 16 | } | |
2114 | 16 | | RIGHT_ASSIGNMENT { | |
2115 | 8 | $$ = std::pair( | |
2116 | 8 | Gyoji::frontend::tree::ExpressionBinary::RIGHT_ASSIGNMENT, | |
2117 | std::move($1) | ||
2118 | ); | ||
2119 | PRINT_NONTERMINALS(($$.second)); | ||
2120 | 16 | } | |
2121 | 16 | | AND_ASSIGNMENT { | |
2122 | 8 | $$ = std::pair( | |
2123 | 8 | Gyoji::frontend::tree::ExpressionBinary::AND_ASSIGNMENT, | |
2124 | std::move($1) | ||
2125 | ); | ||
2126 | PRINT_NONTERMINALS(($$.second)); | ||
2127 | ✗ | } | |
2128 | ✗ | | XOR_ASSIGNMENT { | |
2129 | ✗ | $$ = std::pair( | |
2130 | ✗ | Gyoji::frontend::tree::ExpressionBinary::XOR_ASSIGNMENT, | |
2131 | std::move($1) | ||
2132 | ); | ||
2133 | PRINT_NONTERMINALS(($$.second)); | ||
2134 | ✗ | } | |
2135 | ✗ | | OR_ASSIGNMENT { | |
2136 | ✗ | $$ = std::pair( | |
2137 | ✗ | Gyoji::frontend::tree::ExpressionBinary::OR_ASSIGNMENT, | |
2138 | std::move($1) | ||
2139 | ); | ||
2140 | PRINT_NONTERMINALS(($$.second)); | ||
2141 | ✗ | } | |
2142 | ✗ | ; | |
2143 | ✗ | ||
2144 | ✗ | expression | |
2145 | : expression_assignment { | ||
2146 | 3234 | $$ = std::move($1); | |
2147 | PRINT_NONTERMINALS($$); | ||
2148 | } | ||
2149 | ; | ||
2150 | |||
2151 | |||
2152 | type_name | ||
2153 | : TYPEOF PAREN_L expression PAREN_R { | ||
2154 | 32 | $$ = std::make_unique<Gyoji::frontend::tree::TypeName>( | |
2155 | 16 | std::move($1), | |
2156 | 16 | std::move($2), | |
2157 | 16 | std::move($3), | |
2158 | 16 | std::move($4) | |
2159 | 16 | ); | |
2160 | PRINT_NONTERMINALS($$); | ||
2161 | } | ||
2162 | | TYPE_NAME { | ||
2163 | 6056 | $$ = std::make_unique<Gyoji::frontend::tree::TypeName>( | |
2164 | 3028 | std::move($1) | |
2165 | 3028 | ); | |
2166 | PRINT_NONTERMINALS($$); | ||
2167 | } | ||
2168 | ; | ||
2169 | |||
2170 | opt_class_member_declaration_list | ||
2171 | : /**/ { | ||
2172 | ✗ | $$ = std::make_unique<Gyoji::frontend::tree::ClassMemberDeclarationList>(return_data.compiler_context.get_token_stream().get_current_source_ref()); | |
2173 | PRINT_NONTERMINALS($$); | ||
2174 | } | ||
2175 | | class_member_declaration_list { | ||
2176 | 128 | $$ = std::move($1); | |
2177 | PRINT_NONTERMINALS($$); | ||
2178 | } | ||
2179 | ; | ||
2180 | |||
2181 | class_member_declaration_list | ||
2182 | : class_member_declaration { | ||
2183 | 128 | $$ = std::make_unique<Gyoji::frontend::tree::ClassMemberDeclarationList>($1->get_source_ref()); | |
2184 | 128 | $$->add_member(std::move($1)); | |
2185 | PRINT_NONTERMINALS($$); | ||
2186 | } | ||
2187 | | class_member_declaration_list class_member_declaration { | ||
2188 | 188 | $$ = std::move($1); | |
2189 | 188 | $$->add_member(std::move($2)); | |
2190 | PRINT_NONTERMINALS($$); | ||
2191 | } | ||
2192 | ; | ||
2193 | |||
2194 | class_member_declaration | ||
2195 | : opt_access_modifier type_specifier IDENTIFIER SEMICOLON { | ||
2196 | // Member Variable | ||
2197 | 258 | $3->set_identifier_type(Gyoji::frontend::tree::Terminal::IDENTIFIER_LOCAL_SCOPE); | |
2198 | 258 | NS2Entity *entity = return_data.identifier_get_or_create($3->get_value(), false, $3->get_source_ref()); | |
2199 | 258 | $3->set_ns2_entity(entity); | |
2200 | auto expr = std::make_unique<Gyoji::frontend::tree::ClassMemberDeclarationVariable>( | ||
2201 | 258 | std::move($1), | |
2202 | 258 | std::move($2), | |
2203 | 258 | std::move($3), | |
2204 | 258 | std::move($4) | |
2205 | 258 | ); | |
2206 | 258 | const Gyoji::frontend::ast::SyntaxNode &sn = *(expr); | |
2207 | 258 | $$ = std::make_unique<Gyoji::frontend::tree::ClassMemberDeclaration>(std::move(expr), sn); | |
2208 | PRINT_NONTERMINALS($$); | ||
2209 | 258 | } | |
2210 | | opt_access_modifier type_specifier IDENTIFIER PAREN_L opt_function_definition_arg_list PAREN_R SEMICOLON { | ||
2211 | // Method | ||
2212 | 10 | $3->set_identifier_type(Gyoji::frontend::tree::Terminal::IDENTIFIER_LOCAL_SCOPE); | |
2213 | 10 | NS2Entity *entity = return_data.identifier_get_or_create($3->get_value(), false, $3->get_source_ref()); | |
2214 | 10 | $3->set_ns2_entity(entity); | |
2215 | auto expr = std::make_unique<Gyoji::frontend::tree::ClassMemberDeclarationMethod>( | ||
2216 | 10 | std::move($1), | |
2217 | 10 | std::move($2), | |
2218 | 10 | std::move($3), | |
2219 | 10 | std::move($4), | |
2220 | 10 | std::move($5), | |
2221 | 10 | std::move($6), | |
2222 | 10 | std::move($7) | |
2223 | 10 | ); | |
2224 | 10 | const Gyoji::frontend::ast::SyntaxNode &sn = *(expr); | |
2225 | 10 | $$ = std::make_unique<Gyoji::frontend::tree::ClassMemberDeclaration>(std::move(expr), sn); | |
2226 | PRINT_NONTERMINALS($$); | ||
2227 | 10 | } | |
2228 | | opt_access_modifier type_specifier PAREN_L opt_function_definition_arg_list PAREN_R SEMICOLON { | ||
2229 | // Constructor | ||
2230 | auto expr = std::make_unique<Gyoji::frontend::tree::ClassMemberDeclarationConstructor>( | ||
2231 | 8 | std::move($1), | |
2232 | 8 | std::move($2), | |
2233 | 8 | std::move($3), | |
2234 | 8 | std::move($4), | |
2235 | 8 | std::move($5), | |
2236 | 8 | std::move($6) | |
2237 | 8 | ); | |
2238 | 8 | const Gyoji::frontend::ast::SyntaxNode &sn = *(expr); | |
2239 | 8 | $$ = std::make_unique<Gyoji::frontend::tree::ClassMemberDeclaration>(std::move(expr), sn); | |
2240 | PRINT_NONTERMINALS($$); | ||
2241 | 8 | } | |
2242 | | opt_access_modifier TILDE type_specifier PAREN_L opt_function_definition_arg_list PAREN_R SEMICOLON { | ||
2243 | // Destructor | ||
2244 | auto expr = std::make_unique<Gyoji::frontend::tree::ClassMemberDeclarationDestructor>( | ||
2245 | 8 | std::move($1), | |
2246 | 8 | std::move($2), | |
2247 | 8 | std::move($3), | |
2248 | 8 | std::move($4), | |
2249 | 8 | std::move($5), | |
2250 | 8 | std::move($6), | |
2251 | 8 | std::move($7) | |
2252 | 8 | ); | |
2253 | 8 | const Gyoji::frontend::ast::SyntaxNode &sn = *(expr); | |
2254 | 8 | $$ = std::make_unique<Gyoji::frontend::tree::ClassMemberDeclaration>(std::move(expr), sn); | |
2255 | PRINT_NONTERMINALS($$); | ||
2256 | 8 | } | |
2257 | | class_declaration { | ||
2258 | ✗ | const Gyoji::frontend::ast::SyntaxNode &sn = *($1); | |
2259 | ✗ | $$ = std::make_unique<Gyoji::frontend::tree::ClassMemberDeclaration>(std::move($1), sn); | |
2260 | PRINT_NONTERMINALS($$); | ||
2261 | } | ||
2262 | | class_definition { | ||
2263 | 16 | const Gyoji::frontend::ast::SyntaxNode &sn = *($1); | |
2264 | 16 | $$ = std::make_unique<Gyoji::frontend::tree::ClassMemberDeclaration>(std::move($1), sn); | |
2265 | PRINT_NONTERMINALS($$); | ||
2266 | } | ||
2267 | | enum_definition { | ||
2268 | 8 | const Gyoji::frontend::ast::SyntaxNode &sn = *($1); | |
2269 | 8 | $$ = std::make_unique<Gyoji::frontend::tree::ClassMemberDeclaration>(std::move($1), sn); | |
2270 | PRINT_NONTERMINALS($$); | ||
2271 | } | ||
2272 | | type_definition { | ||
2273 | 8 | const Gyoji::frontend::ast::SyntaxNode &sn = *($1); | |
2274 | 8 | $$ = std::make_unique<Gyoji::frontend::tree::ClassMemberDeclaration>(std::move($1), sn); | |
2275 | PRINT_NONTERMINALS($$); | ||
2276 | } | ||
2277 | ; | ||
2278 | |||
2279 | |||
2280 | type_access_qualifier | ||
2281 | : /**/ { | ||
2282 | 3422 | $$ = std::make_unique<Gyoji::frontend::tree::AccessQualifier>(return_data.compiler_context.get_token_stream().get_current_source_ref()); | |
2283 | PRINT_NONTERMINALS($$); | ||
2284 | } | ||
2285 | | CONST { | ||
2286 | 192 | $$ = std::make_unique<Gyoji::frontend::tree::AccessQualifier>( | |
2287 | 96 | std::move($1) | |
2288 | 96 | ); | |
2289 | PRINT_NONTERMINALS($$); | ||
2290 | } | ||
2291 | | VOLATILE { | ||
2292 | 172 | $$ = std::make_unique<Gyoji::frontend::tree::AccessQualifier>( | |
2293 | 86 | std::move($1) | |
2294 | 86 | ); | |
2295 | PRINT_NONTERMINALS($$); | ||
2296 | } | ||
2297 | ; | ||
2298 | |||
2299 | type_specifier_call_args | ||
2300 | : type_specifier { | ||
2301 | 24 | $$ = std::make_unique<Gyoji::frontend::tree::TypeSpecifierCallArgs>(return_data.compiler_context.get_token_stream().get_current_source_ref()); | |
2302 | 24 | $$->add_argument(std::move($1)); | |
2303 | PRINT_NONTERMINALS($$); | ||
2304 | } | ||
2305 | | type_specifier_call_args COMMA type_specifier { | ||
2306 | 8 | $$ = std::move($1); | |
2307 | 8 | $$->add_argument(std::move($2), std::move($3)); | |
2308 | PRINT_NONTERMINALS($$); | ||
2309 | } | ||
2310 | ; | ||
2311 | |||
2312 | type_specifier | ||
2313 | : type_access_qualifier type_name { | ||
2314 | auto expr = std::make_unique<Gyoji::frontend::tree::TypeSpecifierSimple>( | ||
2315 | 3044 | std::move($1), | |
2316 | 3044 | std::move($2) | |
2317 | 3044 | ); | |
2318 | 3044 | const Gyoji::frontend::ast::SyntaxNode &sn = *(expr); | |
2319 | 3044 | $$ = std::make_unique<Gyoji::frontend::tree::TypeSpecifier>(std::move(expr), sn); | |
2320 | PRINT_NONTERMINALS($$); | ||
2321 | 3044 | } | |
2322 | | type_specifier BRACKET_L LITERAL_INT BRACKET_R { | ||
2323 | auto expr = std::make_unique<Gyoji::frontend::tree::TypeSpecifierArray>( | ||
2324 | 10 | std::move($1), | |
2325 | 10 | std::move($2), | |
2326 | 10 | std::move($3), | |
2327 | 10 | std::move($4) | |
2328 | 10 | ); | |
2329 | 10 | const Gyoji::frontend::ast::SyntaxNode &sn = *(expr); | |
2330 | 10 | $$ = std::make_unique<Gyoji::frontend::tree::TypeSpecifier>(std::move(expr), sn); | |
2331 | PRINT_NONTERMINALS($$); | ||
2332 | 10 | } | |
2333 | | type_specifier PAREN_L type_specifier_call_args PAREN_R { | ||
2334 | auto expr = std::make_unique<Gyoji::frontend::tree::TypeSpecifierTemplate>( | ||
2335 | 24 | std::move($1), | |
2336 | 24 | std::move($2), | |
2337 | 24 | std::move($3), | |
2338 | 24 | std::move($4) | |
2339 | 24 | ); | |
2340 | 24 | const Gyoji::frontend::ast::SyntaxNode &sn = *(expr); | |
2341 | 24 | $$ = std::make_unique<Gyoji::frontend::tree::TypeSpecifier>(std::move(expr), sn); | |
2342 | PRINT_NONTERMINALS($$); | ||
2343 | 24 | } | |
2344 | | type_specifier PAREN_L STAR IDENTIFIER PAREN_R PAREN_L opt_function_definition_arg_list PAREN_R { | ||
2345 | 8 | NS2Entity *entity = return_data.type_get_or_create($4->get_value(), $4->get_source_ref()); | |
2346 | 8 | $4->set_ns2_entity(entity); | |
2347 | auto expr = std::make_unique<Gyoji::frontend::tree::TypeSpecifierFunctionPointer>( | ||
2348 | 8 | std::move($1), | |
2349 | 8 | std::move($2), | |
2350 | 8 | std::move($3), | |
2351 | 8 | std::move($4), | |
2352 | 8 | std::move($5), | |
2353 | 8 | std::move($6), | |
2354 | 8 | std::move($7), | |
2355 | 8 | std::move($8) | |
2356 | 8 | ); | |
2357 | 8 | const Gyoji::frontend::ast::SyntaxNode &sn = *(expr); | |
2358 | 8 | $$ = std::make_unique<Gyoji::frontend::tree::TypeSpecifier>(std::move(expr), sn); | |
2359 | PRINT_NONTERMINALS($$); | ||
2360 | 8 | } | |
2361 | | type_specifier STAR type_access_qualifier { | ||
2362 | auto expr = std::make_unique<Gyoji::frontend::tree::TypeSpecifierPointerTo>( | ||
2363 | 510 | std::move($1), | |
2364 | 510 | std::move($2), | |
2365 | 510 | std::move($3) | |
2366 | 510 | ); | |
2367 | 510 | const Gyoji::frontend::ast::SyntaxNode &sn = *(expr); | |
2368 | 510 | $$ = std::make_unique<Gyoji::frontend::tree::TypeSpecifier>(std::move(expr), sn); | |
2369 | PRINT_NONTERMINALS($$); | ||
2370 | 510 | } | |
2371 | | type_specifier ANDPERSAND type_access_qualifier { | ||
2372 | auto expr = std::make_unique<Gyoji::frontend::tree::TypeSpecifierReferenceTo>( | ||
2373 | 50 | std::move($1), | |
2374 | 50 | std::move($2), | |
2375 | 50 | std::move($3) | |
2376 | 50 | ); | |
2377 | 50 | const Gyoji::frontend::ast::SyntaxNode &sn = *(expr); | |
2378 | 50 | $$ = std::make_unique<Gyoji::frontend::tree::TypeSpecifier>(std::move(expr), sn); | |
2379 | PRINT_NONTERMINALS($$); | ||
2380 | 50 | } | |
2381 | ; | ||
2382 | |||
2383 | opt_argument_expression_list | ||
2384 | : /**/ { | ||
2385 | 266 | $$ = std::make_unique<Gyoji::frontend::tree::ArgumentExpressionList>(return_data.compiler_context.get_token_stream().get_current_source_ref()); | |
2386 | PRINT_NONTERMINALS($$); | ||
2387 | } | ||
2388 | | argument_expression_list { | ||
2389 | 184 | $$ = std::move($1); | |
2390 | PRINT_NONTERMINALS($$); | ||
2391 | } | ||
2392 | ; | ||
2393 | |||
2394 | argument_expression_list | ||
2395 | : expression { | ||
2396 | 184 | $$ = std::make_unique<Gyoji::frontend::tree::ArgumentExpressionList>($1->get_source_ref()); | |
2397 | 184 | $$->add_argument(std::move($1)); | |
2398 | PRINT_NONTERMINALS($$); | ||
2399 | } | ||
2400 | | argument_expression_list COMMA expression { | ||
2401 | 76 | $$ = std::move($1); | |
2402 | 76 | $$->add_argument(std::move($2), std::move($3)); | |
2403 | PRINT_NONTERMINALS($$); | ||
2404 | } | ||
2405 | ; | ||
2406 | |||
2407 | %% | ||
2408 | |||
2409 | 2 | void Gyoji::frontend::yacc::YaccParser::error(const std::string& msg) { | |
2410 | 2 | LexContext *lex_context = (LexContext*)yyget_extra(scanner); | |
2411 | |||
2412 | 2 | const SourceReference & src_ref = lex_context->compiler_context.get_token_stream().get_current_source_ref(); | |
2413 | |||
2414 | // We don't directly print an error here, we report it | ||
2415 | // to the error reporting system so that it can | ||
2416 | // write error information when it needs to, presumably | ||
2417 | // after collecting possibly multiple errors | ||
2418 | |||
2419 | // We want to consume more context from the next few | ||
2420 | // lines so we can produce a good syntax error with | ||
2421 | // following context. | ||
2422 | #if 0 | ||
2423 | size_t error_context_lines = 5; | ||
2424 | while (true) { | ||
2425 | Gyoji::frontend::yacc::YaccParser::semantic_type lvalue; | ||
2426 | int rc = yylex (&lvalue, scanner); | ||
2427 | if (rc == 0) { | ||
2428 | break; | ||
2429 | } | ||
2430 | const SourceReference & cur_ref = lex_context->compiler_context.get_token_stream().get_current_source_ref(); | ||
2431 | if (cur_ref.get_line() - src_ref.get_line() >= error_context_lines) { | ||
2432 | break; | ||
2433 | } | ||
2434 | } | ||
2435 | #endif | ||
2436 | 2 | auto error = std::make_unique<Gyoji::context::Error>("Syntax Error"); | |
2437 | 2 | error->add_message(src_ref, msg); | |
2438 | 2 | return_data.compiler_context.get_errors().add_error(std::move(error)); | |
2439 | 2 | } | |
2440 |