Skip to content
Snippets Groups Projects
Select Git revision
  • dffffa3b407222bb5af07b8c4f0b92feec4b2fc5
  • develop default protected
  • feature/variational-hydro
  • origin/stage/bouguettaia
  • feature/gmsh-reader
  • feature/reconstruction
  • save_clemence
  • feature/kinetic-schemes
  • feature/local-dt-fsi
  • feature/composite-scheme-sources
  • feature/composite-scheme-other-fluxes
  • feature/serraille
  • feature/composite-scheme
  • hyperplastic
  • feature/polynomials
  • feature/gks
  • feature/implicit-solver-o2
  • feature/coupling_module
  • feature/implicit-solver
  • feature/merge-local-dt-fsi
  • master protected
  • v0.5.0 protected
  • v0.4.1 protected
  • v0.4.0 protected
  • v0.3.0 protected
  • v0.2.0 protected
  • v0.1.0 protected
  • Kidder
  • v0.0.4 protected
  • v0.0.3 protected
  • v0.0.2 protected
  • v0 protected
  • v0.0.1 protected
33 results

TinyVector.hpp

Blame
  • ASTSymbolTableBuilder.cpp 1.81 KiB
    #include <ASTSymbolTableBuilder.hpp>
    #include <SymbolTable.hpp>
    
    #include <PEGGrammar.hpp>
    
    void
    ASTSymbolTableBuilder::buildSymbolTable(ASTNode& n, std::shared_ptr<SymbolTable>& symbol_table)
    {
      if (n.is<language::bloc>() or (n.is<language::for_statement>())) {
        if (!n.children.empty()) {
          std::shared_ptr bloc_symbol_table = std::make_shared<SymbolTable>(symbol_table);
          n.m_symbol_table                  = bloc_symbol_table;
          for (auto& child : n.children) {
            this->buildSymbolTable(*child, bloc_symbol_table);
          }
        }
      } else {
        n.m_symbol_table = symbol_table;
        if (n.has_content()) {
          if (n.is<language::declaration>()) {
            const std::string& symbol = n.children[1]->string();
            auto [i_symbol, success]  = symbol_table->add(symbol);
            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()});
            }
          } else if (n.is<language::name>()) {
            auto [i_symbol, found] = symbol_table->find(n.string());
            if (not found) {
              std::ostringstream error_message;
              error_message << "undefined symbol '" << rang::fg::red << n.string() << rang::fg::reset << '\'';
              throw parse_error(error_message.str(), std::vector{n.begin()});
            }
          }
        }
    
        for (auto& child : n.children) {
          this->buildSymbolTable(*child, symbol_table);
        }
      }
    }
    
    ASTSymbolTableBuilder::ASTSymbolTableBuilder(ASTNode& node)
    {
      Assert(node.is_root());
      std::shared_ptr symbol_table = std::make_shared<SymbolTable>();
    
      node.m_symbol_table = symbol_table;
    
      this->buildSymbolTable(node, symbol_table);
      std::cout << " - checked symbols declaration\n";
    }