aboutsummaryrefslogtreecommitdiff
path: root/boot/parser.yy
diff options
context:
space:
mode:
authorEugen Wissner <belka@caraus.de>2026-09-07 22:02:15 +0200
committerEugen Wissner <belka@caraus.de>2026-09-07 23:39:53 +0200
commit72f5e82196d95008ed12c12de6bdccf24361e106 (patch)
tree8319324de8e2a5182dc3c1ddca00a837c2489ad2 /boot/parser.yy
parent47521ad6d85f9bd6caee39696ce40dff82cfa50d (diff)
downloadelna-72f5e82196d95008ed12c12de6bdccf24361e106.tar.gz
Make module entry point more procedure like
Diffstat (limited to 'boot/parser.yy')
-rw-r--r--boot/parser.yy18
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
{