From 72f5e82196d95008ed12c12de6bdccf24361e106 Mon Sep 17 00:00:00 2001 From: Eugen Wissner Date: Mon, 7 Sep 2026 22:02:15 +0200 Subject: Make module entry point more procedure like --- boot/parser.yy | 18 +++++++++++------- 1 file changed, 11 insertions(+), 7 deletions(-) (limited to 'boot/parser.yy') diff --git a/boot/parser.yy b/boot/parser.yy index dc1d4e8..ba611b5 100644 --- a/boot/parser.yy +++ b/boot/parser.yy @@ -157,7 +157,7 @@ along with GCC; see the file COPYING3. If not see %type > identifier_definition; %type > identifier_definitions; %type > import_declaration; -%type > identifiers; +%type > required_identifiers optional_identifiers; %type > import_declarations import_part; %type > array_type_expression; %% @@ -167,10 +167,11 @@ program: boot::unit *tree = new boot::unit(boot::make_position(@$), $1, $2, $3, $4); driver.tree.reset(tree); } - | import_part type_part variable_part procedure_part "program" "(" ")" statement_part "end" "." + | import_part type_part variable_part procedure_part + "program" "(" optional_identifiers ")" procedure_body "end" "." { boot::unit *tree = new boot::unit(boot::make_position(@$), $1, $2, $3, $4, - boot::procedure_body({}, std::move($8))); + std::move($7), boot::make_position(@5), std::move(*$9)); driver.tree.reset(tree); } procedure_body: @@ -541,7 +542,7 @@ statements: } | statement { $$.push_back($1); } field_declaration: - identifiers ":" type_expression { $$ = std::make_pair($1, std::shared_ptr($3)); } + required_identifiers ":" type_expression { $$ = std::make_pair($1, std::shared_ptr($3)); } required_fields: field_declaration ";" required_fields { @@ -589,7 +590,7 @@ type_expression: { $$ = $2.release(); } - | "(" identifiers ")" + | "(" required_identifiers ")" { $$ = new boot::enumeration_type_expression(boot::make_position(@$), $2); } @@ -597,13 +598,16 @@ type_expression: { $$ = new boot::named_expression(boot::make_position(@$), $1); } -identifiers: - identifier "," identifiers +required_identifiers: + identifier "," required_identifiers { $$ = $3; $$.emplace($$.cbegin(), std::move(*$1)); } | identifier { $$.emplace_back(std::move(*$1)); } +optional_identifiers: + required_identifiers { $$ = $1; } + | %empty {} variable_declaration: identifier_definitions ":" type_expression { -- cgit v1.2.3