aboutsummaryrefslogtreecommitdiff
path: root/boot/parser.yy
diff options
context:
space:
mode:
Diffstat (limited to 'boot/parser.yy')
-rw-r--r--boot/parser.yy31
1 files changed, 6 insertions, 25 deletions
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 <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;
-%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;
-%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::field_declaration>> optional_fields required_fields;
%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;
@@ -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<boot::type_expression>($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<boot::type_expression>($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); }