Implement first intrinsics for output

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

View File

@ -350,10 +350,6 @@ namespace elna::source
{
tokens.emplace_back(token::type::comma, iterator.position());
}
else if (*iterator == '?')
{
tokens.emplace_back(token::type::question_mark, iterator.position());
}
else if (*iterator == '.')
{
tokens.emplace_back(token::type::dot, iterator.position());
@ -407,6 +403,10 @@ namespace elna::source
{
tokens.emplace_back(token::type::boolean, 0, iterator.position());
}
else if (word == "proc")
{
tokens.emplace_back(token::type::procedure, 0, iterator.position());
}
else
{
tokens.emplace_back(token::type::identifier, word.c_str(), iterator.position());

View File

@ -7,7 +7,12 @@ namespace elna::source
{
}
void empty_visitor::visit(definition *definition)
void empty_visitor::visit(constant_definition *definition)
{
definition->body().accept(this);
}
void empty_visitor::visit(procedure_definition *definition)
{
definition->body().accept(this);
}
@ -17,11 +22,6 @@ namespace elna::source
statement->arguments().accept(this);
}
void empty_visitor::visit(question_mark_statement *statement)
{
statement->body().accept(this);
}
void empty_visitor::visit(compound_statement *statement)
{
for (auto& nested_statement : statement->statements())
@ -95,24 +95,19 @@ namespace elna::source
{
}
std::string& declaration::identifier() noexcept
{
return m_identifier;
}
definition::definition(const std::string& identifier, std::unique_ptr<integer_literal>&& body)
: m_identifier(std::move(identifier)), m_body(std::move(body))
{
}
void declaration::accept(parser_visitor *visitor)
{
visitor->visit(this);
}
void definition::accept(parser_visitor *visitor)
std::string& declaration::identifier() noexcept
{
return m_identifier;
}
definition::definition(const std::string& identifier)
: m_identifier(identifier)
{
visitor->visit(this);
}
std::string& definition::identifier() noexcept
@ -120,7 +115,32 @@ namespace elna::source
return m_identifier;
}
integer_literal& definition::body()
constant_definition::constant_definition(const std::string& identifier, std::unique_ptr<integer_literal>&& body)
: definition(identifier), m_body(std::move(body))
{
}
void constant_definition::accept(parser_visitor *visitor)
{
visitor->visit(this);
}
integer_literal& constant_definition::body()
{
return *m_body;
}
procedure_definition::procedure_definition(const std::string& identifier, std::unique_ptr<block>&& body)
: definition(identifier), m_body(std::move(body))
{
}
void procedure_definition::accept(parser_visitor *visitor)
{
visitor->visit(this);
}
block& procedure_definition::body()
{
return *m_body;
}
@ -279,21 +299,6 @@ namespace elna::source
return *m_body;
}
question_mark_statement::question_mark_statement(std::unique_ptr<condition>&& body)
: m_body(std::move(body))
{
}
void question_mark_statement::accept(parser_visitor *visitor)
{
visitor->visit(this);
}
condition& question_mark_statement::body()
{
return *m_body;
}
compound_statement::compound_statement(std::vector<std::unique_ptr<statement>>&& statements)
: m_statements(std::move(statements))
{
@ -329,7 +334,7 @@ namespace elna::source
return *m_rvalue;
}
if_statement::if_statement(std::unique_ptr<condition>&& prerequisite, std::unique_ptr<statement>&& body)
if_statement::if_statement(std::unique_ptr<expression>&& prerequisite, std::unique_ptr<statement>&& body)
: m_prerequisite(std::move(prerequisite)), m_body(std::move(body))
{
}
@ -339,7 +344,7 @@ namespace elna::source
visitor->visit(this);
}
condition& if_statement::prerequisite()
expression& if_statement::prerequisite()
{
return *m_prerequisite;
}
@ -349,7 +354,7 @@ namespace elna::source
return *m_body;
}
while_statement::while_statement(std::unique_ptr<condition>&& prerequisite, std::unique_ptr<statement>&& body)
while_statement::while_statement(std::unique_ptr<expression>&& prerequisite, std::unique_ptr<statement>&& body)
: m_prerequisite(std::move(prerequisite)), m_body(std::move(body))
{
}
@ -359,7 +364,7 @@ namespace elna::source
visitor->visit(this);
}
condition& while_statement::prerequisite()
expression& while_statement::prerequisite()
{
return *m_prerequisite;
}
@ -407,6 +412,12 @@ namespace elna::source
++iterator;
return result;
}
else if (iterator->of() == source::token::token::type::boolean)
{
auto result = std::make_unique<boolean_literal>(iterator->number());
++iterator;
return result;
}
else if (iterator->of() == source::token::type::left_paren)
{
++iterator;
@ -458,18 +469,7 @@ namespace elna::source
return term;
}
std::unique_ptr<condition> parser::parse_condition()
{
if (iterator->of() == source::token::token::type::boolean)
{
auto result = std::make_unique<boolean_literal>(iterator->number());
++iterator;
return result;
}
return nullptr;
}
std::unique_ptr<definition> parser::parse_definition()
std::unique_ptr<constant_definition> parser::parse_constant_definition()
{
auto definition_identifier = iterator.advance(token::type::identifier);
@ -484,7 +484,7 @@ namespace elna::source
if (iterator->of() == source::token::type::number)
{
auto result = std::make_unique<definition>(definition_identifier.value().get().identifier(),
auto result = std::make_unique<constant_definition>(definition_identifier.value().get().identifier(),
std::make_unique<integer_literal>(iterator->number()));
++iterator;
return result;
@ -519,10 +519,6 @@ namespace elna::source
{
return parse_call_statement();
}
else if (iterator.current(token::type::question_mark))
{
return parse_question_mark_statement();
}
else if (iterator.current(token::type::begin))
{
return parse_compound_statement();
@ -555,21 +551,6 @@ namespace elna::source
return nullptr;
}
std::unique_ptr<question_mark_statement> parser::parse_question_mark_statement()
{
if (!iterator.advance(token::type::question_mark))
{
return nullptr;
}
auto question_mark_body = parse_condition();
if (question_mark_body != nullptr)
{
return std::make_unique<question_mark_statement>(std::move(question_mark_body));
}
return nullptr;
}
std::unique_ptr<compound_statement> parser::parse_compound_statement()
{
if (!iterator.advance(token::type::begin))
@ -624,7 +605,7 @@ namespace elna::source
{
return nullptr;
}
auto condition = parse_condition();
auto condition = parse_expression();
if (condition == nullptr || !iterator.skip(token::type::then))
{
@ -645,7 +626,7 @@ namespace elna::source
{
return nullptr;
}
auto condition = parse_condition();
auto condition = parse_expression();
if (condition == nullptr || !iterator.skip(token::type::_do))
{
@ -671,7 +652,7 @@ namespace elna::source
++iterator; // Skip const.
std::unique_ptr<definition> parsed_definition;
while ((parsed_definition = parse_definition()) != nullptr)
while ((parsed_definition = parse_constant_definition()) != nullptr)
{
definitions.push_back(std::move(parsed_definition));

View File

@ -3,7 +3,7 @@
namespace elna::source
{
void name_analysis_visitor::visit(definition *definition)
void name_analysis_visitor::visit(constant_definition *definition)
{
this->table->enter(definition->identifier(),
std::make_shared<constant_info>(constant_info(definition->body().number())));