Implement first intrinsics for output
This commit is contained in:
@ -160,10 +160,13 @@ namespace elna::riscv
|
||||
class visitor final : public source::parser_visitor
|
||||
{
|
||||
std::shared_ptr<source::writer> writer;
|
||||
|
||||
public:
|
||||
std::vector<instruction> instructions;
|
||||
bool register_in_use{ true };
|
||||
|
||||
void generate_intrinsics();
|
||||
void relocate(std::string_view name, address_t target);
|
||||
|
||||
public:
|
||||
std::uint32_t variable_counter = 1;
|
||||
std::vector<reference> references;
|
||||
std::shared_ptr<source::symbol_table> table;
|
||||
@ -171,9 +174,9 @@ namespace elna::riscv
|
||||
visitor(std::shared_ptr<source::writer> writer);
|
||||
|
||||
virtual void visit(source::declaration *declaration) override;
|
||||
virtual void visit(source::definition *definition) override;
|
||||
virtual void visit(source::constant_definition *definition) override;
|
||||
virtual void visit(source::procedure_definition *definition) override;
|
||||
virtual void visit(source::call_statement *statement) override;
|
||||
virtual void visit(source::question_mark_statement *statement) override;
|
||||
virtual void visit(source::compound_statement *statement) override;
|
||||
virtual void visit(source::assign_statement *statement) override;
|
||||
virtual void visit(source::if_statement *statement) override;
|
||||
|
@ -70,11 +70,11 @@ namespace elna::source
|
||||
end,
|
||||
assignment,
|
||||
colon,
|
||||
question_mark,
|
||||
when,
|
||||
then,
|
||||
_while,
|
||||
_do
|
||||
_do,
|
||||
procedure
|
||||
};
|
||||
|
||||
/**
|
||||
|
@ -15,9 +15,9 @@ namespace elna::source
|
||||
};
|
||||
|
||||
class declaration;
|
||||
class definition;
|
||||
class constant_definition;
|
||||
class procedure_definition;
|
||||
class call_statement;
|
||||
class question_mark_statement;
|
||||
class compound_statement;
|
||||
class assign_statement;
|
||||
class if_statement;
|
||||
@ -32,9 +32,9 @@ namespace elna::source
|
||||
struct parser_visitor
|
||||
{
|
||||
virtual void visit(declaration *) = 0;
|
||||
virtual void visit(definition *) = 0;
|
||||
virtual void visit(constant_definition *) = 0;
|
||||
virtual void visit(procedure_definition *) = 0;
|
||||
virtual void visit(call_statement *) = 0;
|
||||
virtual void visit(question_mark_statement *) = 0;
|
||||
virtual void visit(compound_statement *) = 0;
|
||||
virtual void visit(assign_statement *) = 0;
|
||||
virtual void visit(if_statement *) = 0;
|
||||
@ -50,9 +50,9 @@ namespace elna::source
|
||||
struct empty_visitor : parser_visitor
|
||||
{
|
||||
virtual void visit(declaration *declaration) override;
|
||||
virtual void visit(definition *definition) override;
|
||||
virtual void visit(constant_definition *definition) override;
|
||||
virtual void visit(procedure_definition *definition) override;
|
||||
virtual void visit(call_statement *statement) override;
|
||||
virtual void visit(question_mark_statement *statement) override;
|
||||
virtual void visit(compound_statement *statement) override;
|
||||
virtual void visit(assign_statement *statement) override;
|
||||
virtual void visit(if_statement *) override;
|
||||
@ -82,10 +82,6 @@ namespace elna::source
|
||||
{
|
||||
};
|
||||
|
||||
class condition : public node
|
||||
{
|
||||
};
|
||||
|
||||
/**
|
||||
* Variable declaration.
|
||||
*/
|
||||
@ -106,16 +102,36 @@ namespace elna::source
|
||||
class definition : public node
|
||||
{
|
||||
std::string m_identifier;
|
||||
|
||||
protected:
|
||||
definition(const std::string& identifier);
|
||||
|
||||
public:
|
||||
std::string& identifier() noexcept;
|
||||
};
|
||||
|
||||
class constant_definition : public definition
|
||||
{
|
||||
std::unique_ptr<integer_literal> m_body;
|
||||
|
||||
public:
|
||||
definition(const std::string& identifier, std::unique_ptr<integer_literal>&& body);
|
||||
constant_definition(const std::string& identifier, std::unique_ptr<integer_literal>&& body);
|
||||
virtual void accept(parser_visitor *visitor) override;
|
||||
|
||||
std::string& identifier() noexcept;
|
||||
integer_literal& body();
|
||||
};
|
||||
|
||||
class procedure_definition : public definition
|
||||
{
|
||||
std::unique_ptr<block> m_body;
|
||||
|
||||
public:
|
||||
procedure_definition(const std::string& identifier, std::unique_ptr<block>&& body);
|
||||
virtual void accept(parser_visitor *visitor) override;
|
||||
|
||||
block& body();
|
||||
};
|
||||
|
||||
class call_statement : public statement
|
||||
{
|
||||
std::string m_name;
|
||||
@ -129,17 +145,6 @@ namespace elna::source
|
||||
expression& arguments();
|
||||
};
|
||||
|
||||
class question_mark_statement : public statement
|
||||
{
|
||||
std::unique_ptr<condition> m_body;
|
||||
|
||||
public:
|
||||
question_mark_statement(std::unique_ptr<condition>&& body);
|
||||
virtual void accept(parser_visitor *visitor) override;
|
||||
|
||||
condition& body();
|
||||
};
|
||||
|
||||
class compound_statement : public statement
|
||||
{
|
||||
std::vector<std::unique_ptr<statement>> m_statements;
|
||||
@ -167,27 +172,27 @@ namespace elna::source
|
||||
|
||||
class if_statement : public statement
|
||||
{
|
||||
std::unique_ptr<condition> m_prerequisite;
|
||||
std::unique_ptr<expression> m_prerequisite;
|
||||
std::unique_ptr<statement> m_body;
|
||||
|
||||
public:
|
||||
if_statement(std::unique_ptr<condition>&& prerequisite, std::unique_ptr<statement>&& body);
|
||||
if_statement(std::unique_ptr<expression>&& prerequisite, std::unique_ptr<statement>&& body);
|
||||
virtual void accept(parser_visitor *visitor) override;
|
||||
|
||||
condition& prerequisite();
|
||||
expression& prerequisite();
|
||||
statement& body();
|
||||
};
|
||||
|
||||
class while_statement : public statement
|
||||
{
|
||||
std::unique_ptr<condition> m_prerequisite;
|
||||
std::unique_ptr<expression> m_prerequisite;
|
||||
std::unique_ptr<statement> m_body;
|
||||
|
||||
public:
|
||||
while_statement(std::unique_ptr<condition>&& prerequisite, std::unique_ptr<statement>&& body);
|
||||
while_statement(std::unique_ptr<expression>&& prerequisite, std::unique_ptr<statement>&& body);
|
||||
virtual void accept(parser_visitor *visitor) override;
|
||||
|
||||
condition& prerequisite();
|
||||
expression& prerequisite();
|
||||
statement& body();
|
||||
};
|
||||
|
||||
@ -230,7 +235,7 @@ namespace elna::source
|
||||
std::int32_t number() const noexcept;
|
||||
};
|
||||
|
||||
class boolean_literal : public condition
|
||||
class boolean_literal : public expression
|
||||
{
|
||||
bool m_boolean;
|
||||
|
||||
@ -273,12 +278,10 @@ namespace elna::source
|
||||
std::unique_ptr<expression> parse_factor();
|
||||
std::unique_ptr<expression> parse_term();
|
||||
std::unique_ptr<expression> parse_expression();
|
||||
std::unique_ptr<condition> parse_condition();
|
||||
std::unique_ptr<definition> parse_definition();
|
||||
std::unique_ptr<constant_definition> parse_constant_definition();
|
||||
std::unique_ptr<declaration> parse_declaration();
|
||||
std::unique_ptr<statement> parse_statement();
|
||||
std::unique_ptr<call_statement> parse_call_statement();
|
||||
std::unique_ptr<question_mark_statement> parse_question_mark_statement();
|
||||
std::unique_ptr<compound_statement> parse_compound_statement();
|
||||
std::unique_ptr<assign_statement> parse_assign_statement();
|
||||
std::unique_ptr<if_statement> parse_if_statement();
|
||||
|
@ -9,7 +9,7 @@ namespace elna::source
|
||||
std::shared_ptr<symbol_table> table;
|
||||
|
||||
public:
|
||||
void visit(definition *definition) override;
|
||||
void visit(constant_definition *definition) override;
|
||||
void visit(declaration *declaration) override;
|
||||
void visit(block *block) override;
|
||||
};
|
||||
|
Reference in New Issue
Block a user