diff options
Diffstat (limited to 'boot/parser.yy')
| -rw-r--r-- | boot/parser.yy | 43 |
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); } |
