User Guide
symtab_visitor.hpp
Go to the documentation of this file.
1 /*
2  * Copyright 2023 Blue Brain Project, EPFL.
3  * See the top-level LICENSE file for details.
4  *
5  * SPDX-License-Identifier: Apache-2.0
6  */
7 
8 ///
9 /// THIS FILE IS GENERATED AT BUILD TIME AND SHALL NOT BE EDITED.
10 ///
11 
12 #pragma once
13 
14 /**
15  * \file
16  * \brief \copybrief nmodl::visitor::SymtabVisitor
17  */
18 
19 #include <set>
20 
21 #include "symtab/symbol_table.hpp"
22 #include "visitors/ast_visitor.hpp"
24 
25 namespace nmodl {
26 namespace visitor {
27 
28 /**
29  * @addtogroup visitor_classes
30  * @{
31  */
32 
33 /**
34  * \class SymtabVisitor
35  * \brief Concrete visitor for constructing symbol table from AST
36  */
37 class SymtabVisitor: public AstVisitor {
38  private:
40 
41  std::unique_ptr<printer::JSONPrinter> printer;
42  std::set<std::string> block_to_solve;
43  bool update = false;
44  bool under_state_block = false;
45 
46  public:
47  explicit SymtabVisitor(bool update = false)
48  : printer(new printer::JSONPrinter())
49  , update(update) {}
50 
51  SymtabVisitor(symtab::ModelSymbolTable* _modsymtab, bool update = false)
52  : modsymtab(_modsymtab)
53  , update(update) {}
54 
55  SymtabVisitor(std::ostream& os, bool update = false)
56  : printer(new printer::JSONPrinter(os))
57  , update(update) {}
58 
59  SymtabVisitor(const std::string& filename, bool update = false)
60  : printer(new printer::JSONPrinter(filename))
61  , update(update) {}
62 
64 
66 
67  void setup_symbol_table(ast::Ast* node, const std::string& name, bool is_global);
68 
70 
72 
73  void setup_symbol_table_for_scoped_block(ast::Node* node, const std::string& name);
74 
75  // clang-format off
76  void visit_prime_name(ast::PrimeName& node) override;
77  void visit_argument(ast::Argument& node) override;
78  void visit_read_ion_var(ast::ReadIonVar& node) override;
79  void visit_write_ion_var(ast::WriteIonVar& node) override;
81  void visit_electrode_cur_var(ast::ElectrodeCurVar& node) override;
82  void visit_range_var(ast::RangeVar& node) override;
83  void visit_global_var(ast::GlobalVar& node) override;
84  void visit_pointer_var(ast::PointerVar& node) override;
85  void visit_random_var(ast::RandomVar& node) override;
87  void visit_extern_var(ast::ExternVar& node) override;
88  void visit_param_block(ast::ParamBlock& node) override;
90  void visit_assigned_block(ast::AssignedBlock& node) override;
91  void visit_state_block(ast::StateBlock& node) override;
92  void visit_initial_block(ast::InitialBlock& node) override;
94  void visit_destructor_block(ast::DestructorBlock& node) override;
95  void visit_statement_block(ast::StatementBlock& node) override;
96  void visit_derivative_block(ast::DerivativeBlock& node) override;
97  void visit_linear_block(ast::LinearBlock& node) override;
98  void visit_non_linear_block(ast::NonLinearBlock& node) override;
99  void visit_discrete_block(ast::DiscreteBlock& node) override;
101  void visit_function_block(ast::FunctionBlock& node) override;
102  void visit_procedure_block(ast::ProcedureBlock& node) override;
103  void visit_net_receive_block(ast::NetReceiveBlock& node) override;
104  void visit_solve_block(ast::SolveBlock& node) override;
105  void visit_breakpoint_block(ast::BreakpointBlock& node) override;
106  void visit_before_block(ast::BeforeBlock& node) override;
107  void visit_after_block(ast::AfterBlock& node) override;
108  void visit_ba_block(ast::BABlock& node) override;
109  void visit_for_netcon(ast::ForNetcon& node) override;
110  void visit_kinetic_block(ast::KineticBlock& node) override;
111  void visit_unit_block(ast::UnitBlock& node) override;
112  void visit_constant_block(ast::ConstantBlock& node) override;
113  void visit_neuron_block(ast::NeuronBlock& node) override;
114  void visit_local_var(ast::LocalVar& node) override;
115  void visit_constant_var(ast::ConstantVar& node) override;
116  void visit_unit_def(ast::UnitDef& node) override;
117  void visit_factor_def(ast::FactorDef& node) override;
118  void visit_define(ast::Define& node) override;
119  void visit_param_assign(ast::ParamAssign& node) override;
121  void visit_table_statement(ast::TableStatement& node) override;
122  void visit_useion(ast::Useion& node) override;
123  void visit_program(ast::Program& node) override;
124  void visit_nrn_state_block(ast::NrnStateBlock& node) override;
127  // clang-format on
128 };
129 
130 /** @} */ // end of visitor_classes
131 
132 } // namespace visitor
133 } // namespace nmodl
134 
nmodl::visitor::SymtabVisitor::visit_function_block
void visit_function_block(ast::FunctionBlock &node) override
visit node of type ast::FunctionBlock
Definition: symtab_visitor.cpp:128
nmodl::visitor::SymtabVisitor::visit_kinetic_block
void visit_kinetic_block(ast::KineticBlock &node) override
visit node of type ast::KineticBlock
Definition: symtab_visitor.cpp:166
nmodl::ast::ParamAssign
TODO.
Definition: param_assign.hpp:38
nmodl::ast::BeforeBlock
Represents a BEFORE block in NMODL.
Definition: before_block.hpp:38
nmodl::ast::ConstantVar
Represents a variable in the ast::ConstantBlock.
Definition: constant_var.hpp:38
nmodl::ast::SolveBlock
TODO.
Definition: solve_block.hpp:38
nmodl::visitor::SymtabVisitor::visit_global_var
void visit_global_var(ast::GlobalVar &node) override
visit node of type ast::GlobalVar
Definition: symtab_visitor.cpp:51
nmodl::ast::Node
Base class for all AST node.
Definition: node.hpp:40
nmodl::ast::BABlock
Represents a block to be executed before or after another block.
Definition: ba_block.hpp:40
nmodl::visitor::SymtabVisitor::visit_solve_block
void visit_solve_block(ast::SolveBlock &node) override
visit node of type ast::SolveBlock
Definition: symtab_visitor.cpp:142
nmodl::visitor::SymtabVisitor::visit_unit_def
void visit_unit_def(ast::UnitDef &node) override
visit node of type ast::UnitDef
Definition: symtab_visitor.cpp:191
nmodl::visitor::SymtabVisitor::SymtabVisitor
SymtabVisitor(const std::string &filename, bool update=false)
Definition: symtab_visitor.hpp:59
nmodl::visitor::SymtabVisitor::visit_local_var
void visit_local_var(ast::LocalVar &node) override
visit node of type ast::LocalVar
Definition: symtab_visitor.cpp:183
nmodl::ast::Ast
Base class for all Abstract Syntax Tree node types.
Definition: ast.hpp:69
nmodl::ast::AssignedDefinition
Represents a statement in ASSIGNED or STATE block.
Definition: assigned_definition.hpp:38
nmodl::ast::FactorDef
TODO.
Definition: factor_def.hpp:38
nmodl::ast::FunctionBlock
TODO.
Definition: function_block.hpp:39
nmodl::visitor::SymtabVisitor::add_model_symbol_with_property
void add_model_symbol_with_property(ast::Node *node, symtab::syminfo::NmodlType property)
Definition: symtab_visitor_helper.hpp:150
nmodl::ast::PointerVar
TODO.
Definition: pointer_var.hpp:38
nmodl::visitor::SymtabVisitor::visit_unit_block
void visit_unit_block(ast::UnitBlock &node) override
visit node of type ast::UnitBlock
Definition: symtab_visitor.cpp:171
nmodl::ast::BbcorePointerVar
Represent a single variable of type BBCOREPOINTER.
Definition: bbcore_pointer_var.hpp:39
nmodl::ast::NetReceiveBlock
TODO.
Definition: net_receive_block.hpp:39
nmodl::visitor::SymtabVisitor::printer
std::unique_ptr< printer::JSONPrinter > printer
Definition: symtab_visitor.hpp:41
nmodl::ast::FunctionTableBlock
TODO.
Definition: function_table_block.hpp:39
nmodl::ast::UnitBlock
TODO.
Definition: unit_block.hpp:39
nmodl::visitor::SymtabVisitor::visit_independent_block
void visit_independent_block(ast::IndependentBlock &node) override
visit node of type ast::IndependentBlock
Definition: symtab_visitor.cpp:75
nmodl::visitor::SymtabVisitor::visit_initial_block
void visit_initial_block(ast::InitialBlock &node) override
visit node of type ast::InitialBlock
Definition: symtab_visitor.cpp:87
nmodl::visitor::SymtabVisitor::visit_define
void visit_define(ast::Define &node) override
visit node of type ast::Define
Definition: symtab_visitor.cpp:199
nmodl::visitor::SymtabVisitor::visit_discrete_block
void visit_discrete_block(ast::DiscreteBlock &node) override
visit node of type ast::DiscreteBlock
Definition: symtab_visitor.cpp:118
nmodl
encapsulates code generation backend implementations
Definition: ast_common.hpp:26
nmodl::visitor::SymtabVisitor::visit_statement_block
void visit_statement_block(ast::StatementBlock &node) override
visit node of type ast::StatementBlock
Definition: symtab_visitor.cpp:99
nmodl::visitor::SymtabVisitor::SymtabVisitor
SymtabVisitor(std::ostream &os, bool update=false)
Definition: symtab_visitor.hpp:55
nmodl::ast::Define
Represents a DEFINE statement in NMODL.
Definition: define.hpp:38
nmodl::visitor::SymtabVisitor::visit_for_netcon
void visit_for_netcon(ast::ForNetcon &node) override
visit node of type ast::ForNetcon
Definition: symtab_visitor.cpp:162
nmodl::visitor::SymtabVisitor::SymtabVisitor
SymtabVisitor(bool update=false)
Definition: symtab_visitor.hpp:47
symbol_table.hpp
Implement classes for representing symbol table at block and file scope.
nmodl::visitor::SymtabVisitor::visit_neuron_block
void visit_neuron_block(ast::NeuronBlock &node) override
visit node of type ast::NeuronBlock
Definition: symtab_visitor.cpp:179
nmodl::ast::WriteIonVar
TODO.
Definition: write_ion_var.hpp:38
nmodl::visitor::SymtabVisitor::visit_derivative_block
void visit_derivative_block(ast::DerivativeBlock &node) override
visit node of type ast::DerivativeBlock
Definition: symtab_visitor.cpp:103
nmodl::ast::TableStatement
Represents TABLE statement in NMODL.
Definition: table_statement.hpp:39
nmodl::visitor::SymtabVisitor::visit_electrode_cur_var
void visit_electrode_cur_var(ast::ElectrodeCurVar &node) override
visit node of type ast::ElectrodeCurVar
Definition: symtab_visitor.cpp:43
nmodl::visitor::SymtabVisitor::update
bool update
Definition: symtab_visitor.hpp:43
nmodl::ast::ExternVar
TODO.
Definition: extern_var.hpp:38
nmodl::ast::RandomVar
Single variable of type RANDOM.
Definition: random_var.hpp:38
nmodl::visitor::SymtabVisitor
Concrete visitor for constructing symbol table from AST.
Definition: symtab_visitor.hpp:37
nmodl::visitor::SymtabVisitor::visit_ba_block
void visit_ba_block(ast::BABlock &node) override
visit node of type ast::BABlock
Definition: symtab_visitor.cpp:158
nmodl::ast::AssignedBlock
Represents a ASSIGNED block in the NMODL.
Definition: assigned_block.hpp:54
nmodl::ast::RangeVar
TODO.
Definition: range_var.hpp:38
nmodl::ast::EigenNewtonSolverBlock
Represent newton solver solution block based on Eigen.
Definition: eigen_newton_solver_block.hpp:38
nmodl::visitor::SymtabVisitor::visit_program
void visit_program(ast::Program &node) override
visit node of type ast::Program
Definition: symtab_visitor.cpp:215
nmodl::visitor::SymtabVisitor::visit_table_statement
void visit_table_statement(ast::TableStatement &node) override
Visit table statement and update symbol in symbol table.
Definition: symtab_visitor_helper.hpp:247
nmodl::ast::InitialBlock
Represents a INITIAL block in the NMODL.
Definition: initial_block.hpp:49
nmodl::visitor::SymtabVisitor::visit_param_assign
void visit_param_assign(ast::ParamAssign &node) override
visit node of type ast::ParamAssign
Definition: symtab_visitor.cpp:203
nmodl::visitor::SymtabVisitor::setup_symbol_table_for_program_block
void setup_symbol_table_for_program_block(ast::Program *node)
Symtab visitor could be called multiple times, after optimization passes, in which case we have to th...
Definition: symtab_visitor_helper.hpp:225
nmodl::ast::DiscreteBlock
TODO.
Definition: discrete_block.hpp:38
nmodl::ast::GlobalVar
TODO.
Definition: global_var.hpp:38
nmodl::visitor::SymtabVisitor::visit_factor_def
void visit_factor_def(ast::FactorDef &node) override
visit node of type ast::FactorDef
Definition: symtab_visitor.cpp:195
nmodl::ast::UnitDef
TODO.
Definition: unit_def.hpp:38
nmodl::printer::JSONPrinter
Helper class for printing AST in JSON form.
Definition: json_printer.hpp:46
nmodl::ast::ReadIonVar
TODO.
Definition: read_ion_var.hpp:38
nmodl::ast::BreakpointBlock
Represents a BREAKPOINT block in NMODL.
Definition: breakpoint_block.hpp:53
nmodl::visitor::SymtabVisitor::visit_function_table_block
void visit_function_table_block(ast::FunctionTableBlock &node) override
visit node of type ast::FunctionTableBlock
Definition: symtab_visitor.cpp:123
nmodl::visitor::SymtabVisitor::visit_useion
void visit_useion(ast::Useion &node) override
visit node of type ast::Useion
Definition: symtab_visitor.cpp:211
nmodl::visitor::SymtabVisitor::setup_symbol_table
void setup_symbol_table(ast::Ast *node, const std::string &name, bool is_global)
Definition: symtab_visitor_helper.hpp:185
nmodl::visitor::SymtabVisitor::visit_destructor_block
void visit_destructor_block(ast::DestructorBlock &node) override
visit node of type ast::DestructorBlock
Definition: symtab_visitor.cpp:95
nmodl::visitor::SymtabVisitor::setup_symbol
void setup_symbol(ast::Node *node, symtab::syminfo::NmodlType property)
helper function to setup/insert symbol into symbol table for the ast nodes which are of variable type...
Definition: symtab_visitor_helper.hpp:53
nmodl::ast::DestructorBlock
Represents a DESTRUCTOR block in the NMODL.
Definition: destructor_block.hpp:53
nmodl::visitor::SymtabVisitor::visit_after_block
void visit_after_block(ast::AfterBlock &node) override
visit node of type ast::AfterBlock
Definition: symtab_visitor.cpp:154
nmodl::ast::ConstructorBlock
Represents a CONSTRUCTOR block in the NMODL.
Definition: constructor_block.hpp:51
nmodl::visitor::SymtabVisitor::modsymtab
symtab::ModelSymbolTable * modsymtab
Definition: symtab_visitor.hpp:39
nmodl::visitor::SymtabVisitor::visit_eigen_newton_solver_block
void visit_eigen_newton_solver_block(ast::EigenNewtonSolverBlock &node) override
visit node of type ast::EigenNewtonSolverBlock
Definition: symtab_visitor.cpp:223
nmodl::visitor::SymtabVisitor::setup_symbol_table_for_scoped_block
void setup_symbol_table_for_scoped_block(ast::Node *node, const std::string &name)
Definition: symtab_visitor_helper.hpp:237
nmodl::ast::Useion
Represents USEION statement in NMODL.
Definition: useion.hpp:40
nmodl::visitor::SymtabVisitor::visit_argument
void visit_argument(ast::Argument &node) override
visit node of type ast::Argument
Definition: symtab_visitor.cpp:27
nmodl::visitor::SymtabVisitor::visit_nonspecific_cur_var
void visit_nonspecific_cur_var(ast::NonspecificCurVar &node) override
visit node of type ast::NonspecificCurVar
Definition: symtab_visitor.cpp:39
nmodl::visitor::AstVisitor
Concrete visitor for all AST classes.
Definition: ast_visitor.hpp:37
nmodl::visitor::SymtabVisitor::visit_assigned_definition
void visit_assigned_definition(ast::AssignedDefinition &node) override
visit node of type ast::AssignedDefinition
Definition: symtab_visitor.cpp:207
nmodl::visitor::SymtabVisitor::visit_nrn_state_block
void visit_nrn_state_block(ast::NrnStateBlock &node) override
visit node of type ast::NrnStateBlock
Definition: symtab_visitor.cpp:219
nmodl::ast::ConstantBlock
Represent CONSTANT block in the mod file.
Definition: constant_block.hpp:50
nmodl::ast::PrimeName
Represents a prime variable (for ODE)
Definition: prime_name.hpp:48
nmodl::ast::DerivativeBlock
Represents DERIVATIVE block in the NMODL.
Definition: derivative_block.hpp:49
nmodl::visitor::SymtabVisitor::visit_extern_var
void visit_extern_var(ast::ExternVar &node) override
visit node of type ast::ExternVar
Definition: symtab_visitor.cpp:67
nmodl::visitor::SymtabVisitor::visit_bbcore_pointer_var
void visit_bbcore_pointer_var(ast::BbcorePointerVar &node) override
visit node of type ast::BbcorePointerVar
Definition: symtab_visitor.cpp:63
nmodl::ast::KineticBlock
TODO.
Definition: kinetic_block.hpp:39
nmodl::ast::EigenLinearSolverBlock
Represent linear solver solution block based on Eigen.
Definition: eigen_linear_solver_block.hpp:38
nmodl::ast::LocalVar
TODO.
Definition: local_var.hpp:38
nmodl::visitor::SymtabVisitor::visit_range_var
void visit_range_var(ast::RangeVar &node) override
visit node of type ast::RangeVar
Definition: symtab_visitor.cpp:47
nmodl::visitor::SymtabVisitor::visit_random_var
void visit_random_var(ast::RandomVar &node) override
visit node of type ast::RandomVar
Definition: symtab_visitor.cpp:59
nmodl::visitor::SymtabVisitor::visit_state_block
void visit_state_block(ast::StateBlock &node) override
visit node of type ast::StateBlock
Definition: symtab_visitor.cpp:83
nmodl::visitor::SymtabVisitor::visit_breakpoint_block
void visit_breakpoint_block(ast::BreakpointBlock &node) override
visit node of type ast::BreakpointBlock
Definition: symtab_visitor.cpp:146
nmodl::visitor::SymtabVisitor::visit_pointer_var
void visit_pointer_var(ast::PointerVar &node) override
visit node of type ast::PointerVar
Definition: symtab_visitor.cpp:55
nmodl::ast::StateBlock
Represents a STATE block in the NMODL.
Definition: state_block.hpp:52
nmodl::visitor::SymtabVisitor::visit_constant_var
void visit_constant_var(ast::ConstantVar &node) override
visit node of type ast::ConstantVar
Definition: symtab_visitor.cpp:187
nmodl::visitor::SymtabVisitor::visit_assigned_block
void visit_assigned_block(ast::AssignedBlock &node) override
visit node of type ast::AssignedBlock
Definition: symtab_visitor.cpp:79
nmodl::visitor::SymtabVisitor::visit_read_ion_var
void visit_read_ion_var(ast::ReadIonVar &node) override
visit node of type ast::ReadIonVar
Definition: symtab_visitor.cpp:31
nmodl::ast::NrnStateBlock
Represents the coreneuron nrn_state callback function.
Definition: nrn_state_block.hpp:39
nmodl::visitor::SymtabVisitor::visit_constant_block
void visit_constant_block(ast::ConstantBlock &node) override
visit node of type ast::ConstantBlock
Definition: symtab_visitor.cpp:175
nmodl::ast::StatementBlock
Represents block encapsulating list of statements.
Definition: statement_block.hpp:53
nmodl::visitor::SymtabVisitor::visit_write_ion_var
void visit_write_ion_var(ast::WriteIonVar &node) override
visit node of type ast::WriteIonVar
Definition: symtab_visitor.cpp:35
nmodl::symtab::syminfo::NmodlType
NmodlType
NMODL variable properties.
Definition: symbol_properties.hpp:116
nmodl::ast::ForNetcon
TODO.
Definition: for_netcon.hpp:39
nmodl::ast::Argument
Represents an argument to functions and procedures.
Definition: argument.hpp:48
nmodl::visitor::SymtabVisitor::visit_param_block
void visit_param_block(ast::ParamBlock &node) override
visit node of type ast::ParamBlock
Definition: symtab_visitor.cpp:71
nmodl::ast::LinearBlock
Represents LINEAR block in the NMODL.
Definition: linear_block.hpp:53
nmodl::symtab::ModelSymbolTable
Hold top level (i.e.
Definition: symbol_table.hpp:239
nmodl::ast::ProcedureBlock
TODO.
Definition: procedure_block.hpp:39
nmodl::visitor::SymtabVisitor::visit_net_receive_block
void visit_net_receive_block(ast::NetReceiveBlock &node) override
visit node of type ast::NetReceiveBlock
Definition: symtab_visitor.cpp:138
nmodl::visitor::SymtabVisitor::visit_eigen_linear_solver_block
void visit_eigen_linear_solver_block(ast::EigenLinearSolverBlock &node) override
visit node of type ast::EigenLinearSolverBlock
Definition: symtab_visitor.cpp:227
nmodl::ast::NonLinearBlock
Represents NONLINEAR block in the NMODL.
Definition: non_linear_block.hpp:50
nmodl::visitor::SymtabVisitor::visit_before_block
void visit_before_block(ast::BeforeBlock &node) override
visit node of type ast::BeforeBlock
Definition: symtab_visitor.cpp:150
nmodl::ast::ElectrodeCurVar
TODO.
Definition: electrode_cur_var.hpp:38
nmodl::visitor::SymtabVisitor::visit_constructor_block
void visit_constructor_block(ast::ConstructorBlock &node) override
visit node of type ast::ConstructorBlock
Definition: symtab_visitor.cpp:91
nmodl::ast::IndependentBlock
Represents a INDEPENDENT block in the NMODL.
Definition: independent_block.hpp:46
nmodl::visitor::SymtabVisitor::block_to_solve
std::set< std::string > block_to_solve
Definition: symtab_visitor.hpp:42
nmodl::visitor::SymtabVisitor::visit_prime_name
void visit_prime_name(ast::PrimeName &node) override
visit node of type ast::PrimeName
Definition: symtab_visitor.cpp:23
nmodl::ast::Program
Represents top level AST node for whole NMODL input.
Definition: program.hpp:39
nmodl::ast::AfterBlock
Represents a AFTER block in NMODL.
Definition: after_block.hpp:51
nmodl::visitor::SymtabVisitor::visit_procedure_block
void visit_procedure_block(ast::ProcedureBlock &node) override
visit node of type ast::ProcedureBlock
Definition: symtab_visitor.cpp:133
nmodl::ast::NeuronBlock
Represent NEURON block in the mod file.
Definition: neuron_block.hpp:53
nmodl::visitor::SymtabVisitor::setup_symbol_table_for_global_block
void setup_symbol_table_for_global_block(ast::Node *node)
Definition: symtab_visitor_helper.hpp:232
nmodl::ast::ParamBlock
Represents a PARAMETER block in the NMODL.
Definition: param_block.hpp:53
nmodl::ast::NonspecificCurVar
TODO.
Definition: nonspecific_cur_var.hpp:38
nmodl::visitor::SymtabVisitor::visit_non_linear_block
void visit_non_linear_block(ast::NonLinearBlock &node) override
visit node of type ast::NonLinearBlock
Definition: symtab_visitor.cpp:113
json_visitor.hpp
THIS FILE IS GENERATED AT BUILD TIME AND SHALL NOT BE EDITED.
nmodl::visitor::SymtabVisitor::SymtabVisitor
SymtabVisitor(symtab::ModelSymbolTable *_modsymtab, bool update=false)
Definition: symtab_visitor.hpp:51
nmodl::visitor::SymtabVisitor::under_state_block
bool under_state_block
Definition: symtab_visitor.hpp:44
ast_visitor.hpp
Concrete visitor for all AST classes.
nmodl::visitor::SymtabVisitor::visit_linear_block
void visit_linear_block(ast::LinearBlock &node) override
visit node of type ast::LinearBlock
Definition: symtab_visitor.cpp:108