aboutsummaryrefslogtreecommitdiff
path: root/frontend/parser.yy
diff options
context:
space:
mode:
Diffstat (limited to 'frontend/parser.yy')
-rw-r--r--frontend/parser.yy97
1 files changed, 49 insertions, 48 deletions
diff --git a/frontend/parser.yy b/frontend/parser.yy
index bace8d7..5e3837b 100644
--- a/frontend/parser.yy
+++ b/frontend/parser.yy
@@ -102,8 +102,6 @@ along with GCC; see the file COPYING3. If not see
ELSE "else"
ELSIF "elsif"
RETURN "return"
- PROGRAM "program"
- MODULE "module"
IMPORT "import"
BEGIN_BLOCK "begin"
END_BLOCK "end"
@@ -142,11 +140,12 @@ along with GCC; see the file COPYING3. If not see
%type <elna::frontend::procedure_call*> call_expression;
%type <elna::frontend::return_statement *> return_statement;
%type <elna::frontend::statement *> statement;
-%type <std::vector<elna::frontend::statement *>> required_statements optional_statements statement_part;
+%type <std::vector<elna::frontend::statement *>> required_statements optional_statements;
+%type <std::unique_ptr<std::vector<elna::frontend::statement *>>> statement_part;
%type <elna::frontend::procedure_declaration *> procedure_declaration;
%type <std::pair<std::vector<std::string>, elna::frontend::procedure_type_expression *>> procedure_heading;
%type <elna::frontend::procedure_type_expression::return_t> return_declaration;
-%type <std::vector<elna::frontend::procedure_declaration *>> procedure_declarations procedure_part;
+%type <std::vector<elna::frontend::procedure_declaration *>> procedure_part;
%type <elna::frontend::type_declaration *> type_declaration;
%type <std::vector<elna::frontend::type_declaration *>> type_declarations type_part;
%type <std::unique_ptr<elna::frontend::block>> block;
@@ -162,43 +161,47 @@ along with GCC; see the file COPYING3. If not see
%type <std::vector<elna::frontend::import_declaration *>> import_declarations import_part;
%%
program:
- "program" ";" import_part constant_part type_part variable_part procedure_part statement_part "end" "."
+ import_part constant_part type_part variable_part procedure_part statement_part "end" "."
{
- auto tree = new frontend::program(frontend::make_position(@1));
-
- std::swap(tree->imports, $3);
- std::swap(tree->constants, $4);
- std::swap(tree->types , $5);
- std::swap(tree->variables, $6);
- std::swap(tree->procedures, $7);
- std::swap(tree->body, $8);
-
- driver.tree.reset(tree);
- }
- | "module" ";" import_part constant_part type_part variable_part procedure_part "end" "."
- {
- auto tree = new frontend::unit(frontend::make_position(@1));
-
- std::swap(tree->imports, $3);
- std::swap(tree->constants, $4);
- std::swap(tree->types , $5);
- std::swap(tree->variables, $6);
- std::swap(tree->procedures, $7);
+ if ($6)
+ {
+ frontend::program *tree = new frontend::program(frontend::make_position(@1));
+ std::swap(tree->body, *$6.release());
- driver.tree.reset(tree);
+ driver.tree.reset(tree);
+ }
+ else
+ {
+ driver.tree.reset(new frontend::unit(frontend::make_position(@1)));
+ }
+ std::swap(driver.tree->imports, $1);
+ std::swap(driver.tree->constants, $2);
+ std::swap(driver.tree->types , $3);
+ std::swap(driver.tree->variables, $4);
+ std::swap(driver.tree->procedures, $5);
}
block: constant_part variable_part statement_part "end"
{
- $$ = std::make_unique<frontend::block>(std::move($1), std::move($2), std::move($3));
+ if ($3)
+ {
+ $$ = std::make_unique<frontend::block>(std::move($1), std::move($2), std::move(*$3.release()));
+ }
+ else
+ {
+ $$ = std::make_unique<frontend::block>(std::move($1), std::move($2));
+ }
}
statement_part:
/* no statements */ {}
- | "begin" required_statements { std::swap($$, $2); }
- | return_statement { $$.push_back($1); }
+ | "begin" required_statements { $$ = std::make_unique<std::vector<frontend::statement *>>(std::move($2));; }
+ | return_statement
+ {
+ $$ = std::make_unique<std::vector<frontend::statement *>>(std::vector<frontend::statement *>{ $1 });
+ }
| "begin" required_statements ";" return_statement
{
- std::swap($$, $2);
- $$.push_back($4);
+ $$ = std::make_unique<std::vector<frontend::statement *>>(std::move($2));
+ $$->push_back($4);
}
identifier_definition:
IDENTIFIER "*" { $$ = frontend::identifier_definition{ $1, true }; }
@@ -224,26 +227,24 @@ procedure_heading: formal_parameter_list return_declaration
}
}
procedure_declaration:
- "proc" identifier_definition procedure_heading ";" block ";"
+ "proc" identifier_definition procedure_heading block
{
- $$ = new frontend::procedure_declaration(frontend::make_position(@1), std::move($2), $3.second, std::move(*$5));
+ $$ = new frontend::procedure_declaration(frontend::make_position(@1), std::move($2), $3.second,
+ std::move(*$4));
std::swap($3.first, $$->parameter_names);
}
- | "proc" identifier_definition procedure_heading ";" "extern" ";"
+ | "proc" identifier_definition procedure_heading "extern"
{
$$ = new frontend::procedure_declaration(frontend::make_position(@1), std::move($2), $3.second);
std::swap($3.first, $$->parameter_names);
}
-procedure_declarations:
- procedure_declaration procedure_declarations
+procedure_part:
+ /* no procedure declarations */ {}
+ | procedure_declaration procedure_part
{
std::swap($$, $2);
$$.emplace($$.cbegin(), std::move($1));
}
- | procedure_declaration { $$.emplace_back(std::move($1)); }
-procedure_part:
- /* no procedure definitions */ {}
- | procedure_declarations { std::swap($$, $1); }
call_expression: designator_expression actual_parameter_list
{
$$ = new frontend::procedure_call(frontend::make_position(@1), $1);
@@ -401,7 +402,7 @@ designator_expression:
| simple_expression "^"
{ $$ = new frontend::dereference_expression(frontend::make_position(@1), $1); }
| IDENTIFIER
- { $$ = new frontend::variable_expression(frontend::make_position(@1), $1); }
+ { $$ = new frontend::named_expression(frontend::make_position(@1), $1); }
statement:
designator_expression ":=" expression
{ $$ = new frontend::assign_statement(frontend::make_position(@1), $1, $3); }
@@ -487,7 +488,7 @@ type_expression:
}
| IDENTIFIER
{
- $$ = new frontend::named_type_expression(frontend::make_position(@1), $1);
+ $$ = new frontend::named_expression(frontend::make_position(@1), $1);
}
identifiers:
IDENTIFIER "," identifiers
@@ -497,18 +498,18 @@ identifiers:
}
| IDENTIFIER { $$.emplace_back(std::move($1)); }
variable_declaration:
- identifier_definitions ":" type_expression ";"
+ identifier_definitions ":" type_expression
{
std::shared_ptr<frontend::type_expression> shared_type{ $3 };
$$ = new frontend::variable_declaration( frontend::make_position(@2), std::move($1), shared_type);
}
- | identifier_definitions ":" type_expression ":=" "extern" ";"
+ | identifier_definitions ":" type_expression ":=" "extern"
{
std::shared_ptr<frontend::type_expression> shared_type{ $3 };
$$ = new frontend::variable_declaration( frontend::make_position(@2), std::move($1), shared_type,
std::monostate{});
}
- | identifier_definitions ":" type_expression ":=" expression ";"
+ | identifier_definitions ":" type_expression ":=" expression
{
std::shared_ptr<frontend::type_expression> shared_type{ $3 };
$$ = new frontend::variable_declaration( frontend::make_position(@2), std::move($1), shared_type, $5);
@@ -523,7 +524,7 @@ variable_declarations:
variable_part:
/* no variable declarations */ {}
| "var" variable_declarations { std::swap($$, $2); }
-constant_declaration: identifier_definition ":=" expression ";"
+constant_declaration: identifier_definition ":=" expression
{
$$ = new frontend::constant_declaration(frontend::make_position(@1), std::move($1), $3);
}
@@ -556,8 +557,8 @@ import_declarations:
}
import_part:
/* no import declarations */ {}
- | "import" import_declarations ";" { std::swap($$, $2); }
-type_declaration: identifier_definition "=" type_expression ";"
+ | "import" import_declarations { std::swap($$, $2); }
+type_declaration: identifier_definition "=" type_expression
{
$$ = new frontend::type_declaration(frontend::make_position(@1), std::move($1), $3);
}