aboutsummaryrefslogtreecommitdiff
path: root/boot/parser.yy
diff options
context:
space:
mode:
authorEugen Wissner <belka@caraus.de>2026-07-07 21:39:57 +0200
committerEugen Wissner <belka@caraus.de>2026-07-07 21:39:57 +0200
commit79521d91b2bb85652fd29f5c44279338d55c757f (patch)
treed3b5b73177f63fd5ff684a8aba6f7b9af84dab27 /boot/parser.yy
parent470bfba45661d19558c0bf43b7819696a925ecb4 (diff)
downloadelna-79521d91b2bb85652fd29f5c44279338d55c757f.tar.gz
Allow multiple parameters with same type
Diffstat (limited to 'boot/parser.yy')
-rw-r--r--boot/parser.yy43
1 files changed, 20 insertions, 23 deletions
diff --git a/boot/parser.yy b/boot/parser.yy
index a36b953..3b8e69e 100644
--- a/boot/parser.yy
+++ b/boot/parser.yy
@@ -82,7 +82,7 @@ along with GCC; see the file COPYING3. If not see
%token <bool> BOOLEAN
%token LEFT_PAREN "(" RIGHT_PAREN ")" LEFT_SQUARE "[" RIGHT_SQUARE "]"
%token ASSIGNMENT ":="
- ARROW "->" EXCLAMATION "!"
+ EXCLAMATION "!"
AT "@" HAT "^"
COLON ":" SEMICOLON ";" DOT "." COMMA ","
%token NOT "~"
@@ -143,15 +143,18 @@ along with GCC; see the file COPYING3. If not see
%type <std::vector<elna::boot::statement *>> statements;
%type <std::unique_ptr<std::vector<elna::boot::statement *>>> statement_part;
%type <elna::boot::procedure_declaration *> procedure_declaration;
-%type <std::pair<std::vector<std::string>, elna::boot::procedure_type_expression *>> procedure_heading;
+%type <elna::boot::procedure_type_expression *> procedure_heading;
%type <elna::boot::procedure_type_expression::return_t> return_declaration;
%type <std::vector<elna::boot::procedure_declaration *>> procedure_part;
%type <elna::boot::type_declaration *> type_declaration;
%type <std::vector<elna::boot::type_declaration *>> type_declarations type_part;
%type <std::unique_ptr<elna::boot::block>> block;
-%type <elna::boot::field_declaration> field_declaration formal_parameter;
+%type <elna::boot::field_declaration> field_declaration;
+%type <std::pair<std::vector<std::string>, std::shared_ptr<elna::boot::type_expression>>> formal_parameter;
%type <std::vector<std::pair<std::string, elna::boot::type_expression *>>>
- optional_fields required_fields formal_parameters formal_parameter_list;
+ optional_fields required_fields;
+%type <std::vector<std::pair<std::vector<std::string>, std::shared_ptr<elna::boot::type_expression>>>>
+ formal_parameters formal_parameter_list;
%type <std::vector<elna::boot::conditional_statements *>> elsif_then_statements elsif_do_statements;
%type <std::vector<elna::boot::statement *> *> else_statements;
%type <elna::boot::cast_expression *> cast_expression;
@@ -215,28 +218,21 @@ identifier_definitions:
| identifier_definition { $$.emplace_back(std::move($1)); }
return_declaration:
/* proper procedure */ {}
- | "->" "!" { $$ = boot::procedure_type_expression::return_t(std::monostate{}); }
- | "->" type_expression { $$ = boot::procedure_type_expression::return_t($2); }
+ | ":" "!" { $$ = boot::procedure_type_expression::return_t(std::monostate{}); }
+ | ":" type_expression { $$ = boot::procedure_type_expression::return_t($2); }
procedure_heading: formal_parameter_list return_declaration
{
- $$.second = new boot::procedure_type_expression(boot::make_position(@1), std::move($2));
- for (auto& [name, type] : $1)
- {
- $$.first.emplace_back(std::move(name));
- $$.second->parameters.push_back(type);
- }
+ $$ = new boot::procedure_type_expression(boot::make_position(@1), std::move($1), std::move($2));
}
procedure_declaration:
"proc" identifier_definition procedure_heading block
{
- $$ = new boot::procedure_declaration(boot::make_position(@1), std::move($2), $3.second,
+ $$ = new boot::procedure_declaration(boot::make_position(@1), std::move($2), $3,
std::move(*$4));
- std::swap($3.first, $$->parameter_names);
}
| "proc" identifier_definition procedure_heading "extern"
{
- $$ = new boot::procedure_declaration(boot::make_position(@1), std::move($2), $3.second);
- std::swap($3.first, $$->parameter_names);
+ $$ = new boot::procedure_declaration(boot::make_position(@1), std::move($2), $3);
}
procedure_part:
/* no procedure declarations */ {}
@@ -474,11 +470,9 @@ type_expression:
{
$$ = new boot::union_type_expression(boot::make_position(@1), std::move($2));
}
- | "proc" "(" type_expressions ")" return_declaration
+ | "proc" formal_parameter_list return_declaration
{
- auto result = new boot::procedure_type_expression(boot::make_position(@1), std::move($5));
- std::swap(result->parameters, $3);
- $$ = result;
+ $$ = new boot::procedure_type_expression(boot::make_position(@1), std::move($2), std::move($3));
}
| "(" identifiers ")"
{
@@ -571,7 +565,7 @@ type_part:
/* no type definitions */ {}
| "type" type_declarations { std::swap($$, $2); }
formal_parameter:
- IDENTIFIER ":" type_expression { $$ = std::make_pair($1, $3); }
+ identifiers ":" type_expression { $$ = std::make_pair(std::move($1), std::shared_ptr<boot::type_expression>($3)); }
formal_parameter_list:
"(" ")" {}
| "(" formal_parameters ")" { std::swap($$, $2); }
@@ -579,9 +573,12 @@ formal_parameters:
formal_parameter ";" formal_parameters
{
std::swap($$, $3);
- $$.emplace($$.cbegin(), std::move($1));
+ $$.emplace($$.cbegin(), std::move($1.first), $1.second);
+ }
+ | formal_parameter
+ {
+ $$.emplace_back(std::move($1.first), $1.second);
}
- | formal_parameter { $$.emplace_back(std::move($1)); }
actual_parameter_list:
"(" ")" {}
| "(" expressions ")" { std::swap($$, $2); }