Implement argument passing
This commit is contained in:
@ -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)
|
||||
{
|
||||
}
|
||||
|
||||
|
@ -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
|
||||
|
Reference in New Issue
Block a user