aboutsummaryrefslogtreecommitdiff
path: root/MoonParser/ast.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'MoonParser/ast.cpp')
-rw-r--r--MoonParser/ast.cpp122
1 files changed, 0 insertions, 122 deletions
diff --git a/MoonParser/ast.cpp b/MoonParser/ast.cpp
deleted file mode 100644
index 6c86854..0000000
--- a/MoonParser/ast.cpp
+++ /dev/null
@@ -1,122 +0,0 @@
1#include <cassert>
2#include "ast.hpp"
3
4
5namespace parserlib {
6
7int ast_type_id = 0;
8
9traversal ast_node::traverse(const std::function<traversal (ast_node*)>& func) {
10 return func(this);
11}
12
13ast_node* ast_node::getByTypeIds(int* begin, int* end) {
14 ast_node* current = this;
15 auto it = begin;
16 while (it != end) {
17 ast_node* findNode = nullptr;
18 int type = *it;
19 current->visitChild([&](ast_node* node) {
20 if (node->get_type() == type) {
21 findNode = node;
22 return true;
23 }
24 return false;
25 });
26 if (findNode) {
27 current = findNode;
28 } else {
29 current = nullptr;
30 break;
31 }
32 ++it;
33 }
34 return current;
35}
36
37bool ast_node::visitChild(const std::function<bool (ast_node*)>&) {
38 return false;
39}
40
41
42/** Asks all members to construct themselves from the stack.
43 The members are asked to construct themselves in reverse order.
44 from a node stack.
45 @param st stack.
46 */
47void ast_container::construct(ast_stack &st) {
48 for(ast_member_vector::reverse_iterator it = m_members.rbegin();
49 it != m_members.rend();
50 ++it)
51 {
52 ast_member* member = *it;
53 member->construct(st);
54 }
55}
56
57traversal ast_container::traverse(const std::function<traversal (ast_node*)>& func) {
58 traversal action = func(this);
59 switch (action) {
60 case traversal::Stop: return traversal::Stop;
61 case traversal::Return: return traversal::Continue;
62 default: break;
63 }
64 const auto& members = this->members();
65 for (auto member : members) {
66 if (_ast_ptr* ptr = ast_cast<_ast_ptr>(member)) {
67 if (ptr->get() && ptr->get()->traverse(func) == traversal::Stop) {
68 return traversal::Stop;
69 }
70 } else if (_ast_list* list = ast_cast<_ast_list>(member)) {
71 for (auto obj : list->objects()) {
72 if (obj->traverse(func) == traversal::Stop) {
73 return traversal::Stop;
74 }
75 }
76 }
77 }
78 return traversal::Continue;
79}
80
81bool ast_container::visitChild(const std::function<bool (ast_node*)>& func) {
82 const auto& members = this->members();
83 for (auto member : members) {
84 if (_ast_ptr* ptr = ast_cast<_ast_ptr>(member)) {
85 if (ptr->get()) {
86 if (func(ptr->get())) return true;
87 }
88 } else if (_ast_list* list = ast_cast<_ast_list>(member)) {
89 for (auto obj : list->objects()) {
90 if (obj) {
91 if (func(obj)) return true;
92 }
93 }
94 }
95 }
96 return false;
97}
98
99
100/** parses the given input.
101 @param i input.
102 @param g root rule of grammar.
103 @param el list of errors.
104 @param ud user data, passed to the parse procedures.
105 @return pointer to ast node created, or null if there was an error.
106 The return object must be deleted by the caller.
107 */
108ast_node* _parse(input &i, rule &g, error_list &el, void* ud) {
109 ast_stack st;
110 if (!parse(i, g, el, &st, ud)) {
111 for (auto node : st) {
112 delete node;
113 }
114 st.clear();
115 return nullptr;
116 }
117 assert(st.size() == 1);
118 return st.front();
119}
120
121
122} //namespace parserlib