diff options
Diffstat (limited to 'boot/parser.yy')
| -rw-r--r-- | boot/parser.yy | 143 |
1 files changed, 67 insertions, 76 deletions
diff --git a/boot/parser.yy b/boot/parser.yy index 1e732c6..cc73aef 100644 --- a/boot/parser.yy +++ b/boot/parser.yy @@ -129,9 +129,9 @@ along with GCC; see the file COPYING3. If not see %left "+" "-" %left "*" "/" "%" -%type <std::unique_ptr<elna::boot::literal_expression>> literal; +%type <elna::boot::literal_expression *> literal; %type <std::vector<elna::boot::expression *>> case_labels; -%type <elna::boot::switch_case> switch_case; +%type <std::unique_ptr<elna::boot::switch_case>> switch_case; %type <std::vector<elna::boot::switch_case>> switch_cases; %type <elna::boot::variable_declaration *> variable_declaration; %type <std::vector<elna::boot::variable_declaration *>> variable_declarations; @@ -141,14 +141,13 @@ along with GCC; see the file COPYING3. If not see %type <elna::boot::binary_expression *> binary_expression; %type <std::vector<elna::boot::expression *>> optional_expressions required_expressions actual_parameter_list; %type <elna::boot::designator_expression *> designator_expression; -%type <std::unique_ptr<elna::boot::procedure_call>> call_expression; +%type <elna::boot::procedure_call *> call_expression; %type <elna::boot::statement *> statement; %type <std::vector<elna::boot::statement *>> statements statement_part optional_begin_statements; -%type <elna::boot::block> block; %type <elna::boot::procedure_declaration *> procedure_declaration; -%type <std::unique_ptr<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::unique_ptr<elna::boot::type_declaration>> type_declaration; +%type <elna::boot::type_declaration *> type_declaration; %type <std::vector<elna::boot::declaration *>> type_declarations sections section; %type <std::pair<std::vector<elna::boot::import_declaration *>, std::vector<elna::boot::declaration *>>> required_declarations optional_declarations; @@ -157,8 +156,8 @@ along with GCC; see the file COPYING3. If not see %type <std::vector<elna::boot::field_declaration>> field_declarations; %type <std::unique_ptr<elna::boot::field_initializer>> field_initializer; %type <std::vector<elna::boot::field_initializer>> field_initializers; -%type <std::vector<elna::boot::conditional_statements *>> elsif_then_statements elsif_do_statements; -%type <elna::boot::block *> else_statements; +%type <std::vector<elna::boot::conditional_statements>> elsif_then_statements elsif_do_statements;; +%type <std::unique_ptr<elna::boot::block>> else_statements block; %type <std::unique_ptr<elna::boot::identifier>> identifier with_counter; %type <std::unique_ptr<elna::boot::identifier_definition>> identifier_definition attributed_identifier; %type <std::vector<elna::boot::identifier_definition>> identifier_definitions; @@ -168,7 +167,7 @@ along with GCC; see the file COPYING3. If not see %type <std::vector<elna::boot::identifier>> required_identifiers optional_identifiers generic_parameters; %type <elna::boot::named_expression *> name_reference; %type <std::vector<elna::boot::import_declaration *>> import_declarations; -%type <std::unique_ptr<elna::boot::array_type_expression>> array_type_expression; +%type <elna::boot::array_type_expression *> array_type_expression; %type <std::unique_ptr<elna::boot::unit>> unit; %% program: unit @@ -231,12 +230,12 @@ sections: | section { $$ = $1; } procedure_body: block procedure_return - { $$ = std::make_unique<boot::procedure_body>(std::move($1), $2); } + { $$ = std::make_unique<boot::procedure_body>(std::move(*$1), $2); } block: "var" variable_declarations statement_part - { $$ = boot::block(std::move($2), std::move($3)); } + { $$ = std::make_unique<boot::block>($2, $3); } | optional_begin_statements - { $$ = boot::block(std::vector<boot::variable_declaration *>(), std::move($1)); } + { $$ = std::make_unique<boot::block>(std::vector<boot::variable_declaration *>(), $1); } statement_part: %empty {} | "begin" statements { $$ = $2; } @@ -277,26 +276,28 @@ return_declaration: %empty {} | "->" "!" { $$ = boot::procedure_type_expression::return_t(std::monostate{}); } | "->" type_expression { $$ = boot::procedure_type_expression::return_t($2); } -procedure_heading: "(" field_declarations ")" attributes return_declaration +procedure_heading: + "(" field_declarations ")" attributes return_declaration { - $$ = std::make_unique<boot::procedure_type_expression>(boot::make_position(@$), $2, $5); + $$ = new boot::procedure_type_expression(boot::make_position(@$), $2, $5); $$->attributes = $4; } procedure_declaration: "proc" identifier_definition generic_parameters procedure_heading procedure_body { $$ = new boot::procedure_declaration(boot::make_position(@$), - std::move(*$2), $4.release(), std::move(*$5)); + std::move(*$2), $4, std::move(*$5)); $$->parameters = $3; } | "proc" identifier_definition generic_parameters procedure_heading "extern" { - $$ = new boot::procedure_declaration(boot::make_position(@$), std::move(*$2), $4.release()); + $$ = new boot::procedure_declaration(boot::make_position(@$), std::move(*$2), $4); $$->parameters = $3; } -call_expression: designator_expression actual_parameter_list +call_expression: + designator_expression actual_parameter_list { - $$ = std::make_unique<boot::procedure_call>(boot::make_position(@$), $1, $2); + $$ = new boot::procedure_call(boot::make_position(@$), $1, $2); } with_counter: "with" identifier { $$ = $2; } @@ -304,20 +305,18 @@ with_counter: elsif_do_statements: "elsif" expression "do" block elsif_do_statements { - boot::conditional_statements *branch = new boot::conditional_statements($2, std::move($4)); $$ = $5; - $$.emplace($$.begin(), branch); + $$.emplace($$.begin(), $2, std::move(*$4)); } | %empty {} else_statements: - "else" block { $$ = new boot::block(std::move($2)); } + "else" block { $$ = $2; } | %empty { $$ = nullptr; } elsif_then_statements: "elsif" expression "then" block elsif_then_statements { - boot::conditional_statements *branch = new boot::conditional_statements($2, std::move($4)); $$ = $5; - $$.emplace($$.begin(), branch); + $$.emplace($$.begin(), $2, std::move(*$4)); } | %empty {} procedure_return: @@ -327,94 +326,94 @@ literal: INTEGER { auto [magnitude, wants_signed] = $1; - $$ = std::make_unique<boot::literal<boot::integer_literal>>(boot::make_position(@$), + $$ = new boot::literal<boot::integer_literal>(boot::make_position(@$), boot::integer_literal::from(magnitude), wants_signed, false); } | INTEGER8 { auto [magnitude, wants_signed] = $1; - $$ = std::make_unique<boot::literal<boot::integer_literal>>(boot::make_position(@$), + $$ = new boot::literal<boot::integer_literal>(boot::make_position(@$), boot::integer_literal::from(magnitude), wants_signed); } | INTEGER16 { auto [magnitude, wants_signed] = $1; - $$ = std::make_unique<boot::literal<boot::integer_literal>>(boot::make_position(@$), + $$ = new boot::literal<boot::integer_literal>(boot::make_position(@$), boot::integer_literal::from(magnitude), wants_signed); } | INTEGER32 { auto [magnitude, wants_signed] = $1; - $$ = std::make_unique<boot::literal<boot::integer_literal>>(boot::make_position(@$), + $$ = new boot::literal<boot::integer_literal>(boot::make_position(@$), boot::integer_literal::from(magnitude), wants_signed); } | INTEGER64 { auto [magnitude, wants_signed] = $1; - $$ = std::make_unique<boot::literal<boot::integer_literal>>(boot::make_position(@$), + $$ = new boot::literal<boot::integer_literal>(boot::make_position(@$), boot::integer_literal::from(magnitude), wants_signed); } | WORD { auto [magnitude, wants_signed] = $1; - $$ = std::make_unique<boot::literal<boot::integer_literal>>(boot::make_position(@$), + $$ = new boot::literal<boot::integer_literal>(boot::make_position(@$), boot::integer_literal::from(magnitude), wants_signed, false); } | WORD8 { auto [magnitude, wants_signed] = $1; - $$ = std::make_unique<boot::literal<boot::integer_literal>>(boot::make_position(@$), + $$ = new boot::literal<boot::integer_literal>(boot::make_position(@$), boot::integer_literal::from(magnitude), wants_signed); } | WORD16 { auto [magnitude, wants_signed] = $1; - $$ = std::make_unique<boot::literal<boot::integer_literal>>(boot::make_position(@$), + $$ = new boot::literal<boot::integer_literal>(boot::make_position(@$), boot::integer_literal::from(magnitude), wants_signed); } | WORD32 { auto [magnitude, wants_signed] = $1; - $$ = std::make_unique<boot::literal<boot::integer_literal>>(boot::make_position(@$), + $$ = new boot::literal<boot::integer_literal>(boot::make_position(@$), boot::integer_literal::from(magnitude), wants_signed); } | WORD64 { auto [magnitude, wants_signed] = $1; - $$ = std::make_unique<boot::literal<boot::integer_literal>>(boot::make_position(@$), + $$ = new boot::literal<boot::integer_literal>(boot::make_position(@$), boot::integer_literal::from(magnitude), wants_signed); } | SINGLE { - $$ = std::make_unique<boot::literal<boot::float_literal>>(boot::make_position(@$), + $$ = new boot::literal<boot::float_literal>(boot::make_position(@$), boot::float_literal::from($1), boot::integer_sign::unmarked); } | DOUBLE { - $$ = std::make_unique<boot::literal<boot::float_literal>>(boot::make_position(@$), + $$ = new boot::literal<boot::float_literal>(boot::make_position(@$), boot::float_literal::from($1), boot::integer_sign::unmarked); } | BOOLEAN { - $$ = std::make_unique<boot::literal<bool>>(boot::make_position(@$), $1, boot::integer_sign::_unsigned); + $$ = new boot::literal<bool>(boot::make_position(@$), $1, boot::integer_sign::_unsigned); } | CHARACTER { - $$ = std::make_unique<boot::literal<std::uint32_t>>(boot::make_position(@$), + $$ = new boot::literal<std::uint32_t>(boot::make_position(@$), $1, boot::integer_sign::_unsigned); } | "nil" { - $$ = std::make_unique<boot::literal<std::nullptr_t>>(boot::make_position(@$), + $$ = new boot::literal<std::nullptr_t>(boot::make_position(@$), nullptr, boot::integer_sign::_unsigned); } | STRING { - $$ = std::make_unique<boot::literal<std::string>>(boot::make_position(@$), + $$ = new boot::literal<std::string>(boot::make_position(@$), $1, boot::integer_sign::_unsigned); } simple_expression: - literal { $$ = $1.release(); } + literal { $$ = $1; } | designator_expression { $$ = $1; } | TRAIT "(" type_expressions ")" { @@ -425,7 +424,7 @@ simple_expression: { $$ = new boot::cast_expression(boot::make_position(@$), $5, $3); } - | call_expression { $$ = $1.release(); } + | call_expression { $$ = $1; } | "(" expression ")" { $$ = $2; } | name_reference "{" field_initializers "}" { @@ -583,42 +582,42 @@ statement: { $$ = new boot::assign_statement(boot::make_position(@$), $1, $3); } | "while" expression "do" block elsif_do_statements "end" { - boot::conditional_statements *body = new boot::conditional_statements($2, std::move($4)); + boot::conditional_statements *body = new boot::conditional_statements($2, std::move(*$4)); $$ = new boot::while_statement(boot::make_position(@$), body, $5); } | "repeat" block "until" expression { - $$ = new boot::repeat_statement(boot::make_position(@$), std::move($2), $4); + $$ = new boot::repeat_statement(boot::make_position(@$), std::move(*$2), $4); } | "for" identifier "of" expression with_counter "do" block "end" { $$ = new boot::for_statement(boot::make_position(@$), std::move(*$2), $4, - std::move($7), $5.release()); + std::move(*$7), $5.release()); } | "if" expression "then" block elsif_then_statements else_statements "end" { - boot::conditional_statements *then = new boot::conditional_statements($2, std::move($4)); - $$ = new boot::if_statement(boot::make_position(@$), then, $5, $6); + boot::conditional_statements *then = new boot::conditional_statements($2, std::move(*$4)); + $$ = new boot::if_statement(boot::make_position(@$), then, $5, $6.release()); } - | call_expression { $$ = $1.release(); } + | call_expression { $$ = $1; } | "defer" block "end" - { $$ = new boot::defer_statement(boot::make_position(@$), std::move($2)); } + { $$ = new boot::defer_statement(boot::make_position(@$), std::move(*$2)); } | "block" identifier block "end" - { $$ = new boot::block_statement(boot::make_position(@$), std::move(*$2), std::move($3)); } + { $$ = new boot::block_statement(boot::make_position(@$), std::move(*$2), std::move(*$3)); } | "break" identifier { $$ = new boot::break_statement(boot::make_position(@$), std::move(*$2)); } | "case" expression "of" switch_cases else_statements "end" - { $$ = new boot::case_statement(boot::make_position(@$), $2, $4, $5); } + { $$ = new boot::case_statement(boot::make_position(@$), $2, $4, $5.release()); } | %empty { $$ = new boot::empty_statement(boot::make_position(@$)); } -switch_case: case_labels ":" block - { $$ = { .labels = $1, .body = std::move($3) }; } +switch_case: + case_labels ":" block { $$ = std::make_unique<boot::switch_case>($1, std::move(*$3)); } switch_cases: switch_case "|" switch_cases { $$ = $3; - $$.emplace($$.cbegin(), $1); + $$.insert($$.cbegin(), std::move(*$1)); } - | switch_case { $$.push_back($1); } + | switch_case { $$.push_back(std::move(*$1)); } case_labels: expression "," case_labels { @@ -653,22 +652,17 @@ field_initializers: $$.emplace($$.cbegin(), std::move(*$1)); } | field_initializer { $$.push_back(std::move(*$1)); } -array_type_expression: "[" expression "]" type_expression - { $$ = std::make_unique<boot::array_type_expression>(boot::make_position(@$), $4, $2); } +array_type_expression: + "[" expression "]" type_expression + { $$ = new boot::array_type_expression(boot::make_position(@$), $4, $2); } type_expression: - array_type_expression { $$ = $1.release(); } + array_type_expression { $$ = $1; } | "[" "]" type_expression - { - $$ = new boot::slice_type_expression(boot::make_position(@$), $3); - } + { $$ = new boot::slice_type_expression(boot::make_position(@$), $3); } | "const" type_expression - { - $$ = new boot::constant_type_expression(boot::make_position(@$), $2); - } + { $$ = new boot::constant_type_expression(boot::make_position(@$), $2); } | "^" type_expression - { - $$ = new boot::pointer_type_expression(boot::make_position(@$), $2); - } + { $$ = new boot::pointer_type_expression(boot::make_position(@$), $2); } | "record" attributes field_declarations "end" { auto *record = new boot::record_type_expression(boot::make_position(@$), $3); @@ -688,13 +682,9 @@ type_expression: $$ = record; } | "proc" procedure_heading - { - $$ = $2.release(); - } + { $$ = $2; } | "(" required_identifiers ")" - { - $$ = new boot::enumeration_type_expression(boot::make_position(@$), $2); - } + { $$ = new boot::enumeration_type_expression(boot::make_position(@$), $2); } | name_reference { $$ = $1; } generic_parameters: %empty {} @@ -749,14 +739,15 @@ import_declarations: { $$.emplace_back(new boot::import_declaration(boot::make_position(@$), $1)); } -type_declaration: identifier_definition generic_parameters "=" type_expression +type_declaration: + identifier_definition generic_parameters "=" type_expression { - $$ = std::make_unique<boot::type_declaration>(boot::make_position(@$), std::move(*$1), $4); + $$ = new boot::type_declaration(boot::make_position(@$), std::move(*$1), $4); $$->parameters = $2; } | identifier_definition generic_parameters "=" "extern" { - $$ = std::make_unique<boot::type_declaration>(boot::make_position(@$), std::move(*$1), + $$ = new boot::type_declaration(boot::make_position(@$), std::move(*$1), new boot::extern_type_expression(boot::make_position(@$))); $$->parameters = $2; } @@ -764,7 +755,7 @@ type_declarations: type_declaration type_declarations { $$ = $2; - $$.insert($$.cbegin(), $1.release()); + $$.insert($$.cbegin(), $1); } | %empty {} actual_parameter_list: |
