diff options
| author | Li Jin <dragon-fly@qq.com> | 2019-10-29 11:25:27 +0800 |
|---|---|---|
| committer | Li Jin <dragon-fly@qq.com> | 2019-10-29 11:25:27 +0800 |
| commit | 975167856ed0b11c2ede03c6eb750ca4e4a6a7fc (patch) | |
| tree | fa4369fe7e7d49c63cae93d6c5b52b78116f58cd /MoonParser/ast.cpp | |
| parent | 726fee3152c81fdac7e3ad5f663bfbea8f99ddd8 (diff) | |
| download | yuescript-975167856ed0b11c2ede03c6eb750ca4e4a6a7fc.tar.gz yuescript-975167856ed0b11c2ede03c6eb750ca4e4a6a7fc.tar.bz2 yuescript-975167856ed0b11c2ede03c6eb750ca4e4a6a7fc.zip | |
complete moon compiler in C++.
Diffstat (limited to 'MoonParser/ast.cpp')
| -rw-r--r-- | MoonParser/ast.cpp | 85 |
1 files changed, 8 insertions, 77 deletions
diff --git a/MoonParser/ast.cpp b/MoonParser/ast.cpp index 7f46bd0..6c86854 100644 --- a/MoonParser/ast.cpp +++ b/MoonParser/ast.cpp | |||
| @@ -4,10 +4,6 @@ | |||
| 4 | 4 | ||
| 5 | namespace parserlib { | 5 | namespace parserlib { |
| 6 | 6 | ||
| 7 | |||
| 8 | //current AST container. | ||
| 9 | static ast_container* _current = 0; | ||
| 10 | |||
| 11 | int ast_type_id = 0; | 7 | int ast_type_id = 0; |
| 12 | 8 | ||
| 13 | traversal ast_node::traverse(const std::function<traversal (ast_node*)>& func) { | 9 | traversal ast_node::traverse(const std::function<traversal (ast_node*)>& func) { |
| @@ -42,12 +38,6 @@ bool ast_node::visitChild(const std::function<bool (ast_node*)>&) { | |||
| 42 | return false; | 38 | return false; |
| 43 | } | 39 | } |
| 44 | 40 | ||
| 45 | /** sets the container under construction to be this. | ||
| 46 | */ | ||
| 47 | ast_container::ast_container() { | ||
| 48 | _current = this; | ||
| 49 | } | ||
| 50 | |||
| 51 | 41 | ||
| 52 | /** Asks all members to construct themselves from the stack. | 42 | /** Asks all members to construct themselves from the stack. |
| 53 | The members are asked to construct themselves in reverse order. | 43 | The members are asked to construct themselves in reverse order. |
| @@ -106,71 +96,6 @@ bool ast_container::visitChild(const std::function<bool (ast_node*)>& func) { | |||
| 106 | return false; | 96 | return false; |
| 107 | } | 97 | } |
| 108 | 98 | ||
| 109 | ast_node* ast_container::getChild(int index) const { | ||
| 110 | int i = 0; | ||
| 111 | const auto& members = this->members(); | ||
| 112 | for (auto member : members) { | ||
| 113 | if (_ast_ptr* ptr = ast_cast<_ast_ptr>(member)) { | ||
| 114 | if (i == index) return ptr->get(); | ||
| 115 | } else if (_ast_list* list = ast_cast<_ast_list>(member)) { | ||
| 116 | for (auto obj : list->objects()) { | ||
| 117 | if (i == index) return obj; | ||
| 118 | } | ||
| 119 | } | ||
| 120 | i++; | ||
| 121 | } | ||
| 122 | return nullptr; | ||
| 123 | } | ||
| 124 | |||
| 125 | ast_node* ast_container::getFirstChild() const { | ||
| 126 | const auto& members = this->members(); | ||
| 127 | if (!members.empty()) { | ||
| 128 | auto member = members.front(); | ||
| 129 | if (_ast_ptr* ptr = ast_cast<_ast_ptr>(member)) { | ||
| 130 | return ptr->get(); | ||
| 131 | } else if (_ast_list* list = ast_cast<_ast_list>(member)) { | ||
| 132 | if (!list->objects().empty()) { | ||
| 133 | return list->objects().front(); | ||
| 134 | } | ||
| 135 | } | ||
| 136 | } | ||
| 137 | return nullptr; | ||
| 138 | } | ||
| 139 | |||
| 140 | ast_node* ast_container::getLastChild() const { | ||
| 141 | const auto& members = this->members(); | ||
| 142 | if (!members.empty()) { | ||
| 143 | auto member = members.back(); | ||
| 144 | if (_ast_ptr* ptr = ast_cast<_ast_ptr>(member)) { | ||
| 145 | return ptr->get(); | ||
| 146 | } else if (_ast_list* list = ast_cast<_ast_list>(member)) { | ||
| 147 | if (!list->objects().empty()) { | ||
| 148 | return list->objects().front(); | ||
| 149 | } | ||
| 150 | } | ||
| 151 | } | ||
| 152 | return nullptr; | ||
| 153 | } | ||
| 154 | |||
| 155 | size_t ast_container::getChildCount() const { | ||
| 156 | size_t count = 0; | ||
| 157 | const auto& members = this->members(); | ||
| 158 | for (auto member : members) { | ||
| 159 | if (_ast_ptr* ptr = ast_cast<_ast_ptr>(member)) { | ||
| 160 | count += 1; | ||
| 161 | } else if (_ast_list* list = ast_cast<_ast_list>(member)) { | ||
| 162 | count += list->objects().size(); | ||
| 163 | } | ||
| 164 | } | ||
| 165 | return count; | ||
| 166 | } | ||
| 167 | |||
| 168 | //register the AST member to the current container. | ||
| 169 | void ast_member::add_to_owner() { | ||
| 170 | assert(_current); | ||
| 171 | _current->m_members.push_back(this); | ||
| 172 | } | ||
| 173 | |||
| 174 | 99 | ||
| 175 | /** parses the given input. | 100 | /** parses the given input. |
| 176 | @param i input. | 101 | @param i input. |
| @@ -182,9 +107,15 @@ void ast_member::add_to_owner() { | |||
| 182 | */ | 107 | */ |
| 183 | ast_node* _parse(input &i, rule &g, error_list &el, void* ud) { | 108 | ast_node* _parse(input &i, rule &g, error_list &el, void* ud) { |
| 184 | ast_stack st; | 109 | ast_stack st; |
| 185 | if (!parse(i, g, el, &st, ud)) return 0; | 110 | if (!parse(i, g, el, &st, ud)) { |
| 111 | for (auto node : st) { | ||
| 112 | delete node; | ||
| 113 | } | ||
| 114 | st.clear(); | ||
| 115 | return nullptr; | ||
| 116 | } | ||
| 186 | assert(st.size() == 1); | 117 | assert(st.size() == 1); |
| 187 | return st[0]; | 118 | return st.front(); |
| 188 | } | 119 | } |
| 189 | 120 | ||
| 190 | 121 | ||
