User Guide
index_remover.cpp
Go to the documentation of this file.
1 #include "index_remover.hpp"
2 
3 #include "utils/logger.hpp"
5 
6 namespace nmodl {
7 namespace visitor {
8 
9 IndexRemover::IndexRemover(std::string index, int value)
10  : index(std::move(index))
11  , value(value) {}
12 
13 /// if expression we are visiting is `Name` then return new `Integer` node
14 std::shared_ptr<ast::Expression> IndexRemover::replace_for_name(
15  const std::shared_ptr<ast::Expression>& node) const {
16  if (node->is_name()) {
17  auto name = std::dynamic_pointer_cast<ast::Name>(node);
18  if (name->get_node_name() == index) {
19  return std::make_shared<ast::Integer>(value, nullptr);
20  }
21  }
22  return node;
23 }
24 
26  node.visit_children(*this);
27  if (under_indexed_name) {
28  /// first recursively replaces children
29  /// replace lhs & rhs if they have matching index variable
30  auto lhs = replace_for_name(node.get_lhs());
31  auto rhs = replace_for_name(node.get_rhs());
32  node.set_lhs(std::move(lhs));
33  node.set_rhs(std::move(rhs));
34  }
35 }
36 
38  under_indexed_name = true;
39  node.visit_children(*this);
40  /// once all children are replaced, do the same for index
41  auto length = replace_for_name(node.get_length());
42  node.set_length(std::move(length));
43  under_indexed_name = false;
44 }
45 
46 } // namespace visitor
47 } // namespace nmodl
nmodl::ast::IndexedName::get_length
std::shared_ptr< Expression > get_length() const noexcept
Getter for member variable IndexedName::length.
Definition: indexed_name.hpp:176
nmodl::visitor::IndexRemover::index
std::string index
index variable name
Definition: index_remover.hpp:31
nmodl::visitor::IndexRemover::under_indexed_name
bool under_indexed_name
true if we are visiting index variable
Definition: index_remover.hpp:37
nmodl
encapsulates code generation backend implementations
Definition: ast_common.hpp:26
nmodl::ast::BinaryExpression::get_rhs
std::shared_ptr< Expression > get_rhs() const noexcept
Getter for member variable BinaryExpression::rhs.
Definition: binary_expression.hpp:179
visitor_utils.hpp
Utility functions for visitors implementation.
nmodl::ast::BinaryExpression::set_rhs
void set_rhs(std::shared_ptr< Expression > &&rhs)
Setter for member variable BinaryExpression::rhs (rvalue reference)
Definition: ast.cpp:6616
nmodl::ast::IndexedName
Represents specific element of an array variable.
Definition: indexed_name.hpp:48
nmodl::ast::BinaryExpression::set_lhs
void set_lhs(std::shared_ptr< Expression > &&lhs)
Setter for member variable BinaryExpression::lhs (rvalue reference)
Definition: ast.cpp:6590
nmodl::visitor::IndexRemover::visit_binary_expression
void visit_binary_expression(ast::BinaryExpression &node) override
visit node of type ast::BinaryExpression
Definition: index_remover.cpp:25
nmodl::ast::IndexedName::visit_children
void visit_children(visitor::Visitor &v) override
visit children i.e.
Definition: ast.cpp:1011
index_remover.hpp
nmodl::visitor::IndexRemover::value
int value
integer value of index variable
Definition: index_remover.hpp:34
nmodl::ast::BinaryExpression::visit_children
void visit_children(visitor::Visitor &v) override
visit children i.e.
Definition: ast.cpp:6509
logger.hpp
Implement logger based on spdlog library.
nmodl::visitor::IndexRemover::visit_indexed_name
void visit_indexed_name(ast::IndexedName &node) override
visit node of type ast::IndexedName
Definition: index_remover.cpp:37
nmodl::visitor::IndexRemover::replace_for_name
std::shared_ptr< ast::Expression > replace_for_name(const std::shared_ptr< ast::Expression > &node) const
if expression we are visiting is Name then return new Integer node
Definition: index_remover.cpp:14
nmodl::ast::BinaryExpression::get_lhs
std::shared_ptr< Expression > get_lhs() const noexcept
Getter for member variable BinaryExpression::lhs.
Definition: binary_expression.hpp:161
nmodl::ast::BinaryExpression
Represents binary expression in the NMODL.
Definition: binary_expression.hpp:52
nmodl::ast::IndexedName::set_length
void set_length(std::shared_ptr< Expression > &&length)
Setter for member variable IndexedName::length (rvalue reference)
Definition: ast.cpp:1100
nmodl::visitor::IndexRemover::IndexRemover
IndexRemover(std::string index, int value)
Definition: index_remover.cpp:9