diff --git a/src/language/ast/ASTSymbolTableBuilder.cpp b/src/language/ast/ASTSymbolTableBuilder.cpp index 5d83e514d609095701e93e8a93e5fb185b445f43..44058de6f3739580dbcf3d34e22970647c6bb2ad 100644 --- a/src/language/ast/ASTSymbolTableBuilder.cpp +++ b/src/language/ast/ASTSymbolTableBuilder.cpp @@ -22,11 +22,19 @@ ASTSymbolTableBuilder::buildSymbolTable(ASTNode& n, std::shared_ptr<SymbolTable> n.m_symbol_table = local_symbol_table; const std::string& symbol = n.children[0]->string(); - auto [i_symbol, success] = symbol_table->add(symbol, n.children[0]->begin()); + + if (symbol_table->getBuiltinFunctionSymbolList(symbol, n.children[0]->begin()).size() > 0) { + std::ostringstream error_message; + error_message << "symbol '" << rang::fg::red << symbol << rang::fg::reset + << "' already denotes a builtin function!"; + throw ParseError(error_message.str(), std::vector{n.children[0]->begin()}); + } + + auto [i_symbol, success] = symbol_table->add(symbol, n.children[0]->begin()); if (not success) { std::ostringstream error_message; error_message << "symbol '" << rang::fg::red << symbol << rang::fg::reset << "' was already defined!"; - throw ParseError(error_message.str(), std::vector{n.begin()}); + throw ParseError(error_message.str(), std::vector{n.children[0]->begin()}); } for (auto& child : n.children) { @@ -42,6 +50,13 @@ ASTSymbolTableBuilder::buildSymbolTable(ASTNode& n, std::shared_ptr<SymbolTable> if (n.has_content()) { if (n.is_type<language::var_declaration>()) { auto register_symbol = [&](const ASTNode& argument_node) { + if (symbol_table->getBuiltinFunctionSymbolList(argument_node.string(), argument_node.begin()).size() > 0) { + std::ostringstream error_message; + error_message << "symbol '" << rang::fg::red << argument_node.string() << rang::fg::reset + << "' already denotes a builtin function!"; + throw ParseError(error_message.str(), std::vector{argument_node.begin()}); + } + auto [i_symbol, success] = symbol_table->add(argument_node.string(), argument_node.begin()); if (not success) { std::ostringstream error_message; @@ -61,6 +76,13 @@ ASTSymbolTableBuilder::buildSymbolTable(ASTNode& n, std::shared_ptr<SymbolTable> } } else if (n.is_type<language::function_definition>()) { auto register_and_initialize_symbol = [&](const ASTNode& argument_node) { + if (symbol_table->getBuiltinFunctionSymbolList(argument_node.string(), argument_node.begin()).size() > 0) { + std::ostringstream error_message; + error_message << "symbol '" << rang::fg::red << argument_node.string() << rang::fg::reset + << "' already denotes a builtin function!"; + throw ParseError(error_message.str(), std::vector{argument_node.begin()}); + } + auto [i_symbol, success] = symbol_table->add(argument_node.string(), argument_node.begin()); if (not success) { std::ostringstream error_message;