aboutsummaryrefslogtreecommitdiff
path: root/src/MoonP/ast.cpp
diff options
context:
space:
mode:
authorLi Jin <dragon-fly@qq.com>2020-02-18 00:43:07 +0800
committerLi Jin <dragon-fly@qq.com>2020-02-18 00:43:07 +0800
commitadfea5f0eee289fe729c2bcc68105417d77a8407 (patch)
tree9ec34e380c7157f0ed14a80ef4e2ab30876942fd /src/MoonP/ast.cpp
parent27e0f69843f412f25703c2c9165dbc1a0c6d6218 (diff)
downloadyuescript-adfea5f0eee289fe729c2bcc68105417d77a8407.tar.gz
yuescript-adfea5f0eee289fe729c2bcc68105417d77a8407.tar.bz2
yuescript-adfea5f0eee289fe729c2bcc68105417d77a8407.zip
remove the extra type id system.
Diffstat (limited to 'src/MoonP/ast.cpp')
-rw-r--r--src/MoonP/ast.cpp48
1 files changed, 31 insertions, 17 deletions
diff --git a/src/MoonP/ast.cpp b/src/MoonP/ast.cpp
index 71c90c5..4929021 100644
--- a/src/MoonP/ast.cpp
+++ b/src/MoonP/ast.cpp
@@ -10,12 +10,12 @@ Redistributions in binary form must reproduce the above copyright notice, this l
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.*/ 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 11
12#include <cassert> 12#include <cassert>
13
13#include "MoonP/ast.hpp" 14#include "MoonP/ast.hpp"
14 15
15 16
16namespace parserlib { 17namespace parserlib {
17 18
18int ast_type_id = 0;
19 19
20traversal ast_node::traverse(const std::function<traversal (ast_node*)>& func) { 20traversal ast_node::traverse(const std::function<traversal (ast_node*)>& func) {
21 return func(this); 21 return func(this);
@@ -26,9 +26,9 @@ ast_node* ast_node::getByTypeIds(int* begin, int* end) {
26 auto it = begin; 26 auto it = begin;
27 while (it != end) { 27 while (it != end) {
28 ast_node* findNode = nullptr; 28 ast_node* findNode = nullptr;
29 int type = *it; 29 int i = *it;
30 current->visitChild([&](ast_node* node) { 30 current->visitChild([&](ast_node* node) {
31 if (node->get_type() == type) { 31 if (node->getId() == i) {
32 findNode = node; 32 findNode = node;
33 return true; 33 return true;
34 } 34 }
@@ -74,15 +74,22 @@ traversal ast_container::traverse(const std::function<traversal (ast_node*)>& fu
74 } 74 }
75 const auto& members = this->members(); 75 const auto& members = this->members();
76 for (auto member : members) { 76 for (auto member : members) {
77 if (_ast_ptr* ptr = ast_cast<_ast_ptr>(member)) { 77 switch (member->get_type()) {
78 if (ptr->get() && ptr->get()->traverse(func) == traversal::Stop) { 78 case ast_holder_type::Pointer: {
79 return traversal::Stop; 79 _ast_ptr* ptr = static_cast<_ast_ptr*>(member);
80 } 80 if (ptr->get() && ptr->get()->traverse(func) == traversal::Stop) {
81 } else if (_ast_list* list = ast_cast<_ast_list>(member)) {
82 for (auto obj : list->objects()) {
83 if (obj->traverse(func) == traversal::Stop) {
84 return traversal::Stop; 81 return traversal::Stop;
85 } 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;
86 } 93 }
87 } 94 }
88 } 95 }
@@ -92,15 +99,22 @@ traversal ast_container::traverse(const std::function<traversal (ast_node*)>& fu
92bool ast_container::visitChild(const std::function<bool (ast_node*)>& func) { 99bool ast_container::visitChild(const std::function<bool (ast_node*)>& func) {
93 const auto& members = this->members(); 100 const auto& members = this->members();
94 for (auto member : members) { 101 for (auto member : members) {
95 if (_ast_ptr* ptr = ast_cast<_ast_ptr>(member)) { 102 switch (member->get_type()) {
96 if (ptr->get()) { 103 case ast_holder_type::Pointer: {
97 if (func(ptr->get())) return true; 104 _ast_ptr* ptr = static_cast<_ast_ptr*>(member);
105 if (ptr->get()) {
106 if (func(ptr->get())) return true;
107 }
108 break;
98 } 109 }
99 } else if (_ast_list* list = ast_cast<_ast_list>(member)) { 110 case ast_holder_type::List: {
100 for (auto obj : list->objects()) { 111 _ast_list* list = static_cast<_ast_list*>(member);
101 if (obj) { 112 for (auto obj : list->objects()) {
102 if (func(obj)) return true; 113 if (obj) {
114 if (func(obj)) return true;
115 }
103 } 116 }
117 break;
104 } 118 }
105 } 119 }
106 } 120 }