diff --git a/src/language/ASTNodeDataTypeChecker.cpp b/src/language/ASTNodeDataTypeChecker.cpp new file mode 100644 index 0000000000000000000000000000000000000000..d598e3a87eb03d8984ab5d8aa67d5a97533c1268 --- /dev/null +++ b/src/language/ASTNodeDataTypeChecker.cpp @@ -0,0 +1,20 @@ +#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"; +} diff --git a/src/language/ASTNodeDataTypeChecker.hpp b/src/language/ASTNodeDataTypeChecker.hpp new file mode 100644 index 0000000000000000000000000000000000000000..6bf555a0bf3f4743fa9f429525c89a7a54446734 --- /dev/null +++ b/src/language/ASTNodeDataTypeChecker.hpp @@ -0,0 +1,15 @@ +#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 diff --git a/src/language/CMakeLists.txt b/src/language/CMakeLists.txt index 8216aeac94b8868a3dd73a2604e46e53de740ba0..5b14863b4145924d37e736897ab027f836c297cc 100644 --- a/src/language/CMakeLists.txt +++ b/src/language/CMakeLists.txt @@ -9,6 +9,7 @@ add_library( ASTDotPrinter.cpp ASTNodeDataType.cpp ASTNodeDataTypeBuilder.cpp + ASTNodeDataTypeChecker.cpp ASTNodeAffectationExpressionBuilder.cpp ASTNodeBinaryOperatorExpressionBuilder.cpp ASTNodeExpressionBuilder.cpp diff --git a/src/language/PugsParser.cpp b/src/language/PugsParser.cpp index b57dfc03ae3601a832a2aa3fedcdb16ac958793c..f0a3ebb05c3e4676926920c62a614b2312fdda6f 100644 --- a/src/language/PugsParser.cpp +++ b/src/language/PugsParser.cpp @@ -20,6 +20,7 @@ #include <SymbolTable.hpp> #include <ASTNodeDataTypeBuilder.hpp> +#include <ASTNodeDataTypeChecker.hpp> #include <EscapedString.hpp> @@ -33,29 +34,6 @@ 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 { void @@ -199,8 +177,8 @@ parser(const std::string& filename) } ASTNodeDataTypeBuilder{*root_node}; + ASTNodeDataTypeChecker{*root_node}; - language::check_node_data_types(*root_node); language::build_node_values(*root_node); language::check_break_or_continue_placement(*root_node); diff --git a/tests/CMakeLists.txt b/tests/CMakeLists.txt index b8c714d184adf80ebb54fc4facb86ecf8a6ff87b..21c8a1b235926f850851400d33a4bac87bd7c8d7 100644 --- a/tests/CMakeLists.txt +++ b/tests/CMakeLists.txt @@ -9,6 +9,7 @@ add_executable (unit_tests test_ASTBuilder.cpp test_ASTNodeDataType.cpp test_ASTNodeDataTypeBuilder.cpp + test_ASTNodeDataTypeChecker.cpp test_ASTPrinter.cpp test_ASTSymbolTableBuilder.cpp test_ASTSymbolInitializationChecker.cpp diff --git a/tests/test_ASTNodeDataTypeChecker.cpp b/tests/test_ASTNodeDataTypeChecker.cpp new file mode 100644 index 0000000000000000000000000000000000000000..bb4c7474dbd0fa70d8c1d90013ba0c9acf156d9f --- /dev/null +++ b/tests/test_ASTNodeDataTypeChecker.cpp @@ -0,0 +1,48 @@ +#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); + } +}