Implement first intrinsics for output

This commit is contained in:
2024-03-20 17:56:38 +01:00
parent c210c55a17
commit a78e08521e
13 changed files with 221 additions and 214 deletions

View File

@ -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;

View File

@ -70,11 +70,11 @@ namespace elna::source
end,
assignment,
colon,
question_mark,
when,
then,
_while,
_do
_do,
procedure
};
/**

View File

@ -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();

View File

@ -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;
};