diff options
| author | Eugen Wissner <belka@caraus.de> | 2026-08-23 20:01:55 +0200 |
|---|---|---|
| committer | Eugen Wissner <belka@caraus.de> | 2026-08-23 20:01:55 +0200 |
| commit | 7d0d0eb69589ab8e0c8b036a3b642593a372b041 (patch) | |
| tree | cf3731cec0ab67a0d574450fbe24c3cff4a7a9e6 /boot/parser.yy | |
| parent | bf41d022ce9736a92097f416ab96fca7ab4594ca (diff) | |
| download | elna-7d0d0eb69589ab8e0c8b036a3b642593a372b041.tar.gz | |
Determine array type by the first element
Diffstat (limited to 'boot/parser.yy')
| -rw-r--r-- | boot/parser.yy | 16 |
1 files changed, 9 insertions, 7 deletions
diff --git a/boot/parser.yy b/boot/parser.yy index 0c32610..669115b 100644 --- a/boot/parser.yy +++ b/boot/parser.yy @@ -135,7 +135,7 @@ along with GCC; see the file COPYING3. If not see %type <std::vector<elna::boot::type_expression *>> type_expressions; %type <elna::boot::expression *> expression operand simple_expression procedure_return unary_expression; %type <elna::boot::binary_expression *> binary_expression; -%type <std::vector<elna::boot::expression *>> expressions actual_parameter_list; +%type <std::vector<elna::boot::expression *>> optional_expressions required_expressions actual_parameter_list; %type <elna::boot::designator_expression *> designator_expression; %type <std::unique_ptr<elna::boot::procedure_call>> call_expression; %type <elna::boot::statement *> statement; @@ -343,9 +343,9 @@ simple_expression: { $$ = new boot::record_constructor_expression(boot::make_position(@$), std::move(*$1), $3); } - | array_type_expression "{" expressions "}" + | "[" required_expressions "]" { - $$ = new boot::array_constructor_expression(boot::make_position(@$), $1.release(), $3); + $$ = new boot::array_constructor_expression(boot::make_position(@$), $2); } operand: unary_expression { $$ = $1; } @@ -453,14 +453,16 @@ unary_expression: { $$ = new boot::unary_expression(boot::make_position(@$), $2, boot::unary_operator::plus); } -expressions: - expression "," expressions +optional_expressions: + required_expressions { $$ = $1; } + | %empty { $$ = std::vector<elna::boot::expression *>(); } +required_expressions: + expression "," required_expressions { $$ = $3; $$.emplace($$.cbegin(), $1); } | expression { $$.push_back($1); } - | %empty { $$ = std::vector<elna::boot::expression *>(); } type_expressions: type_expression "," type_expressions { @@ -659,7 +661,7 @@ type_part: %empty {} | "type" type_declarations { $$ = $2; } actual_parameter_list: - "(" expressions ")" { $$ = $2; } + "(" optional_expressions ")" { $$ = $2; } %% void yy::parser::error(const location_type& loc, const std::string& message) |
