diff --git a/src/language/ASTSymbolTableBuilder.cpp b/src/language/ASTSymbolTableBuilder.cpp index ac3b7a6c00881684bb6624a8d8e002a26c5d58be..87a549c020d90690ff768ffe26703dcedffab58d 100644 --- a/src/language/ASTSymbolTableBuilder.cpp +++ b/src/language/ASTSymbolTableBuilder.cpp @@ -46,23 +46,24 @@ ASTSymbolTableBuilder::buildSymbolTable(ASTNode& n, std::shared_ptr<SymbolTable> throw parse_error(error_message.str(), std::vector{n.begin()}); } } else if (n.is_type<language::function_definition>()) { - auto register_symbol = [&](const std::string& symbol) { - auto [i_symbol, success] = symbol_table->add(symbol, n.children[0]->begin()); + auto register_symbol = [&](const ASTNode& argument_node) { + auto [i_symbol, success] = symbol_table->add(argument_node.string(), argument_node.begin()); if (not success) { std::ostringstream error_message; - error_message << "symbol '" << rang::fg::red << symbol << rang::fg::reset << "' was already defined!"; - throw parse_error(error_message.str(), std::vector{n.begin()}); + error_message << "symbol '" << rang::fg::red << argument_node.string() << rang::fg::reset + << "' was already defined!"; + throw parse_error(error_message.str(), std::vector{argument_node.begin()}); } // Symbols will be initialized at call i_symbol->attributes().setIsInitialized(); }; if (n.children[0]->is_type<language::name>()) { - register_symbol(n.children[0]->string()); + register_symbol(*n.children[0]); } else { // treats the case of list of parameters Assert(n.children[0]->is_type<language::name_list>()); for (auto& child : n.children[0]->children) { - register_symbol(child->string()); + register_symbol(*child); } } } else if (n.is_type<language::name>()) { diff --git a/tests/test_ASTSymbolTableBuilder.cpp b/tests/test_ASTSymbolTableBuilder.cpp index 1f3d98f21f74c8ff9fc538d6964fb4f96e03c271..58ea3bdb7331befea1df910ee1bb10bce7e2fa6a 100644 --- a/tests/test_ASTSymbolTableBuilder.cpp +++ b/tests/test_ASTSymbolTableBuilder.cpp @@ -21,28 +21,56 @@ N n = 2; ASTSymbolTableBuilder{*ast}; } - SECTION("Undeclared symbol") + SECTION("errors") { - std::string_view data = R"( + SECTION("Undeclared symbol") + { + std::string_view data = R"( N n = a; )"; - string_input input{data, "test.pgs"}; - auto ast = ASTBuilder::build(input); + string_input input{data, "test.pgs"}; + auto ast = ASTBuilder::build(input); - REQUIRE_THROWS_AS(ASTSymbolTableBuilder{*ast}, parse_error); - } + REQUIRE_THROWS_AS(ASTSymbolTableBuilder{*ast}, parse_error); + } - SECTION("Re-declared symbol") - { - std::string_view data = R"( + SECTION("Re-declared symbol") + { + std::string_view data = R"( N n = 0; N n = 1; )"; - string_input input{data, "test.pgs"}; - auto ast = ASTBuilder::build(input); + string_input input{data, "test.pgs"}; + auto ast = ASTBuilder::build(input); + + REQUIRE_THROWS_AS(ASTSymbolTableBuilder{*ast}, parse_error); + } + + SECTION("Re-declared symbol (function)") + { + std::string_view data = R"( +N f; +let f : R -> R, x -> 1; +)"; + + string_input input{data, "test.pgs"}; + auto ast = ASTBuilder::build(input); + + REQUIRE_THROWS_AS(ASTSymbolTableBuilder{*ast}, parse_error); + } + + SECTION("Re-declared parameter (function)") + { + std::string_view data = R"( +let f : R*R*N -> R, (x,y,x) -> 1; +)"; + + string_input input{data, "test.pgs"}; + auto ast = ASTBuilder::build(input); - REQUIRE_THROWS_AS(ASTSymbolTableBuilder{*ast}, parse_error); + REQUIRE_THROWS_AS(ASTSymbolTableBuilder{*ast}, parse_error); + } } }