summaryrefslogtreecommitdiff
path: root/src/MoonP/ast.cpp
diff options
context:
space:
mode:
authorLi Jin <dragon-fly@qq.com>2021-02-17 11:22:07 +0800
committerLi Jin <dragon-fly@qq.com>2021-02-17 11:22:07 +0800
commit7066392d1c974065181d95d93274136dcd625d43 (patch)
treecf51eafc2c52cbc12246a306bca172d799193d30 /src/MoonP/ast.cpp
parent90cd12ad9ef465f3e435e1bd034dcfbe4e19d016 (diff)
downloadyuescript-7066392d1c974065181d95d93274136dcd625d43.tar.gz
yuescript-7066392d1c974065181d95d93274136dcd625d43.tar.bz2
yuescript-7066392d1c974065181d95d93274136dcd625d43.zip
stop reusing variables, rename project.
Diffstat (limited to 'src/MoonP/ast.cpp')
-rw-r--r--src/MoonP/ast.cpp147
1 files changed, 0 insertions, 147 deletions
diff --git a/src/MoonP/ast.cpp b/src/MoonP/ast.cpp
deleted file mode 100644
index 4929021..0000000
--- a/src/MoonP/ast.cpp
+++ /dev/null
@@ -1,147 +0,0 @@
1/* Copyright (c) 2012, Achilleas Margaritis, modified by Jin Li
2All rights reserved.
3
4Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:
5
6Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.
7
8Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution.
9
10THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.*/
11
12#include <cassert>
13
14#include "MoonP/ast.hpp"
15
16
17namespace parserlib {
18
19
20traversal ast_node::traverse(const std::function<traversal (ast_node*)>& func) {
21 return func(this);
22}
23
24ast_node* ast_node::getByTypeIds(int* begin, int* end) {
25 ast_node* current = this;
26 auto it = begin;
27 while (it != end) {
28 ast_node* findNode = nullptr;
29 int i = *it;
30 current->visitChild([&](ast_node* node) {
31 if (node->getId() == i) {
32 findNode = node;
33 return true;
34 }
35 return false;
36 });
37 if (findNode) {
38 current = findNode;
39 } else {
40 current = nullptr;
41 break;
42 }
43 ++it;
44 }
45 return current;
46}
47
48bool ast_node::visitChild(const std::function<bool (ast_node*)>&) {
49 return false;
50}
51
52
53/** Asks all members to construct themselves from the stack.
54 The members are asked to construct themselves in reverse order.
55 from a node stack.
56 @param st stack.
57*/
58void ast_container::construct(ast_stack &st) {
59 for(ast_member_vector::reverse_iterator it = m_members.rbegin();
60 it != m_members.rend();
61 ++it)
62 {
63 ast_member* member = *it;
64 member->construct(st);
65 }
66}
67
68traversal ast_container::traverse(const std::function<traversal (ast_node*)>& func) {
69 traversal action = func(this);
70 switch (action) {
71 case traversal::Stop: return traversal::Stop;
72 case traversal::Return: return traversal::Continue;
73 default: break;
74 }
75 const auto& members = this->members();
76 for (auto member : members) {
77 switch (member->get_type()) {
78 case ast_holder_type::Pointer: {
79 _ast_ptr* ptr = static_cast<_ast_ptr*>(member);
80 if (ptr->get() && ptr->get()->traverse(func) == traversal::Stop) {
81 return traversal::Stop;
82 }
83 break;
84 }
85 case ast_holder_type::List: {
86 _ast_list* list = static_cast<_ast_list*>(member);
87 for (auto obj : list->objects()) {
88 if (obj->traverse(func) == traversal::Stop) {
89 return traversal::Stop;
90 }
91 }
92 break;
93 }
94 }
95 }
96 return traversal::Continue;
97}
98
99bool ast_container::visitChild(const std::function<bool (ast_node*)>& func) {
100 const auto& members = this->members();
101 for (auto member : members) {
102 switch (member->get_type()) {
103 case ast_holder_type::Pointer: {
104 _ast_ptr* ptr = static_cast<_ast_ptr*>(member);
105 if (ptr->get()) {
106 if (func(ptr->get())) return true;
107 }
108 break;
109 }
110 case ast_holder_type::List: {
111 _ast_list* list = static_cast<_ast_list*>(member);
112 for (auto obj : list->objects()) {
113 if (obj) {
114 if (func(obj)) return true;
115 }
116 }
117 break;
118 }
119 }
120 }
121 return false;
122}
123
124
125/** parses the given input.
126 @param i input.
127 @param g root rule of grammar.
128 @param el list of errors.
129 @param ud user data, passed to the parse procedures.
130 @return pointer to ast node created, or null if there was an error.
131 The return object must be deleted by the caller.
132*/
133ast_node* parse(input& i, rule& g, error_list& el, void* ud) {
134 ast_stack st;
135 if (!parse(i, g, el, &st, ud)) {
136 for (auto node : st) {
137 delete node;
138 }
139 st.clear();
140 return nullptr;
141 }
142 assert(st.size() == 1);
143 return st.front();
144}
145
146
147} //namespace parserlib