User Guide
verbatim_var_rename_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 #pragma once
9 
10 /**
11  * \file
12  * \brief \copybrief nmodl::visitor::VerbatimVarRenameVisitor
13  */
14 
15 #include <stack>
16 #include <string>
17 
18 #include "symtab/symbol_table.hpp"
19 #include "visitors/ast_visitor.hpp"
20 
21 namespace nmodl {
22 namespace visitor {
23 
24 /**
25  * @addtogroup visitor_classes
26  * @{
27  */
28 
29 /**
30  * \class VerbatimVarRenameVisitor
31  * \brief Rename variable in verbatim block
32  *
33  * Verbatim blocks in NMODL use different names for local
34  * and range variables:
35  * - if local variable is `xx` then translated name of variable
36  * in C file is `_lxx`
37  * - if range (or any other global) variable is `xx` then translated
38  * name of the variable is `_p_xx`
39  *
40  * This naming convention is based on NEURON code generation convention.
41  * As part of this pass, we revert such usages of the variable to original
42  * names. We do this only if variable is present in symbol table.
43  *
44  * \todo Check if symbol table lookup is ok or there are cases where this
45  * could be error prone.
46  */
48  private:
49  /// non-null symbol table in the scope hierarchy
51 
52  /// symbol tables in nested blocks
53  std::stack<symtab::SymbolTable*> symtab_stack;
54 
55  /// prefix used for local variable
56  const std::string LOCAL_PREFIX = "_l";
57 
58  /// prefix used for range variables
59  const std::string RANGE_PREFIX = "_p_";
60 
61  /// prefix used for range variables
62  const std::string ION_PREFIX = "_ion_";
63 
64  std::string rename_variable(const std::string& name);
65 
66  public:
67  VerbatimVarRenameVisitor() = default;
68 
69  void visit_verbatim(ast::Verbatim& node) override;
70  void visit_statement_block(ast::StatementBlock& node) override;
71 };
72 
73 /** @} */ // end of visitor_classes
74 
75 } // namespace visitor
76 } // namespace nmodl
nmodl::visitor::VerbatimVarRenameVisitor::ION_PREFIX
const std::string ION_PREFIX
prefix used for range variables
Definition: verbatim_var_rename_visitor.hpp:62
nmodl::ast::Verbatim
Represents a C code block.
Definition: verbatim.hpp:38
nmodl::visitor::VerbatimVarRenameVisitor::visit_verbatim
void visit_verbatim(ast::Verbatim &node) override
Parse verbatim blocks and rename variables used.
Definition: verbatim_var_rename_visitor.cpp:81
nmodl::visitor::VerbatimVarRenameVisitor::symtab
symtab::SymbolTable * symtab
non-null symbol table in the scope hierarchy
Definition: verbatim_var_rename_visitor.hpp:50
nmodl::visitor::VerbatimVarRenameVisitor::rename_variable
std::string rename_variable(const std::string &name)
Rename variable used in verbatim block if defined in NMODL scope.
Definition: verbatim_var_rename_visitor.cpp:52
nmodl
encapsulates code generation backend implementations
Definition: ast_common.hpp:26
symbol_table.hpp
Implement classes for representing symbol table at block and file scope.
nmodl::visitor::VerbatimVarRenameVisitor
Rename variable in verbatim block.
Definition: verbatim_var_rename_visitor.hpp:47
nmodl::visitor::VerbatimVarRenameVisitor::VerbatimVarRenameVisitor
VerbatimVarRenameVisitor()=default
nmodl::visitor::AstVisitor
Concrete visitor for all AST classes.
Definition: ast_visitor.hpp:37
nmodl::symtab::SymbolTable
Represent symbol table for a NMODL block.
Definition: symbol_table.hpp:57
nmodl::ast::StatementBlock
Represents block encapsulating list of statements.
Definition: statement_block.hpp:53
nmodl::visitor::VerbatimVarRenameVisitor::visit_statement_block
void visit_statement_block(ast::StatementBlock &node) override
visit node of type ast::StatementBlock
Definition: verbatim_var_rename_visitor.cpp:20
nmodl::visitor::VerbatimVarRenameVisitor::symtab_stack
std::stack< symtab::SymbolTable * > symtab_stack
symbol tables in nested blocks
Definition: verbatim_var_rename_visitor.hpp:53
nmodl::visitor::VerbatimVarRenameVisitor::RANGE_PREFIX
const std::string RANGE_PREFIX
prefix used for range variables
Definition: verbatim_var_rename_visitor.hpp:59
nmodl::visitor::VerbatimVarRenameVisitor::LOCAL_PREFIX
const std::string LOCAL_PREFIX
prefix used for local variable
Definition: verbatim_var_rename_visitor.hpp:56
ast_visitor.hpp
Concrete visitor for all AST classes.