From 8b3805d0038f531a51d0b211a9a843365b813ee3 Mon Sep 17 00:00:00 2001 From: Stephane Del Pino <stephane.delpino44@gmail.com> Date: Thu, 26 Sep 2019 19:04:59 +0200 Subject: [PATCH] Continue preparation of function evaluation Function table is now populated and FunctionDescriptor is no more an inner class of FunctionTable. BTW fixed few warnings --- src/language/ASTSymbolTableBuilder.cpp | 4 ++++ src/language/FunctionTable.hpp | 27 ++++++++++++++------------ src/language/SymbolTable.hpp | 10 +++++++++- 3 files changed, 28 insertions(+), 13 deletions(-) diff --git a/src/language/ASTSymbolTableBuilder.cpp b/src/language/ASTSymbolTableBuilder.cpp index e078f079f..aaab7c141 100644 --- a/src/language/ASTSymbolTableBuilder.cpp +++ b/src/language/ASTSymbolTableBuilder.cpp @@ -29,6 +29,10 @@ ASTSymbolTableBuilder::buildSymbolTable(ASTNode& n, std::shared_ptr<SymbolTable> for (auto& child : n.children) { this->buildSymbolTable(*child, local_symbol_table); } + + size_t function_id = symbol_table->functionTable()->add(FunctionDescriptor{}); + i_symbol->attributes().value() = function_id; + } else { n.m_symbol_table = symbol_table; if (n.has_content()) { diff --git a/src/language/FunctionTable.hpp b/src/language/FunctionTable.hpp index 0471969b4..a5dae9c85 100644 --- a/src/language/FunctionTable.hpp +++ b/src/language/FunctionTable.hpp @@ -12,22 +12,25 @@ #include <iostream> -class FunctionTable +class FunctionDescriptor { - class FunctionDescriptor - { - std::unique_ptr<ASTNode> m_domain_mapping_node; - std::unique_ptr<ASTNode> m_expression_node; + std::unique_ptr<ASTNode> m_domain_mapping_node; + std::unique_ptr<ASTNode> m_expression_node; - public: - FunctionDescriptor& operator=(const FunctionDescriptor&) = default; - FunctionDescriptor& operator=(FunctionDescriptor&&) = default; + public: + FunctionDescriptor& operator=(FunctionDescriptor&&) = default; - FunctionDescriptor(FunctionDescriptor&&) = default; - FunctionDescriptor() = default; - ~FunctionDescriptor() = default; - }; + FunctionDescriptor(std::unique_ptr<ASTNode>&& domain_mapping_node, std::unique_ptr<ASTNode>&& expression_node) + : m_domain_mapping_node(std::move(domain_mapping_node)), m_expression_node(std::move(expression_node)) + {} + FunctionDescriptor(FunctionDescriptor&&) = default; + FunctionDescriptor() = default; + ~FunctionDescriptor() = default; +}; + +class FunctionTable +{ private: std::vector<FunctionDescriptor> m_function_descriptor_list; diff --git a/src/language/SymbolTable.hpp b/src/language/SymbolTable.hpp index 193dac31f..af700706f 100644 --- a/src/language/SymbolTable.hpp +++ b/src/language/SymbolTable.hpp @@ -70,6 +70,9 @@ class SymbolTable friend std::ostream& operator<<(std::ostream& os, const Attributes& attributes) { + if (attributes.m_data_type == ASTNodeDataType::function_t) { + os << "function_id:"; + } std::visit( [&](const auto& value) { using T = std::decay_t<decltype(value)>; @@ -124,7 +127,6 @@ class SymbolTable Symbol(const Symbol&) = default; Symbol(Symbol&&) = default; - Symbol() = default; ~Symbol() = default; }; @@ -134,6 +136,12 @@ class SymbolTable std::shared_ptr<FunctionTable> m_function_table; public: + auto + functionTable() const + { + return m_function_table; + } + friend std::ostream& operator<<(std::ostream& os, const SymbolTable& symbol_table) { -- GitLab