User Guide
nmodl::visitor::SemanticAnalysisVisitor Class Reference

Visitor to check some semantic rules on the AST More...

Detailed Description

Visitor to check some semantic rules on the AST

Current checks:

  1. Check that a function or a procedure containing a TABLE statement contains only one argument (mandatory in mod2c).
  2. Check that destructor blocks are only inside mod file that are point_process.
  3. A TABLE statement in functions cannot have name list, and should have one in procedures.
  4. Check if ion variables from a USEION statement are not declared in CONSTANT block.
  5. Check if an independent variable is not 't'.
  6. Check that mutex are not badly use
  7. Check than function table got at least one argument.
  8. Check that at most one derivative block is present.
  9. Check that RANDOM variable is mentioned only as first arg in random function.

Definition at line 44 of file semantic_analysis_visitor.hpp.

#include <semantic_analysis_visitor.hpp>

Inheritance diagram for nmodl::visitor::SemanticAnalysisVisitor:
nmodl::visitor::ConstAstVisitor nmodl::visitor::ConstVisitor

Public Member Functions

 SemanticAnalysisVisitor (bool accel_backend=false)
 
bool check (const ast::Program &node)
 
- Public Member Functions inherited from nmodl::visitor::ConstAstVisitor
void visit_node (const ast::Node &node) override
 visit node of type ast::Node More...
 
void visit_statement (const ast::Statement &node) override
 visit node of type ast::Statement More...
 
void visit_expression (const ast::Expression &node) override
 visit node of type ast::Expression More...
 
void visit_block (const ast::Block &node) override
 visit node of type ast::Block More...
 
void visit_identifier (const ast::Identifier &node) override
 visit node of type ast::Identifier More...
 
void visit_number (const ast::Number &node) override
 visit node of type ast::Number More...
 
void visit_string (const ast::String &node) override
 visit node of type ast::String More...
 
void visit_integer (const ast::Integer &node) override
 visit node of type ast::Integer More...
 
void visit_float (const ast::Float &node) override
 visit node of type ast::Float More...
 
void visit_double (const ast::Double &node) override
 visit node of type ast::Double More...
 
void visit_boolean (const ast::Boolean &node) override
 visit node of type ast::Boolean More...
 
void visit_name (const ast::Name &node) override
 visit node of type ast::Name More...
 
void visit_prime_name (const ast::PrimeName &node) override
 visit node of type ast::PrimeName More...
 
void visit_indexed_name (const ast::IndexedName &node) override
 visit node of type ast::IndexedName More...
 
void visit_var_name (const ast::VarName &node) override
 visit node of type ast::VarName More...
 
void visit_argument (const ast::Argument &node) override
 visit node of type ast::Argument More...
 
void visit_react_var_name (const ast::ReactVarName &node) override
 visit node of type ast::ReactVarName More...
 
void visit_read_ion_var (const ast::ReadIonVar &node) override
 visit node of type ast::ReadIonVar More...
 
void visit_write_ion_var (const ast::WriteIonVar &node) override
 visit node of type ast::WriteIonVar More...
 
void visit_nonspecific_cur_var (const ast::NonspecificCurVar &node) override
 visit node of type ast::NonspecificCurVar More...
 
void visit_electrode_cur_var (const ast::ElectrodeCurVar &node) override
 visit node of type ast::ElectrodeCurVar More...
 
void visit_range_var (const ast::RangeVar &node) override
 visit node of type ast::RangeVar More...
 
void visit_global_var (const ast::GlobalVar &node) override
 visit node of type ast::GlobalVar More...
 
void visit_pointer_var (const ast::PointerVar &node) override
 visit node of type ast::PointerVar More...
 
void visit_random_var (const ast::RandomVar &node) override
 visit node of type ast::RandomVar More...
 
void visit_bbcore_pointer_var (const ast::BbcorePointerVar &node) override
 visit node of type ast::BbcorePointerVar More...
 
void visit_extern_var (const ast::ExternVar &node) override
 visit node of type ast::ExternVar More...
 
void visit_param_block (const ast::ParamBlock &node) override
 visit node of type ast::ParamBlock More...
 
void visit_independent_block (const ast::IndependentBlock &node) override
 visit node of type ast::IndependentBlock More...
 
void visit_assigned_block (const ast::AssignedBlock &node) override
 visit node of type ast::AssignedBlock More...
 
void visit_state_block (const ast::StateBlock &node) override
 visit node of type ast::StateBlock More...
 
void visit_initial_block (const ast::InitialBlock &node) override
 visit node of type ast::InitialBlock More...
 
void visit_constructor_block (const ast::ConstructorBlock &node) override
 visit node of type ast::ConstructorBlock More...
 
void visit_destructor_block (const ast::DestructorBlock &node) override
 visit node of type ast::DestructorBlock More...
 
void visit_statement_block (const ast::StatementBlock &node) override
 visit node of type ast::StatementBlock More...
 
void visit_derivative_block (const ast::DerivativeBlock &node) override
 visit node of type ast::DerivativeBlock More...
 
void visit_linear_block (const ast::LinearBlock &node) override
 visit node of type ast::LinearBlock More...
 
void visit_non_linear_block (const ast::NonLinearBlock &node) override
 visit node of type ast::NonLinearBlock More...
 
void visit_discrete_block (const ast::DiscreteBlock &node) override
 visit node of type ast::DiscreteBlock More...
 
void visit_function_table_block (const ast::FunctionTableBlock &node) override
 visit node of type ast::FunctionTableBlock More...
 
void visit_function_block (const ast::FunctionBlock &node) override
 visit node of type ast::FunctionBlock More...
 
void visit_procedure_block (const ast::ProcedureBlock &node) override
 visit node of type ast::ProcedureBlock More...
 
void visit_net_receive_block (const ast::NetReceiveBlock &node) override
 visit node of type ast::NetReceiveBlock More...
 
void visit_solve_block (const ast::SolveBlock &node) override
 visit node of type ast::SolveBlock More...
 
void visit_breakpoint_block (const ast::BreakpointBlock &node) override
 visit node of type ast::BreakpointBlock More...
 
void visit_before_block (const ast::BeforeBlock &node) override
 visit node of type ast::BeforeBlock More...
 
void visit_after_block (const ast::AfterBlock &node) override
 visit node of type ast::AfterBlock More...
 
void visit_ba_block (const ast::BABlock &node) override
 visit node of type ast::BABlock More...
 
void visit_for_netcon (const ast::ForNetcon &node) override
 visit node of type ast::ForNetcon More...
 
void visit_kinetic_block (const ast::KineticBlock &node) override
 visit node of type ast::KineticBlock More...
 
void visit_unit_block (const ast::UnitBlock &node) override
 visit node of type ast::UnitBlock More...
 
void visit_constant_block (const ast::ConstantBlock &node) override
 visit node of type ast::ConstantBlock More...
 
void visit_neuron_block (const ast::NeuronBlock &node) override
 visit node of type ast::NeuronBlock More...
 
void visit_unit (const ast::Unit &node) override
 visit node of type ast::Unit More...
 
void visit_double_unit (const ast::DoubleUnit &node) override
 visit node of type ast::DoubleUnit More...
 
void visit_local_var (const ast::LocalVar &node) override
 visit node of type ast::LocalVar More...
 
void visit_limits (const ast::Limits &node) override
 visit node of type ast::Limits More...
 
void visit_number_range (const ast::NumberRange &node) override
 visit node of type ast::NumberRange More...
 
void visit_constant_var (const ast::ConstantVar &node) override
 visit node of type ast::ConstantVar More...
 
void visit_binary_operator (const ast::BinaryOperator &node) override
 visit node of type ast::BinaryOperator More...
 
void visit_unary_operator (const ast::UnaryOperator &node) override
 visit node of type ast::UnaryOperator More...
 
void visit_reaction_operator (const ast::ReactionOperator &node) override
 visit node of type ast::ReactionOperator More...
 
void visit_paren_expression (const ast::ParenExpression &node) override
 visit node of type ast::ParenExpression More...
 
void visit_binary_expression (const ast::BinaryExpression &node) override
 visit node of type ast::BinaryExpression More...
 
void visit_diff_eq_expression (const ast::DiffEqExpression &node) override
 visit node of type ast::DiffEqExpression More...
 
void visit_unary_expression (const ast::UnaryExpression &node) override
 visit node of type ast::UnaryExpression More...
 
void visit_non_lin_equation (const ast::NonLinEquation &node) override
 visit node of type ast::NonLinEquation More...
 
void visit_lin_equation (const ast::LinEquation &node) override
 visit node of type ast::LinEquation More...
 
void visit_function_call (const ast::FunctionCall &node) override
 visit node of type ast::FunctionCall More...
 
void visit_watch (const ast::Watch &node) override
 visit node of type ast::Watch More...
 
void visit_ba_block_type (const ast::BABlockType &node) override
 visit node of type ast::BABlockType More...
 
void visit_unit_def (const ast::UnitDef &node) override
 visit node of type ast::UnitDef More...
 
void visit_factor_def (const ast::FactorDef &node) override
 visit node of type ast::FactorDef More...
 
void visit_valence (const ast::Valence &node) override
 visit node of type ast::Valence More...
 
void visit_unit_state (const ast::UnitState &node) override
 visit node of type ast::UnitState More...
 
void visit_local_list_statement (const ast::LocalListStatement &node) override
 visit node of type ast::LocalListStatement More...
 
void visit_model (const ast::Model &node) override
 visit node of type ast::Model More...
 
void visit_define (const ast::Define &node) override
 visit node of type ast::Define More...
 
void visit_include (const ast::Include &node) override
 visit node of type ast::Include More...
 
void visit_param_assign (const ast::ParamAssign &node) override
 visit node of type ast::ParamAssign More...
 
void visit_assigned_definition (const ast::AssignedDefinition &node) override
 visit node of type ast::AssignedDefinition More...
 
void visit_conductance_hint (const ast::ConductanceHint &node) override
 visit node of type ast::ConductanceHint More...
 
void visit_expression_statement (const ast::ExpressionStatement &node) override
 visit node of type ast::ExpressionStatement More...
 
void visit_protect_statement (const ast::ProtectStatement &node) override
 visit node of type ast::ProtectStatement More...
 
void visit_from_statement (const ast::FromStatement &node) override
 visit node of type ast::FromStatement More...
 
void visit_while_statement (const ast::WhileStatement &node) override
 visit node of type ast::WhileStatement More...
 
void visit_if_statement (const ast::IfStatement &node) override
 visit node of type ast::IfStatement More...
 
void visit_else_if_statement (const ast::ElseIfStatement &node) override
 visit node of type ast::ElseIfStatement More...
 
void visit_else_statement (const ast::ElseStatement &node) override
 visit node of type ast::ElseStatement More...
 
void visit_watch_statement (const ast::WatchStatement &node) override
 visit node of type ast::WatchStatement More...
 
void visit_mutex_lock (const ast::MutexLock &node) override
 visit node of type ast::MutexLock More...
 
void visit_mutex_unlock (const ast::MutexUnlock &node) override
 visit node of type ast::MutexUnlock More...
 
void visit_conserve (const ast::Conserve &node) override
 visit node of type ast::Conserve More...
 
void visit_compartment (const ast::Compartment &node) override
 visit node of type ast::Compartment More...
 
void visit_lon_diffuse (const ast::LonDiffuse &node) override
 visit node of type ast::LonDiffuse More...
 
void visit_reaction_statement (const ast::ReactionStatement &node) override
 visit node of type ast::ReactionStatement More...
 
void visit_lag_statement (const ast::LagStatement &node) override
 visit node of type ast::LagStatement More...
 
void visit_constant_statement (const ast::ConstantStatement &node) override
 visit node of type ast::ConstantStatement More...
 
void visit_table_statement (const ast::TableStatement &node) override
 visit node of type ast::TableStatement More...
 
void visit_suffix (const ast::Suffix &node) override
 visit node of type ast::Suffix More...
 
void visit_useion (const ast::Useion &node) override
 visit node of type ast::Useion More...
 
void visit_nonspecific (const ast::Nonspecific &node) override
 visit node of type ast::Nonspecific More...
 
void visit_electrode_current (const ast::ElectrodeCurrent &node) override
 visit node of type ast::ElectrodeCurrent More...
 
void visit_range (const ast::Range &node) override
 visit node of type ast::Range More...
 
void visit_global (const ast::Global &node) override
 visit node of type ast::Global More...
 
void visit_random_var_list (const ast::RandomVarList &node) override
 visit node of type ast::RandomVarList More...
 
void visit_pointer (const ast::Pointer &node) override
 visit node of type ast::Pointer More...
 
void visit_bbcore_pointer (const ast::BbcorePointer &node) override
 visit node of type ast::BbcorePointer More...
 
void visit_external (const ast::External &node) override
 visit node of type ast::External More...
 
void visit_thread_safe (const ast::ThreadSafe &node) override
 visit node of type ast::ThreadSafe More...
 
void visit_verbatim (const ast::Verbatim &node) override
 visit node of type ast::Verbatim More...
 
void visit_line_comment (const ast::LineComment &node) override
 visit node of type ast::LineComment More...
 
void visit_block_comment (const ast::BlockComment &node) override
 visit node of type ast::BlockComment More...
 
void visit_ontology_statement (const ast::OntologyStatement &node) override
 visit node of type ast::OntologyStatement More...
 
void visit_program (const ast::Program &node) override
 visit node of type ast::Program More...
 
void visit_nrn_state_block (const ast::NrnStateBlock &node) override
 visit node of type ast::NrnStateBlock More...
 
void visit_eigen_newton_solver_block (const ast::EigenNewtonSolverBlock &node) override
 visit node of type ast::EigenNewtonSolverBlock More...
 
void visit_eigen_linear_solver_block (const ast::EigenLinearSolverBlock &node) override
 visit node of type ast::EigenLinearSolverBlock More...
 
void visit_cvode_block (const ast::CvodeBlock &node) override
 visit node of type ast::CvodeBlock More...
 
void visit_longitudinal_diffusion_block (const ast::LongitudinalDiffusionBlock &node) override
 visit node of type ast::LongitudinalDiffusionBlock More...
 
void visit_wrapped_expression (const ast::WrappedExpression &node) override
 visit node of type ast::WrappedExpression More...
 
void visit_derivimplicit_callback (const ast::DerivimplicitCallback &node) override
 visit node of type ast::DerivimplicitCallback More...
 
void visit_solution_expression (const ast::SolutionExpression &node) override
 visit node of type ast::SolutionExpression More...
 
void visit_update_dt (const ast::UpdateDt &node) override
 visit node of type ast::UpdateDt More...
 
- Public Member Functions inherited from nmodl::visitor::ConstVisitor
virtual ~ConstVisitor ()=default
 

Private Member Functions

void visit_program (const ast::Program &node) override
 Check number of DERIVATIVE blocks. More...
 
void visit_procedure_block (const ast::ProcedureBlock &node) override
 Store if we are in a procedure and if the arity of this is 1. More...
 
void visit_function_block (const ast::FunctionBlock &node) override
 Store if we are in a function and if the arity of this is 1. More...
 
void visit_table_statement (const ast::TableStatement &node) override
 Visit a table statement and check that the arity of the block were 1. More...
 
void visit_destructor_block (const ast::DestructorBlock &node) override
 Visit destructor and check that the file is of type POINT_PROCESS or ARTIFICIAL_CELL. More...
 
void visit_independent_block (const ast::IndependentBlock &node) override
 Visit independent block and check if one of the variable is not t. More...
 
void visit_function_table_block (const ast::FunctionTableBlock &node) override
 Visit function table to check that number of args > 0. More...
 
void visit_protect_statement (const ast::ProtectStatement &node) override
 Look if protect is inside a locked block. More...
 
void visit_mutex_lock (const ast::MutexLock &node) override
 Look if MUTEXLOCK is inside a locked block. More...
 
void visit_mutex_unlock (const ast::MutexUnlock &node) override
 Look if MUTEXUNLOCK is outside a locked block. More...
 
void visit_name (const ast::Name &node) override
 Only use of random_var is as first arg in random function. More...
 
void visit_function_call (const ast::FunctionCall &node) override
 random function first arg must be random_var More...
 
bool check_name_conflict (const ast::Program &node)
 
bool check_table_vars (const ast::Program &node)
 

Private Attributes

bool check_fail = false
 
symtab::SymbolTableprogram_symtab = nullptr
 
bool accel_backend = false
 true if accelerator backend is used for code generation More...
 
bool one_arg_in_procedure_function = false
 true if the procedure or the function contains only one argument More...
 
bool in_procedure = false
 true if we are in a procedure block More...
 
bool in_function = false
 true if we are in a function block More...
 
bool is_point_process = false
 true if the mod file is of type point process More...
 
bool in_mutex = false
 true if we are inside a mutex locked part More...
 

Constructor & Destructor Documentation

◆ SemanticAnalysisVisitor()

nmodl::visitor::SemanticAnalysisVisitor::SemanticAnalysisVisitor ( bool  accel_backend = false)
inline

Definition at line 103 of file semantic_analysis_visitor.hpp.

Member Function Documentation

◆ check()

bool nmodl::visitor::SemanticAnalysisVisitor::check ( const ast::Program node)

<– This code is for check 2

-->

<– This code is for check 4

make sure ion variables aren't redefined in a CONSTANT block.

-->

Definition at line 80 of file semantic_analysis_visitor.cpp.

◆ check_name_conflict()

bool nmodl::visitor::SemanticAnalysisVisitor::check_name_conflict ( const ast::Program node)
private

Definition at line 56 of file semantic_analysis_visitor.cpp.

◆ check_table_vars()

bool nmodl::visitor::SemanticAnalysisVisitor::check_table_vars ( const ast::Program node)
private

Definition at line 29 of file semantic_analysis_visitor.cpp.

◆ visit_destructor_block()

void nmodl::visitor::SemanticAnalysisVisitor::visit_destructor_block ( const ast::DestructorBlock node)
overrideprivatevirtual

Visit destructor and check that the file is of type POINT_PROCESS or ARTIFICIAL_CELL.

<– This code is for check 2

-->

Implements nmodl::visitor::ConstVisitor.

Definition at line 268 of file semantic_analysis_visitor.cpp.

◆ visit_function_block()

void nmodl::visitor::SemanticAnalysisVisitor::visit_function_block ( const ast::FunctionBlock node)
overrideprivatevirtual

Store if we are in a function and if the arity of this is 1.

<– This code is for check 1

-->

Implements nmodl::visitor::ConstVisitor.

Definition at line 141 of file semantic_analysis_visitor.cpp.

◆ visit_function_call()

void nmodl::visitor::SemanticAnalysisVisitor::visit_function_call ( const ast::FunctionCall node)
overrideprivatevirtual

random function first arg must be random_var

<– This code is a portion of check 9

-->

Implements nmodl::visitor::ConstVisitor.

Definition at line 205 of file semantic_analysis_visitor.cpp.

◆ visit_function_table_block()

void nmodl::visitor::SemanticAnalysisVisitor::visit_function_table_block ( const ast::FunctionTableBlock node)
overrideprivatevirtual

Visit function table to check that number of args > 0.

<– This code is for check 7

-->

Implements nmodl::visitor::ConstVisitor.

Definition at line 292 of file semantic_analysis_visitor.cpp.

◆ visit_independent_block()

void nmodl::visitor::SemanticAnalysisVisitor::visit_independent_block ( const ast::IndependentBlock node)
overrideprivatevirtual

Visit independent block and check if one of the variable is not t.

<– This code is for check 5

-->

Implements nmodl::visitor::ConstVisitor.

Definition at line 279 of file semantic_analysis_visitor.cpp.

◆ visit_mutex_lock()

void nmodl::visitor::SemanticAnalysisVisitor::visit_mutex_lock ( const ast::MutexLock node)
overrideprivatevirtual

Look if MUTEXLOCK is inside a locked block.

<– This code is for check 6

-->

Implements nmodl::visitor::ConstVisitor.

Definition at line 314 of file semantic_analysis_visitor.cpp.

◆ visit_mutex_unlock()

void nmodl::visitor::SemanticAnalysisVisitor::visit_mutex_unlock ( const ast::MutexUnlock node)
overrideprivatevirtual

Look if MUTEXUNLOCK is outside a locked block.

<– This code is for check 6

-->

Implements nmodl::visitor::ConstVisitor.

Definition at line 326 of file semantic_analysis_visitor.cpp.

◆ visit_name()

void nmodl::visitor::SemanticAnalysisVisitor::visit_name ( const ast::Name node)
overrideprivatevirtual

Only use of random_var is as first arg in random function.

<– This code is a portion of check 9

-->

Implements nmodl::visitor::ConstVisitor.

Definition at line 150 of file semantic_analysis_visitor.cpp.

◆ visit_procedure_block()

void nmodl::visitor::SemanticAnalysisVisitor::visit_procedure_block ( const ast::ProcedureBlock node)
overrideprivatevirtual

Store if we are in a procedure and if the arity of this is 1.

<– This code is for check 1

-->

Implements nmodl::visitor::ConstVisitor.

Definition at line 132 of file semantic_analysis_visitor.cpp.

◆ visit_program()

void nmodl::visitor::SemanticAnalysisVisitor::visit_program ( const ast::Program node)
overrideprivatevirtual

Check number of DERIVATIVE blocks.

<– This code is for check 8

-->

Implements nmodl::visitor::ConstVisitor.

Definition at line 121 of file semantic_analysis_visitor.cpp.

◆ visit_protect_statement()

void nmodl::visitor::SemanticAnalysisVisitor::visit_protect_statement ( const ast::ProtectStatement node)
overrideprivatevirtual

Look if protect is inside a locked block.

<– This code is for check 6

-->

Implements nmodl::visitor::ConstVisitor.

Definition at line 303 of file semantic_analysis_visitor.cpp.

◆ visit_table_statement()

void nmodl::visitor::SemanticAnalysisVisitor::visit_table_statement ( const ast::TableStatement node)
overrideprivatevirtual

Visit a table statement and check that the arity of the block were 1.

<– This code is for check 1

--> <– This code is for check 3

-->

Implements nmodl::visitor::ConstVisitor.

Definition at line 245 of file semantic_analysis_visitor.cpp.

Member Data Documentation

◆ accel_backend

bool nmodl::visitor::SemanticAnalysisVisitor::accel_backend = false
private

true if accelerator backend is used for code generation

Definition at line 51 of file semantic_analysis_visitor.hpp.

◆ check_fail

bool nmodl::visitor::SemanticAnalysisVisitor::check_fail = false
private

Definition at line 47 of file semantic_analysis_visitor.hpp.

◆ in_function

bool nmodl::visitor::SemanticAnalysisVisitor::in_function = false
private

true if we are in a function block

Definition at line 57 of file semantic_analysis_visitor.hpp.

◆ in_mutex

bool nmodl::visitor::SemanticAnalysisVisitor::in_mutex = false
private

true if we are inside a mutex locked part

Definition at line 61 of file semantic_analysis_visitor.hpp.

◆ in_procedure

bool nmodl::visitor::SemanticAnalysisVisitor::in_procedure = false
private

true if we are in a procedure block

Definition at line 55 of file semantic_analysis_visitor.hpp.

◆ is_point_process

bool nmodl::visitor::SemanticAnalysisVisitor::is_point_process = false
private

true if the mod file is of type point process

Definition at line 59 of file semantic_analysis_visitor.hpp.

◆ one_arg_in_procedure_function

bool nmodl::visitor::SemanticAnalysisVisitor::one_arg_in_procedure_function = false
private

true if the procedure or the function contains only one argument

Definition at line 53 of file semantic_analysis_visitor.hpp.

◆ program_symtab

symtab::SymbolTable* nmodl::visitor::SemanticAnalysisVisitor::program_symtab = nullptr
private

Definition at line 49 of file semantic_analysis_visitor.hpp.


The documentation for this class was generated from the following files: