Implement pointers

This commit is contained in:
2025-01-10 23:17:18 +01:00
parent 954425f4bd
commit 35c32fcf3f
15 changed files with 131 additions and 915 deletions

View File

@@ -99,6 +99,8 @@
%type <elna::source::type_definition *> type_definition;
%type <std::vector<elna::source::type_definition *>> type_definitions type_part;
%type <elna::source::block *> block;
%type <std::pair<std::string, elna::source::type_expression *>> field_declaration;
%type <std::vector<std::pair<std::string, elna::source::type_expression *>>> field_list;
%%
program:
type_part constant_part procedure_part variable_part compound_statement DOT
@@ -223,37 +225,31 @@ summand:
factor:
AT pointer
{
$$ = new elna::source::unary_expression(elna::source::make_position(@1),
$2, '@');
$$ = new elna::source::unary_expression(elna::source::make_position(@1), $2, '@');
}
| pointer { $$ = $1; }
comparand:
summand PLUS summand
{
$$ = new elna::source::binary_expression(elna::source::make_position(@1),
$1, $3, '+');
$$ = new elna::source::binary_expression(elna::source::make_position(@1), $1, $3, '+');
}
| summand MINUS summand
{
$$ = new elna::source::binary_expression(elna::source::make_position(@1),
$1, $3, '-');
$$ = new elna::source::binary_expression(elna::source::make_position(@1), $1, $3, '-');
}
| summand { $$ = std::move($1); }
expression:
comparand EQUALS comparand
{
$$ = new elna::source::binary_expression(elna::source::make_position(@1),
$1, $3, '=');
$$ = new elna::source::binary_expression(elna::source::make_position(@1), $1, $3, '=');
}
| comparand NOT_EQUAL comparand
{
$$ = new elna::source::binary_expression(elna::source::make_position(@1),
$1, $3, 'n');
$$ = new elna::source::binary_expression(elna::source::make_position(@1), $1, $3, 'n');
}
| comparand LESS_THAN comparand
{
$$ = new elna::source::binary_expression(elna::source::make_position(@1),
$1, $3, '<');
$$ = new elna::source::binary_expression(elna::source::make_position(@1), $1, $3, '<');
}
| comparand GREATER_THAN comparand
{
@@ -305,12 +301,21 @@ statements:
statement SEMICOLON statements
{
std::swap($$, $3);
$$.emplace($$.cbegin(), std::move($1));
$$.emplace($$.cbegin(), $1);
}
| statement { $$.emplace_back($1); }
| statement { $$.push_back($1); }
optional_statements:
statements { std::swap($$, $1); }
| /* no statements */ {}
field_declaration:
IDENTIFIER COLON type_expression { $$ = std::make_pair($1, $3); }
field_list:
field_declaration SEMICOLON field_list
{
std::swap($$, $3);
$$.emplace($$.cbegin(), $1);
}
| field_declaration { $$.emplace_back($1); }
type_expression:
ARRAY INTEGER OF type_expression
{
@@ -320,6 +325,10 @@ type_expression:
{
$$ = new elna::source::pointer_type_expression(elna::source::make_position(@1), $2);
}
| RECORD field_list END_BLOCK
{
$$ = new elna::source::record_type_expression(elna::source::make_position(@1), std::move($2));
}
| IDENTIFIER
{
$$ = new elna::source::basic_type_expression(elna::source::make_position(@1), $1);