Implement argument passing

This commit is contained in:
2025-01-15 01:48:09 +01:00
parent 5cb0e18a87
commit 1e45d66359
7 changed files with 106 additions and 92 deletions

View File

@ -146,7 +146,7 @@ namespace source
{
}
void empty_visitor::visit(char_literal *)
void empty_visitor::visit(number_literal<unsigned char> *)
{
}
@ -376,7 +376,7 @@ namespace source
}
constant_definition::constant_definition(const struct position position, const std::string& identifier,
number_literal<std::int32_t> *body)
literal *body)
: definition(position, identifier), m_body(body)
{
}
@ -386,7 +386,7 @@ namespace source
visitor->visit(this);
}
number_literal<std::int32_t>& constant_definition::body()
literal& constant_definition::body()
{
return *m_body;
}
@ -493,23 +493,13 @@ namespace source
}
}
char_literal::char_literal(const struct position position, const unsigned char value)
: expression(position), m_character(value)
literal::literal(const struct position position)
: expression(position)
{
}
void char_literal::accept(parser_visitor *visitor)
{
visitor->visit(this);
}
unsigned char char_literal::character() const
{
return m_character;
}
string_literal::string_literal(const struct position position, const std::string& value)
: expression(position), m_string(value)
: literal(position), m_string(value)
{
}

View File

@ -74,11 +74,7 @@
%precedence THEN
%precedence ELSE
%type <elna::source::number_literal<std::int32_t> *> integer_literal;
%type <elna::source::number_literal<double> *> float_literal;
%type <elna::source::number_literal<bool> *> boolean_literal;
%type <elna::source::char_literal *> character_literal;
%type <elna::source::string_literal *> string_literal;
%type <elna::source::literal *> literal;
%type <elna::source::constant_definition *> constant_definition;
%type <std::vector<elna::source::constant_definition *>> constant_part constant_definitions;
%type <elna::source::variable_declaration *> variable_declaration;
@ -165,26 +161,6 @@ procedure_definitions:
procedure_part:
/* no procedure definitions */ {}
| procedure_definitions { std::swap($$, $1); }
integer_literal: INTEGER
{
$$ = new elna::source::number_literal<std::int32_t>(elna::source::make_position(@1), $1);
};
float_literal: FLOAT
{
$$ = new elna::source::number_literal<double>(elna::source::make_position(@1), $1);
};
character_literal: CHARACTER
{
$$ = new elna::source::char_literal(elna::source::make_position(@1), $1.at(0));
};
string_literal: STRING
{
$$ = new elna::source::string_literal(elna::source::make_position(@1), $1);
};
boolean_literal: BOOLEAN
{
$$ = new elna::source::number_literal<bool>(elna::source::make_position(@1), $1);
};
compound_statement: BEGIN_BLOCK optional_statements END_BLOCK
{
$$ = new elna::source::compound_statement(elna::source::make_position(@1));
@ -215,12 +191,29 @@ if_statement:
$$ = new elna::source::if_statement(elna::source::make_position(@1),
$2, $4, $6);
}
literal:
INTEGER
{
$$ = new elna::source::number_literal<std::int32_t>(elna::source::make_position(@1), $1);
}
| FLOAT
{
$$ = new elna::source::number_literal<double>(elna::source::make_position(@1), $1);
}
| BOOLEAN
{
$$ = new elna::source::number_literal<bool>(elna::source::make_position(@1), $1);
}
| CHARACTER
{
$$ = new elna::source::number_literal<unsigned char>(elna::source::make_position(@1), $1.at(0));
}
| STRING
{
$$ = new elna::source::string_literal(elna::source::make_position(@1), $1);
}
pointer:
integer_literal { $$ = $1; }
| float_literal { $$ = $1; }
| boolean_literal { $$ = $1; }
| character_literal { $$ = $1; }
| string_literal { $$ = $1; }
literal { $$ = $1; }
| designator_expression { $$ = $1; }
| LEFT_PAREN expression RIGHT_PAREN { $$ = std::move($2); }
summand:
@ -359,7 +352,7 @@ type_expression:
}
variable_declaration: IDENTIFIER COLON type_expression
{
$$ = new elna::source::variable_declaration(elna::source::make_position(@1), $1, $3);
$$ = new elna::source::variable_declaration(elna::source::make_position(@1), $1, $3);
};
variable_declarations:
variable_declaration COMMA variable_declarations
@ -371,9 +364,9 @@ variable_declarations:
variable_part:
/* no variable declarations */ {}
| VAR variable_declarations SEMICOLON { std::swap($$, $2); }
constant_definition: IDENTIFIER EQUALS integer_literal
constant_definition: IDENTIFIER EQUALS literal
{
$$ = new elna::source::constant_definition(elna::source::make_position(@1), $1, $3);
$$ = new elna::source::constant_definition(elna::source::make_position(@1), $1, $3);
}
constant_definitions:
constant_definition COMMA constant_definitions