ROSE  0.9.10.95
RoseAst.h
1 
2 #ifndef ROSE_AST_H
3 #define ROSE_AST_H
4 
5 /*************************************************************
6  * Copyright: (C) 2012 Markus Schordan *
7  * Author : Markus Schordan *
8  * License : see file LICENSE in the CodeThorn distribution *
9  *************************************************************/
10 
11 #include <stack>
12 #include "roseInternal.h"
13 
28 class RoseAst {
29  public:
30  typedef SgNode elementType;
31  typedef elementType* pointer;
32  typedef elementType& reference;
33  typedef size_t size_type;
34 
35  // no default constructor
36 
41  RoseAst(SgNode* astNode);
42 
56  class iterator {
57  public:
58 
62  iterator();
63 
65  iterator(SgNode* x);
66 
76  bool operator==(const iterator& x) const;
77 
81  bool operator!=(const iterator& x) const;
82 
88  SgNode* operator*() const;
89 
97  iterator& operator++(); // prefix
98  iterator operator++(int); // postfix
107  void skipChildrenOnForward();
108 
131  SgNode* parent() const;
132 
136  bool is_at_root() const;
137 
142  bool is_at_first_child() const;
143 
148  bool is_at_last_child() const;
149 
150  // internal
151  bool is_past_the_end() const;
152  // internal
153  std::string current_node_id() const;
154  // internal
155  std::string parent_node_id() const;
156  // internal
157  void print_top_element() const;
158 
160  int stack_size() const;
161 
162  protected:
163  SgNode* _startNode;
164  bool _skipChildrenOnForward;
165  bool _withNullValues;
166 
167  private:
168  static const int ROOT_NODE_INDEX=-2;
169  friend class RoseAst;
170  typedef struct {SgNode* node; int index;} stack_element;
171  std::stack<stack_element> _stack;
172  SgNode* access_node_by_parent_and_index(SgNode* p, int index) const;
173 
174  // not necessary with a children iterator
175  int num_children(SgNode* p) const;
176  };
177 
182  iterator begin();
183 
187  iterator end();
188 
189  // ast access function
190  SgFunctionDefinition* findFunctionByName(std::string name);
191 
192  // determines based on VariantT whether a ROSE-AST node is a subtype of another node type.
193  static bool isSubType(VariantT DerivedClassVariant, VariantT BaseClassVariant);
194 
195  protected:
196  static SgNode* parent(SgNode* astNode);
197  private:
198  SgNode* _startNode;
199 };
200 
201 #endif
SgNode * parent() const
Parent AST node relative to the iteration.
iterator & operator++()
Advance the iterator.
bool operator!=(const iterator &x) const
Test iterator inequality.
RoseAst(SgNode *astNode)
Defines the starting node for traversal.
This class represents the concept of a scope in C++ (e.g. global scope, fuction scope, etc.).
bool operator==(const iterator &x) const
Test iterator equality.
AST iterator.
Definition: RoseAst.h:56
Interface for iterating over an AST.
Definition: RoseAst.h:28
SgNode * operator*() const
Dereference an iterator.
This class represents the base class for all IR nodes within Sage III.
Definition: Cxx_Grammar.h:8752
bool is_at_last_child() const
Test whether iterator as at the last child of its parent.
iterator end()
Iterator positioned at the end of the traversal.
bool is_at_first_child() const
Test whether iterator is at the first child of its parent.
bool is_at_root() const
Test whether iterator is pointing to root node of AST to be traversed.
iterator begin()
Iterator positioned at root of subtree.
iterator & withoutNullValues()
Mode to enable or disable skipping null child pointers.
iterator & withNullValues()
Mode to enable or disable skipping null child pointers.
iterator()
Default constructor.
void skipChildrenOnForward()
Cause children to be skipped on the next advancement.
int stack_size() const
Depth of traversal.