From ffe6097c534c82b9402bb6f0a57abeebd075e61d Mon Sep 17 00:00:00 2001 From: Eugen Wissner Date: Wed, 8 Jul 2026 11:04:34 +0200 Subject: Allow multiple fields with the same type --- boot/parser.yy | 31 ++++++------------------------- 1 file changed, 6 insertions(+), 25 deletions(-) (limited to 'boot/parser.yy') diff --git a/boot/parser.yy b/boot/parser.yy index 3b8e69e..b05b544 100644 --- a/boot/parser.yy +++ b/boot/parser.yy @@ -150,11 +150,7 @@ along with GCC; see the file COPYING3. If not see %type > type_declarations type_part; %type > block; %type field_declaration; -%type , std::shared_ptr>> formal_parameter; -%type >> - optional_fields required_fields; -%type , std::shared_ptr>>> - formal_parameters formal_parameter_list; +%type > optional_fields required_fields; %type > elsif_then_statements elsif_do_statements; %type *> else_statements; %type cast_expression; @@ -220,9 +216,9 @@ return_declaration: /* proper procedure */ {} | ":" "!" { $$ = boot::procedure_type_expression::return_t(std::monostate{}); } | ":" type_expression { $$ = boot::procedure_type_expression::return_t($2); } -procedure_heading: formal_parameter_list return_declaration +procedure_heading: "(" optional_fields ")" return_declaration { - $$ = new boot::procedure_type_expression(boot::make_position(@1), std::move($1), std::move($2)); + $$ = new boot::procedure_type_expression(boot::make_position(@1), std::move($2), std::move($4)); } procedure_declaration: "proc" identifier_definition procedure_heading block @@ -442,7 +438,7 @@ statements: } | statement { $$.push_back($1); } field_declaration: - IDENTIFIER ":" type_expression { $$ = std::make_pair($1, $3); } + identifiers ":" type_expression { $$ = std::make_pair(std::move($1), std::shared_ptr($3)); } required_fields: field_declaration ";" required_fields { @@ -470,9 +466,9 @@ type_expression: { $$ = new boot::union_type_expression(boot::make_position(@1), std::move($2)); } - | "proc" formal_parameter_list return_declaration + | "proc" procedure_heading { - $$ = new boot::procedure_type_expression(boot::make_position(@1), std::move($2), std::move($3)); + $$ = $2; } | "(" identifiers ")" { @@ -564,21 +560,6 @@ type_declarations: type_part: /* no type definitions */ {} | "type" type_declarations { std::swap($$, $2); } -formal_parameter: - identifiers ":" type_expression { $$ = std::make_pair(std::move($1), std::shared_ptr($3)); } -formal_parameter_list: - "(" ")" {} - | "(" formal_parameters ")" { std::swap($$, $2); } -formal_parameters: - formal_parameter ";" formal_parameters - { - std::swap($$, $3); - $$.emplace($$.cbegin(), std::move($1.first), $1.second); - } - | formal_parameter - { - $$.emplace_back(std::move($1.first), $1.second); - } actual_parameter_list: "(" ")" {} | "(" expressions ")" { std::swap($$, $2); } -- cgit v1.2.3