diff options
| author | Eugen Wissner <belka@caraus.de> | 2026-09-07 22:02:15 +0200 |
|---|---|---|
| committer | Eugen Wissner <belka@caraus.de> | 2026-09-07 23:39:53 +0200 |
| commit | 72f5e82196d95008ed12c12de6bdccf24361e106 (patch) | |
| tree | 8319324de8e2a5182dc3c1ddca00a837c2489ad2 /boot/parser.yy | |
| parent | 47521ad6d85f9bd6caee39696ce40dff82cfa50d (diff) | |
| download | elna-72f5e82196d95008ed12c12de6bdccf24361e106.tar.gz | |
Make module entry point more procedure like
Diffstat (limited to 'boot/parser.yy')
| -rw-r--r-- | boot/parser.yy | 18 |
1 files changed, 11 insertions, 7 deletions
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 <std::unique_ptr<elna::boot::identifier_definition>> identifier_definition; %type <std::vector<elna::boot::identifier_definition>> identifier_definitions; %type <std::vector<std::string>> import_declaration; -%type <std::vector<elna::boot::identifier>> identifiers; +%type <std::vector<elna::boot::identifier>> required_identifiers optional_identifiers; %type <std::vector<elna::boot::import_declaration *>> import_declarations import_part; %type <std::unique_ptr<elna::boot::array_type_expression>> 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<boot::type_expression>($3)); } + required_identifiers ":" type_expression { $$ = std::make_pair($1, std::shared_ptr<boot::type_expression>($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 { |
