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

Add ASTNodeDataTypeChecker and its associated tests

parent 00f8c0e7
No related branches found
No related tags found
1 merge request!37Feature/language
#include <ASTNodeDataTypeChecker.hpp>
void
ASTNodeDataTypeChecker::_checkNodeDataTypes(const ASTNode& n)
{
if (n.m_data_type == ASTNodeDataType::undefined_t) {
throw parse_error("unexpected error: undefined datatype for AST node for " + n.name(), n.begin());
}
for (const auto& child : n.children) {
this->_checkNodeDataTypes(*child);
}
}
ASTNodeDataTypeChecker::ASTNodeDataTypeChecker(const ASTNode& node)
{
Assert(node.is_root());
this->_checkNodeDataTypes(node);
std::cout << " - checked node data types\n";
}
#ifndef AST_NODE_DATA_TYPE_CHECKER_HPP
#define AST_NODE_DATA_TYPE_CHECKER_HPP
#include <ASTNode.hpp>
class ASTNodeDataTypeChecker
{
private:
void _checkNodeDataTypes(const ASTNode& node);
public:
ASTNodeDataTypeChecker(const ASTNode& root_node);
};
#endif // AST_NODE_DATA_TYPE_CHECKER_HPP
...@@ -9,6 +9,7 @@ add_library( ...@@ -9,6 +9,7 @@ add_library(
ASTDotPrinter.cpp ASTDotPrinter.cpp
ASTNodeDataType.cpp ASTNodeDataType.cpp
ASTNodeDataTypeBuilder.cpp ASTNodeDataTypeBuilder.cpp
ASTNodeDataTypeChecker.cpp
ASTNodeAffectationExpressionBuilder.cpp ASTNodeAffectationExpressionBuilder.cpp
ASTNodeBinaryOperatorExpressionBuilder.cpp ASTNodeBinaryOperatorExpressionBuilder.cpp
ASTNodeExpressionBuilder.cpp ASTNodeExpressionBuilder.cpp
......
...@@ -20,6 +20,7 @@ ...@@ -20,6 +20,7 @@
#include <SymbolTable.hpp> #include <SymbolTable.hpp>
#include <ASTNodeDataTypeBuilder.hpp> #include <ASTNodeDataTypeBuilder.hpp>
#include <ASTNodeDataTypeChecker.hpp>
#include <EscapedString.hpp> #include <EscapedString.hpp>
...@@ -33,29 +34,6 @@ ...@@ -33,29 +34,6 @@
namespace language namespace language
{ {
namespace internal
{
void
check_node_data_types(const ASTNode& n)
{
if (n.m_data_type == ASTNodeDataType::undefined_t) {
throw parse_error("unexpected error: undefined datatype for AST node for " + n.name(), n.begin());
}
for (auto& child : n.children) {
check_node_data_types(*child);
}
}
} // namespace internal
void
check_node_data_types(const ASTNode& n)
{
Assert(n.is_root());
internal::check_node_data_types(n);
std::cout << " - checked node data types\n";
}
namespace internal namespace internal
{ {
void void
...@@ -199,8 +177,8 @@ parser(const std::string& filename) ...@@ -199,8 +177,8 @@ parser(const std::string& filename)
} }
ASTNodeDataTypeBuilder{*root_node}; ASTNodeDataTypeBuilder{*root_node};
ASTNodeDataTypeChecker{*root_node};
language::check_node_data_types(*root_node);
language::build_node_values(*root_node); language::build_node_values(*root_node);
language::check_break_or_continue_placement(*root_node); language::check_break_or_continue_placement(*root_node);
......
...@@ -9,6 +9,7 @@ add_executable (unit_tests ...@@ -9,6 +9,7 @@ add_executable (unit_tests
test_ASTBuilder.cpp test_ASTBuilder.cpp
test_ASTNodeDataType.cpp test_ASTNodeDataType.cpp
test_ASTNodeDataTypeBuilder.cpp test_ASTNodeDataTypeBuilder.cpp
test_ASTNodeDataTypeChecker.cpp
test_ASTPrinter.cpp test_ASTPrinter.cpp
test_ASTSymbolTableBuilder.cpp test_ASTSymbolTableBuilder.cpp
test_ASTSymbolInitializationChecker.cpp test_ASTSymbolInitializationChecker.cpp
......
#include <catch2/catch.hpp>
#include <ASTBuilder.hpp>
#include <ASTNodeDataTypeBuilder.hpp>
#include <ASTNodeDataTypeChecker.hpp>
#include <ASTSymbolTableBuilder.hpp>
TEST_CASE("ASTNodeDataTypeChecker", "[language]")
{
SECTION("everything ok: nothrow")
{
std::string_view data = R"(
for(Z i=0; i<10; ++i) {
cout << "i=" << i;
cout<< "\n";
}
)";
string_input input{data, "test.pgs"};
auto ast = ASTBuilder::build(input);
ASTSymbolTableBuilder{*ast};
ASTNodeDataTypeBuilder{*ast};
REQUIRE_NOTHROW(ASTNodeDataTypeChecker{*ast});
}
SECTION("everything uninitialized node type")
{
std::string_view data = R"(
for(Z i=0; i<10; ++i) {
cout << "i=" << i;
cout<< "\n";
}
)";
string_input input{data, "test.pgs"};
auto ast = ASTBuilder::build(input);
ASTSymbolTableBuilder{*ast};
ASTNodeDataTypeBuilder{*ast};
ast->children[0]->m_data_type = ASTNodeDataType::undefined_t;
REQUIRE_THROWS_AS(ASTNodeDataTypeChecker{*ast}, parse_error);
}
}
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment