Skip to content
Snippets Groups Projects
Commit 2605cd62 authored by Stéphane Del Pino's avatar Stéphane Del Pino
Browse files

Add ASTNodeDeclarationToAffectationConverter and its unit tests

parent 79d08cd5
No related branches found
No related tags found
1 merge request!37Feature/language
#include <ASTNodeDeclarationToAffectationConverter.hpp>
#include <PEGGrammar.hpp>
#include <PugsAssert.hpp>
void
ASTNodeDeclarationToAffectationConverter::_convertNodeDeclaration(ASTNode& n)
{
if (n.is<language::declaration>()) {
if (n.children.size() == 3) {
n.children[0] = std::move(n.children[1]);
n.children[1] = std::move(n.children[2]);
n.children.resize(2);
n.id = typeid(language::eq_op);
}
} else {
for (auto& child : n.children) {
this->_convertNodeDeclaration(*child);
}
}
}
ASTNodeDeclarationToAffectationConverter::ASTNodeDeclarationToAffectationConverter(ASTNode& n)
{
Assert(n.is_root());
this->_convertNodeDeclaration(n);
}
#ifndef AST_NODE_DECLARATION_TO_AFFECTATION_CONVERTER_HPP
#define AST_NODE_DECLARATION_TO_AFFECTATION_CONVERTER_HPP
#include <ASTNode.hpp>
class ASTNodeDeclarationToAffectationConverter
{
private:
void _convertNodeDeclaration(ASTNode& node);
public:
ASTNodeDeclarationToAffectationConverter(ASTNode& root_node);
};
#endif // AST_NODE_DECLARATION_TO_AFFECTATION_CONVERTER_HPP
......@@ -12,6 +12,7 @@ add_library(
ASTNodeDataType.cpp
ASTNodeDataTypeBuilder.cpp
ASTNodeDataTypeChecker.cpp
ASTNodeDeclarationToAffectationConverter.cpp
ASTNodeExpressionBuilder.cpp
ASTNodeIncDecExpressionBuilder.cpp
ASTNodeJumpPlacementChecker.cpp
......
......@@ -29,42 +29,13 @@
#include <ASTSymbolInitializationChecker.hpp>
#include <ASTSymbolTableBuilder.hpp>
#include <ASTNodeDeclarationToAffectationConverter.hpp>
#include <ASTDotPrinter.hpp>
#include <ASTPrinter.hpp>
#include <ASTNodeValueBuilder.hpp>
namespace language
{
namespace internal
{
void
simplify_declarations(ASTNode& n)
{
if (n.is<language::declaration>()) {
if (n.children.size() == 3) {
n.children[0] = std::move(n.children[1]);
n.children[1] = std::move(n.children[2]);
n.children.resize(2);
n.id = typeid(language::eq_op);
}
} else {
for (auto& child : n.children) {
simplify_declarations(*child);
}
}
}
} // namespace internal
void
simplify_declarations(ASTNode& n)
{
Assert(n.is_root());
internal::simplify_declarations(n);
}
} // namespace language
void
parser(const std::string& filename)
{
......@@ -100,7 +71,7 @@ parser(const std::string& filename)
ASTNodeJumpPlacementChecker{*root_node};
// optimizations
language::simplify_declarations(*root_node);
ASTNodeDeclarationToAffectationConverter{*root_node};
language::build_node_type(*root_node);
......
......@@ -10,6 +10,7 @@ add_executable (unit_tests
test_ASTNodeDataType.cpp
test_ASTNodeDataTypeBuilder.cpp
test_ASTNodeDataTypeChecker.cpp
test_ASTNodeDeclarationToAffectationConverter.cpp
test_ASTNodeJumpPlacementChecker.cpp
test_ASTNodeValueBuilder.cpp
test_ASTPrinter.cpp
......
#include <catch2/catch.hpp>
#include <ASTNodeValueBuilder.hpp>
#include <ASTBuilder.hpp>
#include <ASTNodeDataTypeBuilder.hpp>
#include <ASTNodeDeclarationToAffectationConverter.hpp>
#include <ASTSymbolTableBuilder.hpp>
#include <ASTPrinter.hpp>
#define CHECK_AST(data, expected_output) \
{ \
static_assert(std::is_same_v<std::decay_t<decltype(data)>, std::string_view>); \
static_assert(std::is_same_v<std::decay_t<decltype(expected_output)>, std::string_view>); \
\
string_input input{data, "test.pgs"}; \
auto ast = ASTBuilder::build(input); \
\
ASTSymbolTableBuilder{*ast}; \
ASTNodeDataTypeBuilder{*ast}; \
ASTNodeValueBuilder{*ast}; \
\
ASTNodeDeclarationToAffectationConverter{*ast}; \
\
std::stringstream ast_output; \
ast_output << '\n' << ASTPrinter{*ast, ASTPrinter::Format::raw, {ASTPrinter::Info::none}}; \
\
REQUIRE(ast_output.str() == expected_output); \
}
TEST_CASE("ASTNodeDeclarationToAffectationConverter", "[language]")
{
SECTION("nothing to convert")
{
std::string_view data = R"(
R z;
)";
std::string_view result = R"(
(root)
`-(language::declaration)
+-(language::R_set)
`-(language::name:z)
)";
CHECK_AST(data, result);
}
SECTION("simple constructor")
{
std::string_view data = R"(
R z = 0;
)";
std::string_view result = R"(
(root)
`-(language::eq_op)
+-(language::name:z)
`-(language::integer:0)
)";
CHECK_AST(data, result);
}
SECTION("complex constructors")
{
std::string_view data = R"(
N k = 0;
for(N i=0; i<2; ++i) {
N j = 2*i+k;
k = 2*j-1;
}
)";
std::string_view result = R"(
(root)
+-(language::eq_op)
| +-(language::name:k)
| `-(language::integer:0)
`-(language::for_statement)
+-(language::eq_op)
| +-(language::name:i)
| `-(language::integer:0)
+-(language::lesser_op)
| +-(language::name:i)
| `-(language::integer:2)
+-(language::unary_plusplus)
| `-(language::name:i)
`-(language::for_statement_bloc)
+-(language::eq_op)
| +-(language::name:j)
| `-(language::plus_op)
| +-(language::multiply_op)
| | +-(language::integer:2)
| | `-(language::name:i)
| `-(language::name:k)
`-(language::eq_op)
+-(language::name:k)
`-(language::minus_op)
+-(language::multiply_op)
| +-(language::integer:2)
| `-(language::name:j)
`-(language::integer:1)
)";
CHECK_AST(data, result);
}
}
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment