diff options
-rw-r--r-- | MoonParser.xcodeproj/project.pbxproj | 15 | ||||
-rw-r--r-- | MoonParser/ast.cpp | 127 | ||||
-rw-r--r-- | MoonParser/ast.hpp | 36 | ||||
-rw-r--r-- | MoonParser/moon_ast.cpp | 822 | ||||
-rw-r--r-- | MoonParser/moon_ast.h | 238 | ||||
-rw-r--r-- | MoonParser/moon_parser.h | 2 | ||||
-rw-r--r-- | MoonParser/parser.hpp | 13 |
7 files changed, 1063 insertions, 190 deletions
diff --git a/MoonParser.xcodeproj/project.pbxproj b/MoonParser.xcodeproj/project.pbxproj index 1216f9c..4d48a86 100644 --- a/MoonParser.xcodeproj/project.pbxproj +++ b/MoonParser.xcodeproj/project.pbxproj | |||
@@ -107,7 +107,7 @@ | |||
107 | 3C0F0F641EF3781E000EADDB /* Project object */ = { | 107 | 3C0F0F641EF3781E000EADDB /* Project object */ = { |
108 | isa = PBXProject; | 108 | isa = PBXProject; |
109 | attributes = { | 109 | attributes = { |
110 | LastUpgradeCheck = 0920; | 110 | LastUpgradeCheck = 1030; |
111 | ORGANIZATIONNAME = "Li Jin"; | 111 | ORGANIZATIONNAME = "Li Jin"; |
112 | TargetAttributes = { | 112 | TargetAttributes = { |
113 | 3C0F0F6B1EF3781E000EADDB = { | 113 | 3C0F0F6B1EF3781E000EADDB = { |
@@ -118,10 +118,11 @@ | |||
118 | }; | 118 | }; |
119 | buildConfigurationList = 3C0F0F671EF3781E000EADDB /* Build configuration list for PBXProject "MoonParser" */; | 119 | buildConfigurationList = 3C0F0F671EF3781E000EADDB /* Build configuration list for PBXProject "MoonParser" */; |
120 | compatibilityVersion = "Xcode 3.2"; | 120 | compatibilityVersion = "Xcode 3.2"; |
121 | developmentRegion = English; | 121 | developmentRegion = en; |
122 | hasScannedForEncodings = 0; | 122 | hasScannedForEncodings = 0; |
123 | knownRegions = ( | 123 | knownRegions = ( |
124 | en, | 124 | en, |
125 | Base, | ||
125 | ); | 126 | ); |
126 | mainGroup = 3C0F0F631EF3781E000EADDB; | 127 | mainGroup = 3C0F0F631EF3781E000EADDB; |
127 | productRefGroup = 3C0F0F6D1EF3781E000EADDB /* Products */; | 128 | productRefGroup = 3C0F0F6D1EF3781E000EADDB /* Products */; |
@@ -152,8 +153,9 @@ | |||
152 | isa = XCBuildConfiguration; | 153 | isa = XCBuildConfiguration; |
153 | buildSettings = { | 154 | buildSettings = { |
154 | ALWAYS_SEARCH_USER_PATHS = NO; | 155 | ALWAYS_SEARCH_USER_PATHS = NO; |
156 | CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES; | ||
155 | CLANG_ANALYZER_NONNULL = YES; | 157 | CLANG_ANALYZER_NONNULL = YES; |
156 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; | 158 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++17"; |
157 | CLANG_CXX_LIBRARY = "libc++"; | 159 | CLANG_CXX_LIBRARY = "libc++"; |
158 | CLANG_ENABLE_MODULES = YES; | 160 | CLANG_ENABLE_MODULES = YES; |
159 | CLANG_ENABLE_OBJC_ARC = YES; | 161 | CLANG_ENABLE_OBJC_ARC = YES; |
@@ -161,6 +163,7 @@ | |||
161 | CLANG_WARN_BOOL_CONVERSION = YES; | 163 | CLANG_WARN_BOOL_CONVERSION = YES; |
162 | CLANG_WARN_COMMA = YES; | 164 | CLANG_WARN_COMMA = YES; |
163 | CLANG_WARN_CONSTANT_CONVERSION = YES; | 165 | CLANG_WARN_CONSTANT_CONVERSION = YES; |
166 | CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; | ||
164 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; | 167 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; |
165 | CLANG_WARN_DOCUMENTATION_COMMENTS = YES; | 168 | CLANG_WARN_DOCUMENTATION_COMMENTS = YES; |
166 | CLANG_WARN_EMPTY_BODY = YES; | 169 | CLANG_WARN_EMPTY_BODY = YES; |
@@ -168,6 +171,7 @@ | |||
168 | CLANG_WARN_INFINITE_RECURSION = YES; | 171 | CLANG_WARN_INFINITE_RECURSION = YES; |
169 | CLANG_WARN_INT_CONVERSION = YES; | 172 | CLANG_WARN_INT_CONVERSION = YES; |
170 | CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; | 173 | CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; |
174 | CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; | ||
171 | CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; | 175 | CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; |
172 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; | 176 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; |
173 | CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; | 177 | CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; |
@@ -205,8 +209,9 @@ | |||
205 | isa = XCBuildConfiguration; | 209 | isa = XCBuildConfiguration; |
206 | buildSettings = { | 210 | buildSettings = { |
207 | ALWAYS_SEARCH_USER_PATHS = NO; | 211 | ALWAYS_SEARCH_USER_PATHS = NO; |
212 | CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES; | ||
208 | CLANG_ANALYZER_NONNULL = YES; | 213 | CLANG_ANALYZER_NONNULL = YES; |
209 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; | 214 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++17"; |
210 | CLANG_CXX_LIBRARY = "libc++"; | 215 | CLANG_CXX_LIBRARY = "libc++"; |
211 | CLANG_ENABLE_MODULES = YES; | 216 | CLANG_ENABLE_MODULES = YES; |
212 | CLANG_ENABLE_OBJC_ARC = YES; | 217 | CLANG_ENABLE_OBJC_ARC = YES; |
@@ -214,6 +219,7 @@ | |||
214 | CLANG_WARN_BOOL_CONVERSION = YES; | 219 | CLANG_WARN_BOOL_CONVERSION = YES; |
215 | CLANG_WARN_COMMA = YES; | 220 | CLANG_WARN_COMMA = YES; |
216 | CLANG_WARN_CONSTANT_CONVERSION = YES; | 221 | CLANG_WARN_CONSTANT_CONVERSION = YES; |
222 | CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; | ||
217 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; | 223 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; |
218 | CLANG_WARN_DOCUMENTATION_COMMENTS = YES; | 224 | CLANG_WARN_DOCUMENTATION_COMMENTS = YES; |
219 | CLANG_WARN_EMPTY_BODY = YES; | 225 | CLANG_WARN_EMPTY_BODY = YES; |
@@ -221,6 +227,7 @@ | |||
221 | CLANG_WARN_INFINITE_RECURSION = YES; | 227 | CLANG_WARN_INFINITE_RECURSION = YES; |
222 | CLANG_WARN_INT_CONVERSION = YES; | 228 | CLANG_WARN_INT_CONVERSION = YES; |
223 | CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; | 229 | CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; |
230 | CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; | ||
224 | CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; | 231 | CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; |
225 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; | 232 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; |
226 | CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; | 233 | CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; |
diff --git a/MoonParser/ast.cpp b/MoonParser/ast.cpp index 739e02c..6217f3e 100644 --- a/MoonParser/ast.cpp +++ b/MoonParser/ast.cpp | |||
@@ -10,13 +10,19 @@ static ast_container *_current = 0; | |||
10 | 10 | ||
11 | int ast_type_id = 0; | 11 | int ast_type_id = 0; |
12 | 12 | ||
13 | traversal ast_node::traverse(const std::function<traversal (ast_node*)>& func) { | ||
14 | return func(this); | ||
15 | } | ||
13 | 16 | ||
14 | bool ast_node::visit(const std::function<bool (ast_node*)>& begin, | 17 | ast_node* ast_node::getByPath(std::initializer_list<std::size_t>) { |
15 | const std::function<bool (ast_node*)>& end) | 18 | return nullptr; |
16 | { | ||
17 | return begin(this) || end(this); | ||
18 | } | 19 | } |
19 | 20 | ||
21 | void ast_node::eachChild(const std::function<void (ast_node*)>&) { } | ||
22 | |||
23 | bool ast_node::visitChild(const std::function<bool (ast_node*)>&) { | ||
24 | return false; | ||
25 | } | ||
20 | 26 | ||
21 | /** sets the container under construction to be this. | 27 | /** sets the container under construction to be this. |
22 | */ | 28 | */ |
@@ -48,28 +54,123 @@ void ast_container::construct(ast_stack &st) { | |||
48 | } | 54 | } |
49 | } | 55 | } |
50 | 56 | ||
51 | bool ast_container::visit(const std::function<bool (ast_node*)>& begin, | 57 | traversal ast_container::traverse(const std::function<traversal (ast_node*)>& func) { |
52 | const std::function<bool (ast_node*)>& end) | 58 | traversal action = func(this); |
53 | { | 59 | switch (action) { |
54 | bool result = begin(this); | 60 | case traversal::Stop: return traversal::Stop; |
55 | if (result) return true; | 61 | case traversal::Return: return traversal::Continue; |
62 | default: break; | ||
63 | } | ||
56 | const auto& members = this->members(); | 64 | const auto& members = this->members(); |
57 | for (auto member : members) { | 65 | for (auto member : members) { |
58 | if (_ast_ptr* ptr = ast_cast<_ast_ptr>(member)) { | 66 | if (_ast_ptr* ptr = ast_cast<_ast_ptr>(member)) { |
59 | if (ptr->get() && ptr->get()->visit(begin, end)) { | 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 | |||
81 | ast_node* ast_container::getByPath(std::initializer_list<std::size_t> paths) { | ||
82 | ast_node* current = this; | ||
83 | auto it = paths.begin(); | ||
84 | while (it != paths.end()) { | ||
85 | ast_node* findNode = nullptr; | ||
86 | current->visitChild([&](ast_node* node) { | ||
87 | if (node->getId() == *it) { | ||
88 | findNode = node; | ||
60 | return true; | 89 | return true; |
61 | } | 90 | } |
91 | return false; | ||
92 | }); | ||
93 | if (findNode) { | ||
94 | current = findNode; | ||
95 | } else { | ||
96 | current = nullptr; | ||
97 | break; | ||
98 | } | ||
99 | ++it; | ||
100 | } | ||
101 | return current; | ||
102 | } | ||
103 | |||
104 | void ast_container::eachChild(const std::function<void (ast_node*)>& func) { | ||
105 | const auto& members = this->members(); | ||
106 | for (auto member : members) { | ||
107 | if (_ast_ptr* ptr = ast_cast<_ast_ptr>(member)) { | ||
108 | if (ptr->get()) { | ||
109 | func(ptr->get()); | ||
110 | } | ||
111 | } else if (_ast_list* list = ast_cast<_ast_list>(member)) { | ||
112 | for (auto obj : list->objects()) { | ||
113 | if (obj) { | ||
114 | func(obj); | ||
115 | } | ||
116 | } | ||
117 | } | ||
118 | } | ||
119 | } | ||
120 | |||
121 | bool ast_container::visitChild(const std::function<bool (ast_node*)>& func) { | ||
122 | const auto& members = this->members(); | ||
123 | for (auto member : members) { | ||
124 | if (_ast_ptr* ptr = ast_cast<_ast_ptr>(member)) { | ||
125 | if (ptr->get()) { | ||
126 | if (func(ptr->get())) return true; | ||
127 | } | ||
62 | } else if (_ast_list* list = ast_cast<_ast_list>(member)) { | 128 | } else if (_ast_list* list = ast_cast<_ast_list>(member)) { |
63 | for (auto obj : list->objects()) { | 129 | for (auto obj : list->objects()) { |
64 | if (obj->visit(begin, end)) { | 130 | if (obj) { |
65 | return true; | 131 | if (func(obj)) return true; |
66 | } | 132 | } |
67 | } | 133 | } |
68 | } | 134 | } |
69 | } | 135 | } |
70 | return end(this); | 136 | return false; |
71 | } | 137 | } |
72 | 138 | ||
139 | ast_node* ast_container::getChild(int index) const { | ||
140 | int i = 0; | ||
141 | const auto& members = this->members(); | ||
142 | for (auto member : members) { | ||
143 | if (_ast_ptr* ptr = ast_cast<_ast_ptr>(member)) { | ||
144 | if (ptr->get()) { | ||
145 | if (i == index) return ptr->get(); | ||
146 | i++; | ||
147 | } | ||
148 | } else if (_ast_list* list = ast_cast<_ast_list>(member)) { | ||
149 | for (auto obj : list->objects()) { | ||
150 | if (obj) { | ||
151 | if (i == index) return obj; | ||
152 | i++; | ||
153 | } | ||
154 | } | ||
155 | } | ||
156 | } | ||
157 | return nullptr; | ||
158 | } | ||
159 | |||
160 | int ast_container::getChildCount() const { | ||
161 | int count = 0; | ||
162 | const auto& members = this->members(); | ||
163 | for (auto member : members) { | ||
164 | if (_ast_ptr* ptr = ast_cast<_ast_ptr>(member)) { | ||
165 | if (ptr->get()) count++; | ||
166 | } else if (_ast_list* list = ast_cast<_ast_list>(member)) { | ||
167 | for (auto obj : list->objects()) { | ||
168 | if (obj) count++; | ||
169 | } | ||
170 | } | ||
171 | } | ||
172 | return count; | ||
173 | } | ||
73 | 174 | ||
74 | //register the AST member to the current container. | 175 | //register the AST member to the current container. |
75 | void ast_member::_init() { | 176 | void ast_member::_init() { |
diff --git a/MoonParser/ast.hpp b/MoonParser/ast.hpp index 1d05779..4d52dfc 100644 --- a/MoonParser/ast.hpp +++ b/MoonParser/ast.hpp | |||
@@ -31,6 +31,12 @@ int ast_type() | |||
31 | return type; | 31 | return type; |
32 | } | 32 | } |
33 | 33 | ||
34 | enum class traversal { | ||
35 | Continue, | ||
36 | Return, | ||
37 | Stop | ||
38 | }; | ||
39 | |||
34 | /** Base class for AST nodes. | 40 | /** Base class for AST nodes. |
35 | */ | 41 | */ |
36 | class ast_node : public input_range { | 42 | class ast_node : public input_range { |
@@ -65,8 +71,19 @@ public: | |||
65 | 71 | ||
66 | /** interface for visiting AST tree use. | 72 | /** interface for visiting AST tree use. |
67 | */ | 73 | */ |
68 | virtual bool visit(const std::function<bool (ast_node*)>& begin, | 74 | virtual traversal traverse(const std::function<traversal (ast_node*)>& func); |
69 | const std::function<bool (ast_node*)>& end); | 75 | |
76 | virtual ast_node* getByPath(std::initializer_list<std::size_t> paths); | ||
77 | |||
78 | virtual void eachChild(const std::function<void (ast_node*)>& func); | ||
79 | |||
80 | virtual bool visitChild(const std::function<bool (ast_node*)>& func); | ||
81 | |||
82 | virtual ast_node* getChild(int) const { return nullptr; } | ||
83 | |||
84 | virtual int getChildCount() const { return 0; } | ||
85 | |||
86 | virtual size_t getId() const { return "ast_node"_id; } | ||
70 | 87 | ||
71 | virtual const char* getName() const { return "ast_node"; } | 88 | virtual const char* getName() const { return "ast_node"; } |
72 | 89 | ||
@@ -140,8 +157,19 @@ public: | |||
140 | */ | 157 | */ |
141 | virtual void construct(ast_stack &st) override; | 158 | virtual void construct(ast_stack &st) override; |
142 | 159 | ||
143 | virtual bool visit(const std::function<bool (ast_node*)>& begin, | 160 | virtual ast_node* getByPath(std::initializer_list<std::size_t> paths) override; |
144 | const std::function<bool (ast_node*)>& end) override; | 161 | |
162 | virtual traversal traverse(const std::function<traversal (ast_node*)>& func) override; | ||
163 | |||
164 | virtual void eachChild(const std::function<void (ast_node*)>& func) override; | ||
165 | |||
166 | virtual bool visitChild(const std::function<bool (ast_node*)>& func) override; | ||
167 | |||
168 | virtual ast_node* getChild(int index) const override; | ||
169 | |||
170 | virtual int getChildCount() const override; | ||
171 | |||
172 | virtual size_t getId() const override { return "ast_container"_id; } | ||
145 | 173 | ||
146 | virtual const char* getName() const override { return "ast_container"; } | 174 | virtual const char* getName() const override { return "ast_container"; } |
147 | private: | 175 | private: |
diff --git a/MoonParser/moon_ast.cpp b/MoonParser/moon_ast.cpp index 2a6ca61..4fb0212 100644 --- a/MoonParser/moon_ast.cpp +++ b/MoonParser/moon_ast.cpp | |||
@@ -2,23 +2,15 @@ | |||
2 | #include <unordered_set> | 2 | #include <unordered_set> |
3 | #include <stack> | 3 | #include <stack> |
4 | #include <algorithm> | 4 | #include <algorithm> |
5 | #include <sstream> | ||
6 | #include <vector> | 5 | #include <vector> |
6 | #include <numeric> | ||
7 | #include <memory> | ||
8 | #include <array> | ||
9 | #include <sstream> | ||
10 | #include <string_view> | ||
11 | using namespace std::string_view_literals; | ||
7 | #include "moon_ast.h" | 12 | #include "moon_ast.h" |
8 | 13 | ||
9 | input& trim(input& s) | ||
10 | { | ||
11 | s.erase(s.begin(), std::find_if(s.begin(), s.end(), [](input::value_type ch) | ||
12 | { | ||
13 | return !std::isspace(ch); | ||
14 | })); | ||
15 | s.erase(std::find_if(s.rbegin(), s.rend(), [](input::value_type ch) | ||
16 | { | ||
17 | return !std::isspace(ch); | ||
18 | }).base(), s.end()); | ||
19 | return s; | ||
20 | } | ||
21 | |||
22 | const input& AstLeaf::getValue() | 14 | const input& AstLeaf::getValue() |
23 | { | 15 | { |
24 | if (_value.empty()) | 16 | if (_value.empty()) |
@@ -144,50 +136,768 @@ AST_IMPL(BlockEnd) | |||
144 | 136 | ||
145 | #include <iostream> | 137 | #include <iostream> |
146 | 138 | ||
147 | int main() | 139 | template<class T, class... Args> |
140 | inline std::unique_ptr<T> MakeUnique(Args&&... args) { | ||
141 | return std::unique_ptr<T>(new T(std::forward<Args>(args)...)); | ||
142 | } | ||
143 | |||
144 | inline std::string s(std::string_view sv) { | ||
145 | return std::string(sv); | ||
146 | } | ||
147 | |||
148 | class MoonCompliler | ||
148 | { | 149 | { |
149 | std::string s = R"TestCodesHere( | 150 | public: |
150 | thing = { var: 10, hello: "world", func: => @var } | 151 | void complile(const std::string& codes) { |
151 | import hello, \func from thing | 152 | input input = _converter.from_bytes(codes); |
152 | )TestCodesHere"; | 153 | error_list el; |
153 | input i = Converter{}.from_bytes(s); | 154 | BlockEnd_t* root = nullptr; |
154 | 155 | State st; | |
155 | error_list el; | 156 | if (parse(input, BlockEnd, el, root, &st)) { |
156 | BlockEnd_t* root = nullptr; | 157 | std::cout << "matched!\n"; |
157 | State st; | 158 | std::vector<std::string> out; |
158 | if (parse(i, BlockEnd, el, root, &st)) | 159 | root->eachChild([&](ast_node* node) { |
159 | { | 160 | switch (node->getId()) { |
160 | std::cout << "matched!\n"; | 161 | case "Block"_id: |
161 | int indent = 0; | 162 | pushScope(); |
162 | root->visit([&](ast_node* node) | 163 | transformBlock(node, out); |
163 | { | 164 | popScope(); |
164 | if (std::string("Seperator") != node->getName()) | 165 | break; |
165 | { | 166 | default: break; |
166 | indent++; | 167 | } |
167 | for (int i = 0; i < indent; i++) std::cout << " "; | 168 | }); |
168 | std::cout << "{" << node->getName() << "\n"; | 169 | std::string result; |
169 | } | 170 | if (out.size() == 1) { |
170 | return false; | 171 | result = std::move(out.front()); |
171 | }, [&](ast_node* node) | 172 | } else if (out.size() > 1) { |
172 | { | 173 | result = join(out, "\n"); |
173 | if (std::string("Seperator") != node->getName()) | 174 | } |
174 | { | 175 | std::cout << result << '\n'; |
175 | for (int i = 0; i < indent; i++) std::cout << " "; | 176 | } else { |
176 | std::cout << "}\n" ; | 177 | std::cout << "not matched!\n"; |
177 | indent--; | 178 | for (error_list::iterator it = el.begin(); it != el.end(); ++it) { |
178 | } | 179 | const error& err = *it; |
179 | return false; | 180 | std::cout << "line " << err.m_begin.m_line << ", col " << err.m_begin.m_col << ": syntax error\n"; |
180 | }); | 181 | } |
181 | } | 182 | } |
182 | else | 183 | } |
183 | { | 184 | |
184 | std::cout << "not matched!\n"; | 185 | private: |
185 | for (error_list::iterator it = el.begin(); it != el.end(); ++it) | 186 | Converter _converter; |
186 | { | 187 | std::ostringstream _buf; |
187 | const error& err = *it; | 188 | std::string _newLine = "\n"; |
188 | std::cout << "line " << err.m_begin.m_line << ", col " << err.m_begin.m_col << ": syntax error\n"; | 189 | std::vector<int> _lineTable; |
190 | struct Scope { | ||
191 | std::unique_ptr<std::unordered_set<std::string>> vars; | ||
192 | std::unique_ptr<std::unordered_set<std::string>> allows; | ||
193 | }; | ||
194 | std::vector<Scope> _scopes; | ||
195 | static const std::string Empty; | ||
196 | |||
197 | void pushScope() { | ||
198 | _scopes.emplace_back(); | ||
199 | _scopes.back().vars = MakeUnique<std::unordered_set<std::string>>(); | ||
200 | } | ||
201 | |||
202 | bool isDefined(const std::string& name, bool checkShadowScope = false) { | ||
203 | bool isDefined = false; | ||
204 | for (auto it = _scopes.rbegin(); it != _scopes.rend(); ++it) { | ||
205 | auto vars = it->vars.get(); | ||
206 | if (vars->find(name) != vars->end()) { | ||
207 | isDefined = true; | ||
208 | break; | ||
209 | } | ||
210 | if (checkShadowScope && it->allows) break; | ||
211 | } | ||
212 | return isDefined; | ||
213 | } | ||
214 | |||
215 | void markVarShadowed() { | ||
216 | auto& scope = _scopes.back(); | ||
217 | scope.allows = MakeUnique<std::unordered_set<std::string>>(); | ||
218 | } | ||
219 | |||
220 | void addToAllowList(const std::string& name) { | ||
221 | auto& scope = _scopes.back(); | ||
222 | scope.allows->insert(name); | ||
223 | } | ||
224 | |||
225 | void forceAddToScope(const std::string& name) { | ||
226 | auto& scope = _scopes.back(); | ||
227 | scope.vars->insert(name); | ||
228 | } | ||
229 | |||
230 | bool addToScope(const std::string& name) { | ||
231 | bool defined = false; | ||
232 | auto& scope = _scopes.back(); | ||
233 | decltype(scope.allows.get()) allows = nullptr; | ||
234 | for (auto it = _scopes.rbegin(); it != _scopes.rend(); ++it) { | ||
235 | if (it->allows) allows = it->allows.get(); | ||
236 | } | ||
237 | if (allows) { | ||
238 | bool shadowed = allows->find(name) == allows->end(); | ||
239 | defined = isDefined(name, shadowed); | ||
240 | } else { | ||
241 | defined = isDefined(name); | ||
242 | } | ||
243 | if (!defined) scope.vars->insert(name); | ||
244 | return !defined; | ||
245 | } | ||
246 | |||
247 | void popScope() { | ||
248 | _scopes.pop_back(); | ||
249 | } | ||
250 | |||
251 | const std::string nll(ast_node* node) { | ||
252 | _lineTable.push_back(node->m_begin.m_line); | ||
253 | return _newLine; | ||
254 | } | ||
255 | |||
256 | const std::string nlr(ast_node* node) { | ||
257 | _lineTable.push_back(node->m_end.m_line); | ||
258 | return _newLine; | ||
259 | } | ||
260 | |||
261 | std::string indent() { | ||
262 | return std::string(_scopes.size() - 1, '\t'); | ||
263 | } | ||
264 | |||
265 | std::string clearBuf() { | ||
266 | std::string str = _buf.str(); | ||
267 | _buf.str(""); | ||
268 | _buf.clear(); | ||
269 | return str; | ||
270 | } | ||
271 | |||
272 | std::string join(const std::vector<std::string>& items) { | ||
273 | if (items.empty()) return Empty; | ||
274 | else if (items.size() == 1) return items.front(); | ||
275 | return std::accumulate(items.begin()+1, items.end(), items.front(), | ||
276 | [&](const std::string& a, const std::string& b) { return a + b; }); | ||
277 | } | ||
278 | |||
279 | std::string join(const std::vector<std::string>& items, std::string_view sep) { | ||
280 | if (items.empty()) return Empty; | ||
281 | else if (items.size() == 1) return items.front(); | ||
282 | std::string sepStr = s(sep); | ||
283 | return std::accumulate(items.begin()+1, items.end(), items.front(), | ||
284 | [&](const std::string& a, const std::string& b) { return a + sepStr + b; }); | ||
285 | } | ||
286 | |||
287 | std::string toString(ast_node* node) { | ||
288 | auto str = _converter.to_bytes(std::u32string(node->m_begin.m_it, node->m_end.m_it)); | ||
289 | return trim(str); | ||
290 | } | ||
291 | |||
292 | void noop(ast_node* node, std::vector<std::string>& out) { | ||
293 | auto str = _converter.to_bytes(std::u32string(node->m_begin.m_it, node->m_end.m_it)); | ||
294 | out.push_back(s("<"sv) + node->getName() + s(">"sv) + trim(str)); | ||
295 | // out.push_back(trim(str)); | ||
296 | } | ||
297 | |||
298 | void noopnl(ast_node* node, std::vector<std::string>& out) { | ||
299 | auto str = _converter.to_bytes(std::u32string(node->m_begin.m_it, node->m_end.m_it)); | ||
300 | out.push_back(s("<"sv) + node->getName() + s(">"sv) + trim(str) + nll(node)); | ||
301 | // out.push_back(trim(str) + nll(node)); | ||
302 | } | ||
303 | |||
304 | void transformBlock(ast_node* block, std::vector<std::string>& out) { | ||
305 | std::vector<std::string> temp; | ||
306 | block->eachChild([&](ast_node* node) { | ||
307 | switch (node->getId()) { | ||
308 | case "Line"_id: transformLine(node, temp); break; | ||
309 | default: break; | ||
310 | } | ||
311 | }); | ||
312 | out.push_back(join(temp)); | ||
313 | } | ||
314 | |||
315 | void transformLine(ast_node* line, std::vector<std::string>& out) { | ||
316 | line->eachChild([&](ast_node* node) { | ||
317 | switch (node->getId()) { | ||
318 | case "Statement"_id: transformStatement(node, out); break; | ||
319 | default: break; | ||
320 | } | ||
321 | }); | ||
322 | } | ||
323 | |||
324 | void transformStatement(ast_node* statement, std::vector<std::string>& out) { | ||
325 | std::vector<std::string> temp; | ||
326 | auto transformContent = [&](ast_node* node, std::vector<std::string>& out) { | ||
327 | switch (node->getId()) { | ||
328 | case "Import"_id: transformImport(node, temp); break; | ||
329 | case "While"_id: transformWhile(node, temp); break; | ||
330 | case "With"_id: transformWith(node, temp); break; | ||
331 | case "For"_id: transformFor(node, temp); break; | ||
332 | case "ForEach"_id: transformForEach(node, temp); break; | ||
333 | case "Switch"_id: transformSwitch(node, temp); break; | ||
334 | case "Return"_id: transformReturn(node, temp); break; | ||
335 | case "Local"_id: transformLocal(node, temp); break; | ||
336 | case "Export"_id: transformExport(node, temp); break; | ||
337 | case "BreakLoop"_id: transformBreakLoop(node, temp); break; | ||
338 | case "Assignment"_id: transformAssignment(node, temp); break; | ||
339 | case "ExpList"_id: | ||
340 | transformExpList(node, temp); | ||
341 | temp.back() = indent() + temp.back() + nll(node); | ||
342 | break; | ||
343 | default: break; | ||
344 | } | ||
345 | }; | ||
346 | if (statement->getChildCount() > 1) { | ||
347 | pushScope(); | ||
348 | transformContent(statement->getChild(0), out); | ||
349 | popScope(); | ||
350 | transform_statement_appendix(statement->getChild(1), temp); | ||
351 | } else { | ||
352 | transformContent(statement->getChild(0), out); | ||
353 | } | ||
354 | switch (temp.size()) { | ||
355 | case 1: // body | ||
356 | out.push_back(std::move(temp.front())); | ||
357 | break; | ||
358 | case 2: // body, if | ||
359 | out.push_back(join({std::move(temp[1]), std::move(temp[0]), s("end"sv) + nlr(statement)})); | ||
360 | break; | ||
361 | case 3: // body, if, else | ||
362 | out.push_back(join({std::move(temp[1]), std::move(temp[0]), std::move(temp[2]), s("end"sv) + nlr(statement)})); | ||
363 | break; | ||
364 | } | ||
365 | } | ||
366 | |||
367 | void transform_statement_appendix(ast_node* appendix, std::vector<std::string>& out) { | ||
368 | appendix->eachChild([&](ast_node* node) { | ||
369 | switch (node->getId()) { | ||
370 | case "if_else_line"_id: transform_if_else_line(node, out); break; | ||
371 | case "unless_line"_id: transform_unless_line(node, out); break; | ||
372 | case "CompInner"_id: transformCompInner(node, out); break; | ||
373 | default: break; | ||
374 | } | ||
375 | }); | ||
376 | } | ||
377 | |||
378 | void transform_if_else_line(ast_node* if_else_line, std::vector<std::string>& out) { | ||
379 | std::vector<std::string> temp; | ||
380 | if_else_line->eachChild([&](ast_node* node) { | ||
381 | switch (node->getId()) { | ||
382 | case "Exp"_id: | ||
383 | pushScope(); | ||
384 | transformExp(node, temp); | ||
385 | popScope(); | ||
386 | break; | ||
387 | default: break; | ||
388 | } | ||
389 | }); | ||
390 | out.push_back(indent() + s("if "sv) + temp[0] + s(" then"sv) + nll(if_else_line)); | ||
391 | out.push_back(indent() + s("else "sv) + nll(if_else_line) + indent() + '\t' + temp[1] + nll(if_else_line)); | ||
392 | } | ||
393 | |||
394 | void transformAssignment(ast_node* assignment, std::vector<std::string>& out) { | ||
395 | std::vector<std::string> temp; | ||
396 | std::string preDefined; | ||
397 | assignment->eachChild([&](ast_node* node) { | ||
398 | switch (node->getId()) { | ||
399 | case "ExpList"_id: { | ||
400 | std::vector<std::string> preDefs; | ||
401 | std::vector<ast_node*> values; | ||
402 | node->traverse([&](ast_node* child) { | ||
403 | if (child->getId() == "Value"_id) { | ||
404 | auto target = child->getByPath({"ChainValue"_id, "Callable"_id, "Name"_id}); | ||
405 | if (target) { | ||
406 | auto name = toString(target); | ||
407 | if (addToScope(name)) { | ||
408 | preDefs.push_back(name); | ||
409 | } | ||
410 | } | ||
411 | return traversal::Return; | ||
412 | } | ||
413 | return traversal::Continue; | ||
414 | }); | ||
415 | if (!preDefs.empty()) { | ||
416 | preDefined = indent() + s("local "sv) + join(preDefs, ", "sv) + nll(node); | ||
417 | } | ||
418 | transformExpList(node, temp); | ||
419 | break; | ||
420 | } | ||
421 | case "Update"_id: transformUpdate(node, temp); break; | ||
422 | case "Assign"_id: transformAssign(node, temp); break; | ||
423 | default: break; | ||
424 | } | ||
425 | }); | ||
426 | out.push_back(preDefined + indent() + temp[0] + s(" = "sv) + temp[1] + nll(assignment)); | ||
427 | } | ||
428 | |||
429 | void transformExpList(ast_node* expList, std::vector<std::string>& out) { | ||
430 | std::vector<std::string> temp; | ||
431 | expList->eachChild([&](ast_node* node) { | ||
432 | switch (node->getId()) { | ||
433 | case "Exp"_id: transformExp(node, temp); break; | ||
434 | default: break; | ||
435 | } | ||
436 | }); | ||
437 | out.push_back(join(temp, ", "sv)); | ||
438 | } | ||
439 | |||
440 | void transformExpListLow(ast_node* expListLow, std::vector<std::string>& out) { | ||
441 | std::vector<std::string> temp; | ||
442 | expListLow->eachChild([&](ast_node* node) { | ||
443 | switch (node->getId()) { | ||
444 | case "Exp"_id: transformExp(node, temp); break; | ||
445 | default: break; | ||
446 | } | ||
447 | }); | ||
448 | out.push_back(join(temp, ", "sv)); | ||
449 | } | ||
450 | |||
451 | void transformAssign(ast_node* assign, std::vector<std::string>& out) { | ||
452 | assign->eachChild([&](ast_node* node) { | ||
453 | switch (node->getId()) { | ||
454 | case "With"_id: transformWith(node, out); break; | ||
455 | case "If"_id: transformIf(node, out); break; | ||
456 | case "Switch"_id: transformSwitch(node, out); break; | ||
457 | case "TableBlock"_id: transformTableBlock(node, out); break; | ||
458 | case "ExpListLow"_id: transformExpListLow(node, out); break; | ||
459 | default: break; | ||
460 | } | ||
461 | }); | ||
462 | } | ||
463 | |||
464 | void transformExp(ast_node* exp, std::vector<std::string>& out) { | ||
465 | std::vector<std::string> temp; | ||
466 | exp->eachChild([&](ast_node* node) { | ||
467 | switch (node->getId()) { | ||
468 | case "Value"_id: transformValue(node, temp); break; | ||
469 | case "exp_op_value"_id: transform_exp_op_value(node, temp); break; | ||
470 | default: break; | ||
471 | } | ||
472 | }); | ||
473 | out.push_back(join(temp, " "sv)); | ||
474 | } | ||
475 | |||
476 | void transform_exp_op_value(ast_node* exp_op_value, std::vector<std::string>& out) { | ||
477 | exp_op_value->eachChild([&](ast_node* node) { | ||
478 | switch (node->getId()) { | ||
479 | case "BinaryOperator"_id: transformBinaryOperator(node, out); break; | ||
480 | case "Value"_id: transformValue(node, out); break; | ||
481 | default: break; | ||
482 | } | ||
483 | }); | ||
484 | } | ||
485 | |||
486 | void transformValue(ast_node* value, std::vector<std::string>& out) { | ||
487 | value->eachChild([&](ast_node* node) { | ||
488 | switch (node->getId()) { | ||
489 | case "SimpleValue"_id: transformSimpleValue(node, out); break; | ||
490 | case "simple_table"_id: transform_simple_table(node, out); break; | ||
491 | case "ChainValue"_id: transformChainValue(node, out); break; | ||
492 | case "String"_id: transformString(node, out); break; | ||
493 | default: break; | ||
494 | } | ||
495 | }); | ||
496 | } | ||
497 | |||
498 | void transformChainValue(ast_node* chainValue, std::vector<std::string>& out) { | ||
499 | std::vector<std::string> temp; | ||
500 | bool hasInvokeArgs = false; | ||
501 | chainValue->eachChild([&](ast_node* node) { | ||
502 | switch (node->getId()) { | ||
503 | case "Chain"_id: transformChain(node, temp); break; | ||
504 | case "Callable"_id: transformCallable(node, temp); break; | ||
505 | case "InvokeArgs"_id: | ||
506 | hasInvokeArgs = true; | ||
507 | transformInvokeArgs(node, temp); | ||
508 | break; | ||
509 | default: break; | ||
510 | } | ||
511 | }); | ||
512 | out.push_back(hasInvokeArgs ? (temp[0] + s("("sv) + temp[1] + s(")"sv)) : temp[0]); | ||
513 | } | ||
514 | |||
515 | void transformCallable(ast_node* callable, std::vector<std::string>& out) { | ||
516 | callable->eachChild([&](ast_node* node) { | ||
517 | switch (node->getId()) { | ||
518 | case "Name"_id: transformName(node, out); break; | ||
519 | case "SelfName"_id: transformSelfName(node, out); break; | ||
520 | case "VarArg"_id: transformVarArg(node, out); break; | ||
521 | case "Parens"_id: transformParens(node, out); break; | ||
522 | default: break; | ||
523 | } | ||
524 | }); | ||
525 | } | ||
526 | |||
527 | void transformParens(ast_node* parans, std::vector<std::string>& out) { | ||
528 | std::vector<std::string> temp; | ||
529 | parans->eachChild([&](ast_node* node) { | ||
530 | switch (node->getId()) { | ||
531 | case "Exp"_id: transformExp(node, temp); break; | ||
532 | default: break; | ||
533 | } | ||
534 | }); | ||
535 | out.push_back(s("("sv) + temp.front() + s(")"sv)); | ||
536 | } | ||
537 | |||
538 | void transformSimpleValue(ast_node* simpleValue, std::vector<std::string>& out) { | ||
539 | simpleValue->eachChild([&](ast_node* node) { | ||
540 | switch (node->getId()) { | ||
541 | case "const_value"_id: transform_const_value(node, out); break; | ||
542 | case "If"_id: transformIf(node, out); break; | ||
543 | case "Switch"_id: transformSwitch(node, out); break; | ||
544 | case "With"_id: transformWith(node, out); break; | ||
545 | case "ClassDecl"_id: transformClassDecl(node, out); break; | ||
546 | case "ForEach"_id: transformForEach(node, out); break; | ||
547 | case "For"_id: transformFor(node, out); break; | ||
548 | case "While"_id: transformWhile(node, out); break; | ||
549 | case "Do"_id: transformDo(node, out); break; | ||
550 | case "unary_exp"_id: transform_unary_exp(node, out); break; | ||
551 | case "TblComprehension"_id: transformTblComprehension(node, out); break; | ||
552 | case "TableLit"_id: transformTableLit(node, out); break; | ||
553 | case "Comprehension"_id: transformComprehension(node, out); break; | ||
554 | case "FunLit"_id: transformFunLit(node, out); break; | ||
555 | case "Num"_id: transformNum(node, out); break; | ||
556 | default: break; | ||
557 | } | ||
558 | }); | ||
559 | } | ||
560 | |||
561 | void transformFunLit(ast_node* funLit, std::vector<std::string>& out) { | ||
562 | std::vector<std::string> temp; | ||
563 | bool isFatArrow = false; | ||
564 | bool hasArgsDef = false; | ||
565 | ast_node* body = nullptr; | ||
566 | pushScope(); | ||
567 | funLit->eachChild([&](ast_node* node) { | ||
568 | switch (node->getId()) { | ||
569 | case "FnArgsDef"_id: | ||
570 | hasArgsDef = true; | ||
571 | transformFnArgsDef(node, temp); | ||
572 | break; | ||
573 | case "fn_arrow"_id: | ||
574 | isFatArrow = toString(node) == "=>"sv; | ||
575 | break; | ||
576 | case "Body"_id: | ||
577 | transformBody(node, temp); | ||
578 | body = node; | ||
579 | break; | ||
580 | default: break; | ||
581 | } | ||
582 | }); | ||
583 | popScope(); | ||
584 | if (hasArgsDef) { | ||
585 | auto& args = temp[0]; | ||
586 | auto& initArgs = temp[1]; | ||
587 | auto& bodyCodes = temp[2]; | ||
588 | _buf << "function("sv << | ||
589 | (isFatArrow ? s("self"sv) + s(args.empty() ? ""sv : ", "sv) : Empty) << | ||
590 | args << ')' << nll(funLit) << | ||
591 | (initArgs.empty() ? Empty : initArgs) << | ||
592 | (body ? bodyCodes : Empty) << | ||
593 | indent() << "end"sv; | ||
594 | out.push_back(clearBuf()); | ||
595 | } else { | ||
596 | auto& bodyCodes = temp[0]; | ||
597 | out.push_back( | ||
598 | s("function()"sv) + nll(funLit) + | ||
599 | (body ? bodyCodes : Empty) + | ||
600 | indent() + s("end"sv) | ||
601 | ); | ||
189 | } | 602 | } |
190 | } | 603 | } |
191 | system("pause"); | 604 | |
605 | void transformBody(ast_node* body, std::vector<std::string>& out) { | ||
606 | body->eachChild([&](ast_node* node) { | ||
607 | switch (node->getId()) { | ||
608 | case "Block"_id: transformBlock(node, out); break; | ||
609 | case "Statement"_id: transformStatement(node, out); break; | ||
610 | default: break; | ||
611 | } | ||
612 | }); | ||
613 | } | ||
614 | |||
615 | void transformFnArgsDef(ast_node* argsDef, std::vector<std::string>& out) { | ||
616 | argsDef->eachChild([&](ast_node* node) { | ||
617 | switch (node->getId()) { | ||
618 | case "FnArgDefList"_id: transformFnArgDefList(node, out); break; | ||
619 | case "outer_var_shadow"_id: transform_outer_var_shadow(node, out); break; | ||
620 | default: break; | ||
621 | } | ||
622 | }); | ||
623 | } | ||
624 | |||
625 | void transform_outer_var_shadow(ast_node* shadow, std::vector<std::string>& out) { | ||
626 | markVarShadowed(); | ||
627 | shadow->eachChild([&](ast_node* node) { | ||
628 | switch (node->getId()) { | ||
629 | case "NameList"_id: | ||
630 | node->eachChild([&](ast_node* child) { | ||
631 | if (child->getId() == "Name"_id) { | ||
632 | this->addToAllowList(toString(child)); | ||
633 | } | ||
634 | }); | ||
635 | break; | ||
636 | default: break; | ||
637 | } | ||
638 | }); | ||
639 | } | ||
640 | |||
641 | void transformFnArgDefList(ast_node* argDefList, std::vector<std::string>& out) { | ||
642 | std::vector<std::vector<std::string>> argItems; | ||
643 | const int Name = 0; | ||
644 | const int AssignSelf = 1; | ||
645 | const int DefaultVal = 2; | ||
646 | argDefList->eachChild([&](ast_node* node) { | ||
647 | switch (node->getId()) { | ||
648 | case "FnArgDef"_id: { | ||
649 | argItems.emplace_back(2); | ||
650 | auto& arg = argItems.back(); | ||
651 | node->eachChild([&](ast_node* child) { | ||
652 | switch (child->getId()) { | ||
653 | case "Name"_id: arg[Name] = toString(child); break; | ||
654 | case "SelfName"_id: | ||
655 | child->eachChild([&](ast_node* inner) { | ||
656 | switch (inner->getId()) { | ||
657 | case "self_class_name"_id: | ||
658 | arg[Name] = toString(inner->getChild(0)); | ||
659 | arg[AssignSelf] = s("self.__class."sv) + arg.front(); | ||
660 | break; | ||
661 | case "self_class"_id: | ||
662 | arg[Name] = "self.__class"sv; | ||
663 | break; | ||
664 | case "self_name"_id: | ||
665 | arg[Name] = toString(inner->getChild(0)); | ||
666 | arg[AssignSelf] = s("self."sv) + arg.front(); | ||
667 | break; | ||
668 | case "self"_id: | ||
669 | arg[Name] = "self"sv; | ||
670 | break; | ||
671 | } | ||
672 | }); | ||
673 | break; | ||
674 | case "Exp"_id: transformExp(child, arg); break; | ||
675 | default: break; | ||
676 | } | ||
677 | }); | ||
678 | break; | ||
679 | } | ||
680 | case "VarArg"_id: | ||
681 | argItems.emplace_back(2); | ||
682 | argItems.back()[Name] = "..."sv; | ||
683 | break; | ||
684 | default: break; | ||
685 | } | ||
686 | }); | ||
687 | std::string varNames; | ||
688 | for (const auto& item : argItems) { | ||
689 | if (varNames.empty()) { | ||
690 | varNames = item[Name]; | ||
691 | } else { | ||
692 | varNames.append(s(", "sv) + item[Name]); | ||
693 | } | ||
694 | forceAddToScope(item[Name]); | ||
695 | } | ||
696 | for (const auto& item : argItems) { | ||
697 | if (item.size() == 3 && !item[DefaultVal].empty()) { | ||
698 | _buf << indent() << "if "sv << item[Name] << " == nil then"sv << nll(argDefList) << | ||
699 | indent() << '\t' << item[Name] << " = "sv << item[DefaultVal] << nll(argDefList) << | ||
700 | indent() << "end"sv << nll(argDefList); | ||
701 | } | ||
702 | } | ||
703 | std::string initCodes = clearBuf(); | ||
704 | std::vector<std::array<const std::string*, 2>> assignSelfVars; | ||
705 | for (const auto& item : argItems) { | ||
706 | if (!item[AssignSelf].empty()) { | ||
707 | assignSelfVars.push_back({&item[AssignSelf], &item[Name]}); | ||
708 | } | ||
709 | } | ||
710 | auto sjoin = [](const decltype(assignSelfVars)& items, int index) { | ||
711 | std::string result; | ||
712 | for (auto it = items.begin(); it != items.end(); ++it) { | ||
713 | if (result.empty()) result = *((*it)[index]); | ||
714 | else result.append(s(", "sv) + *((*it)[index])); | ||
715 | } | ||
716 | return result; | ||
717 | }; | ||
718 | std::string sleft = sjoin(assignSelfVars, 0); | ||
719 | std::string sright = sjoin(assignSelfVars, 1); | ||
720 | if (!assignSelfVars.empty()) { | ||
721 | initCodes.append(sleft + s(" = "sv) + sright + nll(argDefList)); | ||
722 | } | ||
723 | out.push_back(varNames); | ||
724 | out.push_back(initCodes); | ||
725 | } | ||
726 | |||
727 | void transformChain(ast_node* chain, std::vector<std::string>& out) { | ||
728 | chain->eachChild([&](ast_node* node) { | ||
729 | switch (node->getId()) { | ||
730 | case "chain_call"_id: transform_chain_call(node, out); break; | ||
731 | case "chain_item"_id: transform_chain_item(node, out); break; | ||
732 | case "chain_dot_chain"_id: transform_chain_dot_chain(node, out); break; | ||
733 | case "ColonChain"_id: transformColonChain(node, out); break; | ||
734 | default: break; | ||
735 | } | ||
736 | }); | ||
737 | } | ||
738 | |||
739 | void transform_chain_call(ast_node* chain_call, std::vector<std::string>& out) { | ||
740 | std::vector<std::string> temp; | ||
741 | chain_call->eachChild([&](ast_node* node) { | ||
742 | switch (node->getId()) { | ||
743 | case "Callable"_id: transformCallable(node, temp); break; | ||
744 | case "String"_id: transformString(node, temp); break; | ||
745 | case "ChainItems"_id: transformChainItems(node, temp); break; | ||
746 | default: break; | ||
747 | } | ||
748 | }); | ||
749 | out.push_back(join(temp)); | ||
750 | } | ||
751 | |||
752 | void transformChainItems(ast_node* chainItems, std::vector<std::string>& out) { | ||
753 | std::vector<std::string> temp; | ||
754 | chainItems->eachChild([&](ast_node* node) { | ||
755 | switch (node->getId()) { | ||
756 | case "ChainItem"_id: transformChainItem(node, temp); break; | ||
757 | case "ColonChain"_id: transformColonChain(node, temp); break; | ||
758 | default: break; | ||
759 | } | ||
760 | }); | ||
761 | out.push_back(join(temp)); | ||
762 | } | ||
763 | |||
764 | void transformChainItem(ast_node* chainItem, std::vector<std::string>& out) { | ||
765 | chainItem->eachChild([&](ast_node* node) { | ||
766 | switch (node->getId()) { | ||
767 | case "Invoke"_id: transformInvoke(node, out); break; | ||
768 | case "DotChainItem"_id: | ||
769 | out.push_back(s("."sv) + toString(node->getChild(0))); | ||
770 | break; | ||
771 | case "Slice"_id: transformSlice(node, out); break; | ||
772 | case "Exp"_id: | ||
773 | transformExp(node, out); | ||
774 | out.back() = s("["sv) + out.back() + s("]"sv); | ||
775 | break; | ||
776 | default: break; | ||
777 | } | ||
778 | }); | ||
779 | } | ||
780 | |||
781 | void transformInvoke(ast_node* invoke, std::vector<std::string>& out) { | ||
782 | invoke->eachChild([&](ast_node* node) { | ||
783 | switch (node->getId()) { | ||
784 | case "FnArgs"_id: transformFnArgs(node, out); break; | ||
785 | case "SingleString"_id: transformSingleString(node, out); break; | ||
786 | case "DoubleString"_id: transformDoubleString(node, out); break; | ||
787 | case "LuaString"_id: transformLuaString(node, out); break; | ||
788 | default: break; | ||
789 | } | ||
790 | }); | ||
791 | } | ||
792 | |||
793 | void transformFnArgs(ast_node* fnArgs, std::vector<std::string>& out) { | ||
794 | std::vector<std::string> temp; | ||
795 | fnArgs->eachChild([&](ast_node* node) { | ||
796 | switch (node->getId()) { | ||
797 | case "Exp"_id: transformExp(node, temp); break; | ||
798 | default: break; | ||
799 | } | ||
800 | }); | ||
801 | std::string args = join(temp, ", "); | ||
802 | out.push_back(args.empty() ? "()" : s("(") + args + ")"); | ||
803 | } | ||
804 | |||
805 | void transformColonChain(ast_node* colonChain, std::vector<std::string>& out) { | ||
806 | std::vector<std::string> temp; | ||
807 | colonChain->eachChild([&](ast_node* node) { | ||
808 | switch (node->getId()) { | ||
809 | case "ColonChainItem"_id: | ||
810 | temp.push_back(s(":"sv) + toString(node->getChild(0))); | ||
811 | break; | ||
812 | case "invoke_chain"_id: transform_invoke_chain(node, temp); break; | ||
813 | default: break; | ||
814 | } | ||
815 | }); | ||
816 | out.push_back(join(temp)); | ||
817 | } | ||
818 | |||
819 | void transform_invoke_chain(ast_node* invoke_chain, std::vector<std::string>& out) { | ||
820 | std::vector<std::string> temp; | ||
821 | invoke_chain->eachChild([&](ast_node* node) { | ||
822 | switch (node->getId()) { | ||
823 | case "Invoke"_id: transformInvoke(node, temp); break; | ||
824 | case "ChainItems"_id: transformChainItems(node, temp); break; | ||
825 | default: break; | ||
826 | } | ||
827 | }); | ||
828 | out.push_back(join(temp)); | ||
829 | } | ||
830 | |||
831 | void transformUpdate(ast_node* node, std::vector<std::string>& out) {noop(node, out);} | ||
832 | |||
833 | void transformImport(ast_node* node, std::vector<std::string>& out) {noopnl(node, out);} | ||
834 | void transformWhile(ast_node* node, std::vector<std::string>& out) {noopnl(node, out);} | ||
835 | void transformWith(ast_node* node, std::vector<std::string>& out) {noopnl(node, out);} | ||
836 | void transformIf(ast_node* node, std::vector<std::string>& out) {noopnl(node, out);} | ||
837 | void transformFor(ast_node* node, std::vector<std::string>& out) {noopnl(node, out);} | ||
838 | void transformForEach(ast_node* node, std::vector<std::string>& out) {noopnl(node, out);} | ||
839 | void transformSwitch(ast_node* node, std::vector<std::string>& out) {noopnl(node, out);} | ||
840 | void transformReturn(ast_node* node, std::vector<std::string>& out) {noopnl(node, out);} | ||
841 | void transformTableBlock(ast_node* node, std::vector<std::string>& out) {noopnl(node, out);} | ||
842 | void transformLocal(ast_node* node, std::vector<std::string>& out) {noopnl(node, out);} | ||
843 | void transformExport(ast_node* node, std::vector<std::string>& out) {noopnl(node, out);} | ||
844 | void transformBreakLoop(ast_node* node, std::vector<std::string>& out) {noopnl(node, out);} | ||
845 | void transform_unless_line(ast_node* node, std::vector<std::string>& out) {noop(node, out);} | ||
846 | void transformCompInner(ast_node* node, std::vector<std::string>& out) {noop(node, out);} | ||
847 | void transform_simple_table(ast_node* node, std::vector<std::string>& out) {noop(node, out);} | ||
848 | void transformString(ast_node* node, std::vector<std::string>& out) {noop(node, out);} | ||
849 | void transformInvokeArgs(ast_node* node, std::vector<std::string>& out) {noop(node, out);} | ||
850 | void transformName(ast_node* node, std::vector<std::string>& out) {noop(node, out);} | ||
851 | void transformSelfName(ast_node* node, std::vector<std::string>& out) {noop(node, out);} | ||
852 | void transform_const_value(ast_node* node, std::vector<std::string>& out) {noop(node, out);} | ||
853 | void transformClassDecl(ast_node* node, std::vector<std::string>& out) {noop(node, out);} | ||
854 | void transformDo(ast_node* node, std::vector<std::string>& out) {noop(node, out);} | ||
855 | void transform_unary_exp(ast_node* node, std::vector<std::string>& out) {noop(node, out);} | ||
856 | void transformTblComprehension(ast_node* node, std::vector<std::string>& out) {noop(node, out);} | ||
857 | void transformTableLit(ast_node* node, std::vector<std::string>& out) {noop(node, out);} | ||
858 | void transformComprehension(ast_node* node, std::vector<std::string>& out) {noop(node, out);} | ||
859 | void transformNum(ast_node* node, std::vector<std::string>& out) {noop(node, out);} | ||
860 | void transformVarArg(ast_node* node, std::vector<std::string>& out) {noop(node, out);} | ||
861 | void transformBinaryOperator(ast_node* node, std::vector<std::string>& out) {noop(node, out);} | ||
862 | void transform_chain_item(ast_node* node, std::vector<std::string>& out) {noop(node, out);} | ||
863 | void transform_chain_dot_chain(ast_node* node, std::vector<std::string>& out) {noop(node, out);} | ||
864 | void transformSlice(ast_node* node, std::vector<std::string>& out) {noop(node, out);} | ||
865 | void transformSingleString(ast_node* node, std::vector<std::string>& out) {noop(node, out);} | ||
866 | void transformDoubleString(ast_node* node, std::vector<std::string>& out) {noop(node, out);} | ||
867 | void transformLuaString(ast_node* node, std::vector<std::string>& out) {noop(node, out);} | ||
868 | }; | ||
869 | |||
870 | const std::string MoonCompliler::Empty; | ||
871 | |||
872 | int main() | ||
873 | { | ||
874 | std::string s = R"TestCodesHere(a = 998 | ||
875 | f, d = (-> | ||
876 | joop = 2302 + 567 | ||
877 | |||
878 | (hi, a, b = Vec2(100,200), c, d, ... using nil) -> | ||
879 | d = "䏿–‡" | ||
880 | hi = 1021 | ||
881 | |||
882 | a,b,c,d = 1,2,3,4 | ||
883 | |||
884 | hello[232], (5+5)[121], hello, x[99] = 100, 200, 300 | ||
885 | |||
886 | joop = 12), 123 if true else print("a",1,2)\abc(998).x | ||
887 | |||
888 | a, b = if hello | ||
889 | "hello" | ||
890 | else | ||
891 | "nothing", "yeah" | ||
892 | |||
893 | |||
894 | a, b = if hello | ||
895 | if yeah then "one", "two" else "mmhh" | ||
896 | else | ||
897 | print "the other" | ||
898 | "nothing", "yeah")TestCodesHere"; | ||
899 | |||
900 | MoonCompliler{}.complile(s); | ||
901 | |||
192 | return 0; | 902 | return 0; |
193 | } | 903 | } |
diff --git a/MoonParser/moon_ast.h b/MoonParser/moon_ast.h index 4511b1b..9eab2f9 100644 --- a/MoonParser/moon_ast.h +++ b/MoonParser/moon_ast.h | |||
@@ -2,7 +2,19 @@ | |||
2 | 2 | ||
3 | #include "moon_parser.h" | 3 | #include "moon_parser.h" |
4 | 4 | ||
5 | input& trim(input& s); | 5 | template <typename T> |
6 | std::basic_string<T>& trim(std::basic_string<T>& s) | ||
7 | { | ||
8 | s.erase(s.begin(), std::find_if(s.begin(), s.end(), [](T ch) | ||
9 | { | ||
10 | return !std::isspace(ch); | ||
11 | })); | ||
12 | s.erase(std::find_if(s.rbegin(), s.rend(), [](T ch) | ||
13 | { | ||
14 | return !std::isspace(ch); | ||
15 | }).base(), s.end()); | ||
16 | return s; | ||
17 | } | ||
6 | 18 | ||
7 | class AstLeaf : public ast_node | 19 | class AstLeaf : public ast_node |
8 | { | 20 | { |
@@ -12,137 +24,139 @@ private: | |||
12 | input _value; | 24 | input _value; |
13 | }; | 25 | }; |
14 | 26 | ||
15 | #define AST_LEAF(type) \ | 27 | #define AST_LEAF(type, id) \ |
16 | extern rule type; \ | 28 | extern rule type; \ |
17 | class type##_t : public AstLeaf \ | 29 | class type##_t : public AstLeaf \ |
18 | { \ | 30 | { \ |
19 | public: \ | 31 | public: \ |
20 | virtual int get_type() override { return ast_type<type##_t>(); } \ | 32 | virtual int get_type() override { return ast_type<type##_t>(); } \ |
33 | virtual size_t getId() const override { return id; } \ | ||
21 | virtual const char* getName() const override { return #type; } | 34 | virtual const char* getName() const override { return #type; } |
22 | 35 | ||
23 | #define AST_NODE(type) \ | 36 | #define AST_NODE(type, id) \ |
24 | extern rule type; \ | 37 | extern rule type; \ |
25 | class type##_t : public ast_container \ | 38 | class type##_t : public ast_container \ |
26 | { \ | 39 | { \ |
27 | public: \ | 40 | public: \ |
28 | virtual int get_type() override { return ast_type<type##_t>(); } \ | 41 | virtual int get_type() override { return ast_type<type##_t>(); } \ |
42 | virtual size_t getId() const override { return id; } \ | ||
29 | virtual const char* getName() const override { return #type; } | 43 | virtual const char* getName() const override { return #type; } |
30 | 44 | ||
31 | #define AST_END(type) \ | 45 | #define AST_END(type) \ |
32 | }; | 46 | }; |
33 | 47 | ||
34 | AST_LEAF(Num) | 48 | AST_LEAF(Num, "Num"_id) |
35 | AST_END(Num) | 49 | AST_END(Num) |
36 | 50 | ||
37 | AST_LEAF(_Name) | 51 | AST_LEAF(_Name, "_Name"_id) |
38 | AST_END(_Name) | 52 | AST_END(_Name) |
39 | 53 | ||
40 | AST_NODE(Name) | 54 | AST_NODE(Name, "Name"_id) |
41 | ast_ptr<_Name_t> name; | 55 | ast_ptr<_Name_t> name; |
42 | AST_END(Name) | 56 | AST_END(Name) |
43 | 57 | ||
44 | AST_LEAF(self) | 58 | AST_LEAF(self, "self"_id) |
45 | AST_END(self) | 59 | AST_END(self) |
46 | 60 | ||
47 | AST_NODE(self_name) | 61 | AST_NODE(self_name, "self_name"_id) |
48 | ast_ptr<_Name_t> name; | 62 | ast_ptr<_Name_t> name; |
49 | AST_END(self_name) | 63 | AST_END(self_name) |
50 | 64 | ||
51 | AST_LEAF(self_class) | 65 | AST_LEAF(self_class, "self_class"_id) |
52 | AST_END(self_class) | 66 | AST_END(self_class) |
53 | 67 | ||
54 | AST_NODE(self_class_name) | 68 | AST_NODE(self_class_name, "self_class_name"_id) |
55 | ast_ptr<_Name_t> name; | 69 | ast_ptr<_Name_t> name; |
56 | AST_END(self_class_name) | 70 | AST_END(self_class_name) |
57 | 71 | ||
58 | AST_NODE(SelfName) | 72 | AST_NODE(SelfName, "SelfName"_id) |
59 | ast_ptr<ast_node> name; // self_class_name_t | self_class_t | self_name_t | self_t | 73 | ast_ptr<ast_node> name; // self_class_name_t | self_class_t | self_name_t | self_t |
60 | AST_END(SelfName) | 74 | AST_END(SelfName) |
61 | 75 | ||
62 | AST_NODE(KeyName) | 76 | AST_NODE(KeyName, "KeyName"_id) |
63 | ast_ptr<ast_node> name; // SelfName_t | _Name_t | 77 | ast_ptr<ast_node> name; // SelfName_t | _Name_t |
64 | AST_END(KeyName) | 78 | AST_END(KeyName) |
65 | 79 | ||
66 | AST_LEAF(VarArg) | 80 | AST_LEAF(VarArg, "VarArg"_id) |
67 | AST_END(VarArg) | 81 | AST_END(VarArg) |
68 | 82 | ||
69 | AST_LEAF(local_flag) | 83 | AST_LEAF(local_flag, "local_flag"_id) |
70 | AST_END(local_flag) | 84 | AST_END(local_flag) |
71 | 85 | ||
72 | AST_LEAF(Seperator) | 86 | AST_LEAF(Seperator, "Seperator"_id) |
73 | AST_END(Seperator) | 87 | AST_END(Seperator) |
74 | 88 | ||
75 | AST_NODE(NameList) | 89 | AST_NODE(NameList, "NameList"_id) |
76 | ast_ptr<Seperator_t> sep; | 90 | ast_ptr<Seperator_t> sep; |
77 | ast_list<Name_t> names; | 91 | ast_list<Name_t> names; |
78 | AST_END(NameList) | 92 | AST_END(NameList) |
79 | 93 | ||
80 | AST_NODE(Local) | 94 | AST_NODE(Local, "Local"_id) |
81 | ast_ptr<ast_node> name; // local_flag_t | NameList_t | 95 | ast_ptr<ast_node> name; // local_flag_t | NameList_t |
82 | AST_END(Local) | 96 | AST_END(Local) |
83 | 97 | ||
84 | AST_NODE(colon_import_name) | 98 | AST_NODE(colon_import_name, "colon_import_name"_id) |
85 | ast_ptr<Name_t> name; | 99 | ast_ptr<Name_t> name; |
86 | AST_END(colon_import_name) | 100 | AST_END(colon_import_name) |
87 | 101 | ||
88 | class Exp_t; | 102 | class Exp_t; |
89 | 103 | ||
90 | AST_NODE(ImportName) | 104 | AST_NODE(ImportName, "ImportName"_id) |
91 | ast_ptr<ast_node> name; // colon_import_name_t | Name_t | 105 | ast_ptr<ast_node> name; // colon_import_name_t | Name_t |
92 | AST_END(ImportName) | 106 | AST_END(ImportName) |
93 | 107 | ||
94 | AST_NODE(Import) | 108 | AST_NODE(Import, "Import"_id) |
95 | ast_ptr<Seperator_t> sep; | 109 | ast_ptr<Seperator_t> sep; |
96 | ast_list<ImportName_t> names; | 110 | ast_list<ImportName_t> names; |
97 | ast_ptr<Exp_t> exp; | 111 | ast_ptr<Exp_t> exp; |
98 | AST_END(Import) | 112 | AST_END(Import) |
99 | 113 | ||
100 | AST_NODE(ExpListLow) | 114 | AST_NODE(ExpListLow, "ExpListLow"_id) |
101 | ast_ptr<Seperator_t> sep; | 115 | ast_ptr<Seperator_t> sep; |
102 | ast_list<Exp_t> exprs; | 116 | ast_list<Exp_t> exprs; |
103 | AST_END(ExpListLow) | 117 | AST_END(ExpListLow) |
104 | 118 | ||
105 | AST_NODE(ExpList) | 119 | AST_NODE(ExpList, "ExpList"_id) |
106 | ast_ptr<Seperator_t> sep; | 120 | ast_ptr<Seperator_t> sep; |
107 | ast_list<Exp_t> exprs; | 121 | ast_list<Exp_t> exprs; |
108 | AST_END(ExpList) | 122 | AST_END(ExpList) |
109 | 123 | ||
110 | AST_NODE(Return) | 124 | AST_NODE(Return, "Return"_id) |
111 | ast_ptr<ExpListLow_t, true> valueList; | 125 | ast_ptr<ExpListLow_t, true> valueList; |
112 | AST_END(Return) | 126 | AST_END(Return) |
113 | 127 | ||
114 | class Assign_t; | 128 | class Assign_t; |
115 | class Body_t; | 129 | class Body_t; |
116 | 130 | ||
117 | AST_NODE(With) | 131 | AST_NODE(With, "With"_id) |
118 | ast_ptr<ExpList_t> valueList; | 132 | ast_ptr<ExpList_t> valueList; |
119 | ast_ptr<Assign_t, true> assigns; | 133 | ast_ptr<Assign_t, true> assigns; |
120 | ast_ptr<Body_t> body; | 134 | ast_ptr<Body_t> body; |
121 | AST_END(With) | 135 | AST_END(With) |
122 | 136 | ||
123 | AST_NODE(SwitchCase) | 137 | AST_NODE(SwitchCase, "SwitchCase"_id) |
124 | ast_ptr<ExpList_t> valueList; | 138 | ast_ptr<ExpList_t> valueList; |
125 | ast_ptr<Body_t> body; | 139 | ast_ptr<Body_t> body; |
126 | AST_END(SwitchCase) | 140 | AST_END(SwitchCase) |
127 | 141 | ||
128 | AST_NODE(Switch) | 142 | AST_NODE(Switch, "Switch"_id) |
129 | ast_ptr<Exp_t> target; | 143 | ast_ptr<Exp_t> target; |
130 | ast_ptr<Seperator_t> sep; | 144 | ast_ptr<Seperator_t> sep; |
131 | ast_list<SwitchCase_t> branches; | 145 | ast_list<SwitchCase_t> branches; |
132 | ast_ptr<Body_t, true> lastBranch; | 146 | ast_ptr<Body_t, true> lastBranch; |
133 | AST_END(Switch) | 147 | AST_END(Switch) |
134 | 148 | ||
135 | AST_NODE(IfCond) | 149 | AST_NODE(IfCond, "IfCond"_id) |
136 | ast_ptr<Exp_t> condition; | 150 | ast_ptr<Exp_t> condition; |
137 | ast_ptr<Assign_t, true> assign; | 151 | ast_ptr<Assign_t, true> assign; |
138 | AST_END(IfCond) | 152 | AST_END(IfCond) |
139 | 153 | ||
140 | AST_NODE(IfElseIf) | 154 | AST_NODE(IfElseIf, "IfElseIf"_id) |
141 | ast_ptr<IfCond_t> condition; | 155 | ast_ptr<IfCond_t> condition; |
142 | ast_ptr<Body_t> body; | 156 | ast_ptr<Body_t> body; |
143 | AST_END(IfElseIf) | 157 | AST_END(IfElseIf) |
144 | 158 | ||
145 | AST_NODE(If) | 159 | AST_NODE(If, "If"_id) |
146 | ast_ptr<IfCond_t> firstCondition; | 160 | ast_ptr<IfCond_t> firstCondition; |
147 | ast_ptr<Body_t> firstBody; | 161 | ast_ptr<Body_t> firstBody; |
148 | ast_ptr<Seperator_t> sep; | 162 | ast_ptr<Seperator_t> sep; |
@@ -150,7 +164,7 @@ AST_NODE(If) | |||
150 | ast_ptr<Body_t, true> lastBranch; | 164 | ast_ptr<Body_t, true> lastBranch; |
151 | AST_END(If) | 165 | AST_END(If) |
152 | 166 | ||
153 | AST_NODE(Unless) | 167 | AST_NODE(Unless, "Unless"_id) |
154 | ast_ptr<IfCond_t> firstCondition; | 168 | ast_ptr<IfCond_t> firstCondition; |
155 | ast_ptr<Body_t> firstBody; | 169 | ast_ptr<Body_t> firstBody; |
156 | ast_ptr<Seperator_t> sep; | 170 | ast_ptr<Seperator_t> sep; |
@@ -158,16 +172,16 @@ AST_NODE(Unless) | |||
158 | ast_ptr<Body_t, true> lastBranch; | 172 | ast_ptr<Body_t, true> lastBranch; |
159 | AST_END(Unless) | 173 | AST_END(Unless) |
160 | 174 | ||
161 | AST_NODE(While) | 175 | AST_NODE(While, "While"_id) |
162 | ast_ptr<Exp_t> condition; | 176 | ast_ptr<Exp_t> condition; |
163 | ast_ptr<Body_t> body; | 177 | ast_ptr<Body_t> body; |
164 | AST_END(While) | 178 | AST_END(While) |
165 | 179 | ||
166 | AST_NODE(for_step_value) | 180 | AST_NODE(for_step_value, "for_step_value"_id) |
167 | ast_ptr<Exp_t> value; | 181 | ast_ptr<Exp_t> value; |
168 | AST_END(for_step_value) | 182 | AST_END(for_step_value) |
169 | 183 | ||
170 | AST_NODE(For) | 184 | AST_NODE(For, "For"_id) |
171 | ast_ptr<Name_t> varName; | 185 | ast_ptr<Name_t> varName; |
172 | ast_ptr<Exp_t> startValue; | 186 | ast_ptr<Exp_t> startValue; |
173 | ast_ptr<Exp_t> stopValue; | 187 | ast_ptr<Exp_t> stopValue; |
@@ -177,54 +191,54 @@ AST_END(For) | |||
177 | 191 | ||
178 | class AssignableNameList_t; | 192 | class AssignableNameList_t; |
179 | 193 | ||
180 | AST_NODE(ForEach) | 194 | AST_NODE(ForEach, "ForEach"_id) |
181 | ast_ptr<AssignableNameList_t> nameList; | 195 | ast_ptr<AssignableNameList_t> nameList; |
182 | ast_ptr<ast_node> loopValue; // Exp_t | ExpList_t | 196 | ast_ptr<ast_node> loopValue; // Exp_t | ExpList_t |
183 | ast_ptr<Body_t> body; | 197 | ast_ptr<Body_t> body; |
184 | AST_END(ForEach) | 198 | AST_END(ForEach) |
185 | 199 | ||
186 | AST_NODE(Do) | 200 | AST_NODE(Do, "Do"_id) |
187 | ast_ptr<Body_t> body; | 201 | ast_ptr<Body_t> body; |
188 | AST_END(Do) | 202 | AST_END(Do) |
189 | 203 | ||
190 | class CompInner_t; | 204 | class CompInner_t; |
191 | 205 | ||
192 | AST_NODE(Comprehension) | 206 | AST_NODE(Comprehension, "Comprehension"_id) |
193 | ast_ptr<Exp_t> value; | 207 | ast_ptr<Exp_t> value; |
194 | ast_ptr<CompInner_t> forLoop; | 208 | ast_ptr<CompInner_t> forLoop; |
195 | AST_END(Comprehension) | 209 | AST_END(Comprehension) |
196 | 210 | ||
197 | AST_NODE(comp_value) | 211 | AST_NODE(comp_value, "comp_value"_id) |
198 | ast_ptr<Exp_t> value; | 212 | ast_ptr<Exp_t> value; |
199 | AST_END(comp_value) | 213 | AST_END(comp_value) |
200 | 214 | ||
201 | AST_NODE(TblComprehension) | 215 | AST_NODE(TblComprehension, "TblComprehension"_id) |
202 | ast_ptr<Exp_t> key; | 216 | ast_ptr<Exp_t> key; |
203 | ast_ptr<comp_value_t, true> value; | 217 | ast_ptr<comp_value_t, true> value; |
204 | ast_ptr<CompInner_t> forLoop; | 218 | ast_ptr<CompInner_t> forLoop; |
205 | AST_END(TblComprehension) | 219 | AST_END(TblComprehension) |
206 | 220 | ||
207 | AST_NODE(star_exp) | 221 | AST_NODE(star_exp, "star_exp"_id) |
208 | ast_ptr<Exp_t> value; | 222 | ast_ptr<Exp_t> value; |
209 | AST_END(star_exp) | 223 | AST_END(star_exp) |
210 | 224 | ||
211 | AST_NODE(CompForEach) | 225 | AST_NODE(CompForEach, "CompForEach"_id) |
212 | ast_ptr<AssignableNameList_t> nameList; | 226 | ast_ptr<AssignableNameList_t> nameList; |
213 | ast_ptr<ast_node> loopValue; // star_exp_t | Exp_t | 227 | ast_ptr<ast_node> loopValue; // star_exp_t | Exp_t |
214 | AST_END(CompForEach) | 228 | AST_END(CompForEach) |
215 | 229 | ||
216 | AST_NODE(CompFor) | 230 | AST_NODE(CompFor, "CompFor"_id) |
217 | ast_ptr<Name_t> varName; | 231 | ast_ptr<Name_t> varName; |
218 | ast_ptr<Exp_t> startValue; | 232 | ast_ptr<Exp_t> startValue; |
219 | ast_ptr<Exp_t> stopValue; | 233 | ast_ptr<Exp_t> stopValue; |
220 | ast_ptr<for_step_value_t, true> stepValue; | 234 | ast_ptr<for_step_value_t, true> stepValue; |
221 | AST_END(CompFor) | 235 | AST_END(CompFor) |
222 | 236 | ||
223 | AST_NODE(CompClause) | 237 | AST_NODE(CompClause, "CompClause"_id) |
224 | ast_ptr<ast_node> nestExp; // CompFor_t | CompForEach_t | Exp_t | 238 | ast_ptr<ast_node> nestExp; // CompFor_t | CompForEach_t | Exp_t |
225 | AST_END(CompClause) | 239 | AST_END(CompClause) |
226 | 240 | ||
227 | AST_NODE(CompInner) | 241 | AST_NODE(CompInner, "CompInner"_id) |
228 | ast_ptr<ast_node> compFor; // CompFor_t | CompForEach_t | 242 | ast_ptr<ast_node> compFor; // CompFor_t | CompForEach_t |
229 | ast_ptr<Seperator_t> sep; | 243 | ast_ptr<Seperator_t> sep; |
230 | ast_list<CompClause_t> clauses; | 244 | ast_list<CompClause_t> clauses; |
@@ -232,60 +246,60 @@ AST_END(CompInner) | |||
232 | 246 | ||
233 | class TableBlock_t; | 247 | class TableBlock_t; |
234 | 248 | ||
235 | AST_NODE(Assign) | 249 | AST_NODE(Assign, "Assign"_id) |
236 | ast_ptr<ast_node> value; // With_t | If_t | Switch_t | TableBlock_t | ExpListLow_t | 250 | ast_ptr<ast_node> value; // With_t | If_t | Switch_t | TableBlock_t | ExpListLow_t |
237 | AST_END(Assign) | 251 | AST_END(Assign) |
238 | 252 | ||
239 | AST_LEAF(update_op) | 253 | AST_LEAF(update_op, "update_op"_id) |
240 | AST_END(update_op) | 254 | AST_END(update_op) |
241 | 255 | ||
242 | AST_NODE(Update) | 256 | AST_NODE(Update, "Update"_id) |
243 | ast_ptr<update_op_t> op; | 257 | ast_ptr<update_op_t> op; |
244 | ast_ptr<Exp_t> value; | 258 | ast_ptr<Exp_t> value; |
245 | AST_END(Update) | 259 | AST_END(Update) |
246 | 260 | ||
247 | AST_LEAF(BinaryOperator) | 261 | AST_LEAF(BinaryOperator, "BinaryOperator"_id) |
248 | AST_END(BinaryOperator) | 262 | AST_END(BinaryOperator) |
249 | 263 | ||
250 | class Chain_t; | 264 | class Chain_t; |
251 | 265 | ||
252 | AST_NODE(Assignable) | 266 | AST_NODE(Assignable, "Assignable"_id) |
253 | ast_ptr<ast_node> item; // Chain_t | Name_t | SelfName_t | 267 | ast_ptr<ast_node> item; // Chain_t | Name_t | SelfName_t |
254 | AST_END(Assignable) | 268 | AST_END(Assignable) |
255 | 269 | ||
256 | class Value_t; | 270 | class Value_t; |
257 | 271 | ||
258 | AST_NODE(exp_op_value) | 272 | AST_NODE(exp_op_value, "exp_op_value"_id) |
259 | ast_ptr<BinaryOperator_t> op; | 273 | ast_ptr<BinaryOperator_t> op; |
260 | ast_ptr<Value_t> value; | 274 | ast_ptr<Value_t> value; |
261 | AST_END(exp_op_value) | 275 | AST_END(exp_op_value) |
262 | 276 | ||
263 | AST_NODE(Exp) | 277 | AST_NODE(Exp, "Exp"_id) |
264 | ast_ptr<Value_t> value; | 278 | ast_ptr<Value_t> value; |
265 | ast_list<exp_op_value_t> opValues; | 279 | ast_list<exp_op_value_t> opValues; |
266 | AST_END(Exp) | 280 | AST_END(Exp) |
267 | 281 | ||
268 | AST_NODE(Callable) | 282 | AST_NODE(Callable, "Callable"_id) |
269 | ast_ptr<ast_node> item; // Name_t | SelfName_t | VarArg_t | Parens_t | 283 | ast_ptr<ast_node> item; // Name_t | SelfName_t | VarArg_t | Parens_t |
270 | AST_END(Callable) | 284 | AST_END(Callable) |
271 | 285 | ||
272 | class InvokeArgs_t; | 286 | class InvokeArgs_t; |
273 | 287 | ||
274 | AST_NODE(ChainValue) | 288 | AST_NODE(ChainValue, "ChainValue"_id) |
275 | ast_ptr<ast_node> caller; // Chain_t | Callable_t | 289 | ast_ptr<ast_node> caller; // Chain_t | Callable_t |
276 | ast_ptr<InvokeArgs_t, true> arguments; | 290 | ast_ptr<InvokeArgs_t, true> arguments; |
277 | AST_END(ChainValue) | 291 | AST_END(ChainValue) |
278 | 292 | ||
279 | class KeyValue_t; | 293 | class KeyValue_t; |
280 | 294 | ||
281 | AST_NODE(simple_table) | 295 | AST_NODE(simple_table, "simple_table"_id) |
282 | ast_ptr<Seperator_t> sep; | 296 | ast_ptr<Seperator_t> sep; |
283 | ast_list<KeyValue_t> pairs; | 297 | ast_list<KeyValue_t> pairs; |
284 | AST_END(simple_table) | 298 | AST_END(simple_table) |
285 | 299 | ||
286 | class String_t; | 300 | class String_t; |
287 | 301 | ||
288 | AST_NODE(SimpleValue) | 302 | AST_NODE(SimpleValue, "SimpleValue"_id) |
289 | ast_ptr<ast_node> value; /* | 303 | ast_ptr<ast_node> value; /* |
290 | const_value_t | | 304 | const_value_t | |
291 | If_t | Unless_t | Switch_t | With_t | ClassDecl_t | ForEach_t | For_t | While_t | Do_t | | 305 | If_t | Unless_t | Switch_t | With_t | ClassDecl_t | ForEach_t | For_t | While_t | Do_t | |
@@ -294,65 +308,65 @@ AST_NODE(SimpleValue) | |||
294 | */ | 308 | */ |
295 | AST_END(SimpleValue) | 309 | AST_END(SimpleValue) |
296 | 310 | ||
297 | AST_NODE(Chain) | 311 | AST_NODE(Chain, "Chain"_id) |
298 | ast_ptr<ast_node> item; // chain_call_t | chain_item_t | chain_dot_chain_t | ColonChain_t | 312 | ast_ptr<ast_node> item; // chain_call_t | chain_item_t | chain_dot_chain_t | ColonChain_t |
299 | AST_END(Chain) | 313 | AST_END(Chain) |
300 | 314 | ||
301 | AST_NODE(Value) | 315 | AST_NODE(Value, "Value"_id) |
302 | ast_ptr<ast_node> item; // SimpleValue_t | simple_table_t | ChainValue_t | String_t | 316 | ast_ptr<ast_node> item; // SimpleValue_t | simple_table_t | ChainValue_t | String_t |
303 | AST_END(Value) | 317 | AST_END(Value) |
304 | 318 | ||
305 | AST_LEAF(LuaString) | 319 | AST_LEAF(LuaString, "LuaString"_id) |
306 | AST_END(LuaString) | 320 | AST_END(LuaString) |
307 | 321 | ||
308 | AST_LEAF(SingleString) | 322 | AST_LEAF(SingleString, "SingleString"_id) |
309 | AST_END(SingleString) | 323 | AST_END(SingleString) |
310 | 324 | ||
311 | AST_LEAF(double_string_inner) | 325 | AST_LEAF(double_string_inner, "double_string_inner"_id) |
312 | AST_END(double_string_inner) | 326 | AST_END(double_string_inner) |
313 | 327 | ||
314 | AST_NODE(double_string_content) | 328 | AST_NODE(double_string_content, "double_string_content"_id) |
315 | ast_ptr<ast_node> content; // double_string_inner_t | Exp_t | 329 | ast_ptr<ast_node> content; // double_string_inner_t | Exp_t |
316 | AST_END(double_string_content) | 330 | AST_END(double_string_content) |
317 | 331 | ||
318 | AST_NODE(DoubleString) | 332 | AST_NODE(DoubleString, "DoubleString"_id) |
319 | ast_ptr<Seperator_t> sep; | 333 | ast_ptr<Seperator_t> sep; |
320 | ast_list<double_string_content_t> segments; | 334 | ast_list<double_string_content_t> segments; |
321 | AST_END(DoubleString) | 335 | AST_END(DoubleString) |
322 | 336 | ||
323 | AST_NODE(String) | 337 | AST_NODE(String, "String"_id) |
324 | ast_ptr<ast_node> str; // DoubleString_t | SingleString_t | LuaString_t | 338 | ast_ptr<ast_node> str; // DoubleString_t | SingleString_t | LuaString_t |
325 | AST_END(String) | 339 | AST_END(String) |
326 | 340 | ||
327 | AST_NODE(Parens) | 341 | AST_NODE(Parens, "Parens"_id) |
328 | ast_ptr<Exp_t> expr; | 342 | ast_ptr<Exp_t> expr; |
329 | AST_END(Parens) | 343 | AST_END(Parens) |
330 | 344 | ||
331 | AST_NODE(FnArgs) | 345 | AST_NODE(FnArgs, "FnArgs"_id) |
332 | ast_ptr<Seperator_t> sep; | 346 | ast_ptr<Seperator_t> sep; |
333 | ast_list<Exp_t> args; | 347 | ast_list<Exp_t> args; |
334 | AST_END(FnArgs) | 348 | AST_END(FnArgs) |
335 | 349 | ||
336 | class ChainItems_t; | 350 | class ChainItems_t; |
337 | 351 | ||
338 | AST_NODE(chain_call) | 352 | AST_NODE(chain_call, "chain_call"_id) |
339 | ast_ptr<ast_node> caller; // Callable_t | String_t | 353 | ast_ptr<ast_node> caller; // Callable_t | String_t |
340 | ast_ptr<ChainItems_t> chain; | 354 | ast_ptr<ChainItems_t> chain; |
341 | AST_END(chain_call) | 355 | AST_END(chain_call) |
342 | 356 | ||
343 | AST_NODE(chain_item) | 357 | AST_NODE(chain_item, "chain_item"_id) |
344 | ast_ptr<ChainItems_t> chain; | 358 | ast_ptr<ChainItems_t> chain; |
345 | AST_END(chain_item) | 359 | AST_END(chain_item) |
346 | 360 | ||
347 | AST_NODE(DotChainItem) | 361 | AST_NODE(DotChainItem, "DotChainItem"_id) |
348 | ast_ptr<_Name_t> name; | 362 | ast_ptr<_Name_t> name; |
349 | AST_END(DotChainItem) | 363 | AST_END(DotChainItem) |
350 | 364 | ||
351 | AST_NODE(ColonChainItem) | 365 | AST_NODE(ColonChainItem, "ColonChainItem"_id) |
352 | ast_ptr<_Name_t> name; | 366 | ast_ptr<_Name_t> name; |
353 | AST_END(ColonChainItem) | 367 | AST_END(ColonChainItem) |
354 | 368 | ||
355 | AST_NODE(chain_dot_chain) | 369 | AST_NODE(chain_dot_chain, "chain_dot_chain"_id) |
356 | ast_ptr<DotChainItem_t> caller; | 370 | ast_ptr<DotChainItem_t> caller; |
357 | ast_ptr<ChainItems_t, true> chain; | 371 | ast_ptr<ChainItems_t, true> chain; |
358 | AST_END(chain_dot_chain) | 372 | AST_END(chain_dot_chain) |
@@ -361,183 +375,183 @@ class ColonChain_t; | |||
361 | class Invoke_t; | 375 | class Invoke_t; |
362 | class Slice_t; | 376 | class Slice_t; |
363 | 377 | ||
364 | AST_NODE(ChainItem) | 378 | AST_NODE(ChainItem, "ChainItem"_id) |
365 | ast_ptr<ast_node> item; // Invoke_t | DotChainItem_t | Slice_t | [Exp_t] | 379 | ast_ptr<ast_node> item; // Invoke_t | DotChainItem_t | Slice_t | [Exp_t] |
366 | AST_END(ChainItem) | 380 | AST_END(ChainItem) |
367 | 381 | ||
368 | AST_NODE(ChainItems) | 382 | AST_NODE(ChainItems, "ChainItems"_id) |
369 | ast_ptr<Seperator_t> sep; | 383 | ast_ptr<Seperator_t> sep; |
370 | ast_list<ChainItem_t> simpleChain; | 384 | ast_list<ChainItem_t> simpleChain; |
371 | ast_ptr<ColonChain_t, true> colonChain; | 385 | ast_ptr<ColonChain_t, true> colonChain; |
372 | AST_END(ChainItems) | 386 | AST_END(ChainItems) |
373 | 387 | ||
374 | AST_NODE(invoke_chain) | 388 | AST_NODE(invoke_chain, "invoke_chain"_id) |
375 | ast_ptr<Invoke_t> invoke; | 389 | ast_ptr<Invoke_t> invoke; |
376 | ast_ptr<ChainItems_t, true> chain; | 390 | ast_ptr<ChainItems_t, true> chain; |
377 | AST_END(invoke_chain) | 391 | AST_END(invoke_chain) |
378 | 392 | ||
379 | AST_NODE(ColonChain) | 393 | AST_NODE(ColonChain, "ColonChain"_id) |
380 | ast_ptr<ColonChainItem_t> colonChain; | 394 | ast_ptr<ColonChainItem_t> colonChain; |
381 | ast_ptr<invoke_chain_t, true> invokeChain; | 395 | ast_ptr<invoke_chain_t, true> invokeChain; |
382 | AST_END(ColonChain) | 396 | AST_END(ColonChain) |
383 | 397 | ||
384 | AST_LEAF(default_value) | 398 | AST_LEAF(default_value, "default_value"_id) |
385 | AST_END(default_value) | 399 | AST_END(default_value) |
386 | 400 | ||
387 | AST_NODE(Slice) | 401 | AST_NODE(Slice, "Slice"_id) |
388 | ast_ptr<ast_node> startValue; // Exp_t | default_value_t | 402 | ast_ptr<ast_node> startValue; // Exp_t | default_value_t |
389 | ast_ptr<ast_node> stopValue; // Exp_t | default_value_t | 403 | ast_ptr<ast_node> stopValue; // Exp_t | default_value_t |
390 | ast_ptr<ast_node> stepValue; // Exp_t | default_value_t | 404 | ast_ptr<ast_node> stepValue; // Exp_t | default_value_t |
391 | AST_END(Slice) | 405 | AST_END(Slice) |
392 | 406 | ||
393 | AST_NODE(Invoke) | 407 | AST_NODE(Invoke, "Invoke"_id) |
394 | ast_ptr<ast_node> argument; // FnArgs_t | SingleString_t | DoubleString_t | LuaString_t | 408 | ast_ptr<ast_node> argument; // FnArgs_t | SingleString_t | DoubleString_t | LuaString_t |
395 | AST_END(Invoke) | 409 | AST_END(Invoke) |
396 | 410 | ||
397 | class KeyValue_t; | 411 | class KeyValue_t; |
398 | 412 | ||
399 | AST_NODE(TableValue) | 413 | AST_NODE(TableValue, "TableValue"_id) |
400 | ast_ptr<ast_node> value; // KeyValue_t | Exp_t | 414 | ast_ptr<ast_node> value; // KeyValue_t | Exp_t |
401 | AST_END(TableValue) | 415 | AST_END(TableValue) |
402 | 416 | ||
403 | AST_NODE(TableLit) | 417 | AST_NODE(TableLit, "TableLit"_id) |
404 | ast_ptr<Seperator_t> sep; | 418 | ast_ptr<Seperator_t> sep; |
405 | ast_list<TableValue_t> values; | 419 | ast_list<TableValue_t> values; |
406 | AST_END(TableLit) | 420 | AST_END(TableLit) |
407 | 421 | ||
408 | AST_NODE(TableBlock) | 422 | AST_NODE(TableBlock, "TableBlock"_id) |
409 | ast_ptr<Seperator_t> sep; | 423 | ast_ptr<Seperator_t> sep; |
410 | ast_list<KeyValue_t> values; | 424 | ast_list<KeyValue_t> values; |
411 | AST_END(TableBlock) | 425 | AST_END(TableBlock) |
412 | 426 | ||
413 | AST_NODE(class_member_list) | 427 | AST_NODE(class_member_list, "class_member_list"_id) |
414 | ast_ptr<Seperator_t> sep; | 428 | ast_ptr<Seperator_t> sep; |
415 | ast_list<KeyValue_t> values; | 429 | ast_list<KeyValue_t> values; |
416 | AST_END(class_member_list) | 430 | AST_END(class_member_list) |
417 | 431 | ||
418 | AST_NODE(ClassLine) | 432 | AST_NODE(ClassLine, "ClassLine"_id) |
419 | ast_ptr<ast_node> content; // class_member_list_t | Statement_t | Exp_t | 433 | ast_ptr<ast_node> content; // class_member_list_t | Statement_t | Exp_t |
420 | AST_END(ClassLine) | 434 | AST_END(ClassLine) |
421 | 435 | ||
422 | AST_NODE(ClassBlock) | 436 | AST_NODE(ClassBlock, "ClassBlock"_id) |
423 | ast_ptr<Seperator_t> sep; | 437 | ast_ptr<Seperator_t> sep; |
424 | ast_list<ClassLine_t> lines; | 438 | ast_list<ClassLine_t> lines; |
425 | AST_END(ClassBlock) | 439 | AST_END(ClassBlock) |
426 | 440 | ||
427 | AST_NODE(ClassDecl) | 441 | AST_NODE(ClassDecl, "ClassDecl"_id) |
428 | ast_ptr<Assignable_t, true> name; | 442 | ast_ptr<Assignable_t, true> name; |
429 | ast_ptr<Exp_t, true> extend; | 443 | ast_ptr<Exp_t, true> extend; |
430 | ast_ptr<ClassBlock_t, true> body; | 444 | ast_ptr<ClassBlock_t, true> body; |
431 | AST_END(ClassDecl) | 445 | AST_END(ClassDecl) |
432 | 446 | ||
433 | AST_NODE(export_values) | 447 | AST_NODE(export_values, "export_values"_id) |
434 | ast_ptr<NameList_t> nameList; | 448 | ast_ptr<NameList_t> nameList; |
435 | ast_ptr<ExpListLow_t, true> valueList; | 449 | ast_ptr<ExpListLow_t, true> valueList; |
436 | AST_END(export_values) | 450 | AST_END(export_values) |
437 | 451 | ||
438 | AST_LEAF(export_op) | 452 | AST_LEAF(export_op, "export_op"_id) |
439 | AST_END(export_op) | 453 | AST_END(export_op) |
440 | 454 | ||
441 | AST_NODE(Export) | 455 | AST_NODE(Export, "Export"_id) |
442 | ast_ptr<ast_node> item; // ClassDecl_t | export_op_t | export_values_t | 456 | ast_ptr<ast_node> item; // ClassDecl_t | export_op_t | export_values_t |
443 | AST_END(Export) | 457 | AST_END(Export) |
444 | 458 | ||
445 | AST_NODE(variable_pair) | 459 | AST_NODE(variable_pair, "variable_pair"_id) |
446 | ast_ptr<Name_t> name; | 460 | ast_ptr<Name_t> name; |
447 | AST_END(variable_pair) | 461 | AST_END(variable_pair) |
448 | 462 | ||
449 | AST_NODE(normal_pair) | 463 | AST_NODE(normal_pair, "normal_pair"_id) |
450 | ast_ptr<ast_node> key; // KeyName_t | [Exp_t] | DoubleString_t | SingleString_t | 464 | ast_ptr<ast_node> key; // KeyName_t | [Exp_t] | DoubleString_t | SingleString_t |
451 | ast_ptr<ast_node> value; // Exp_t | TableBlock_t | 465 | ast_ptr<ast_node> value; // Exp_t | TableBlock_t |
452 | AST_END(normal_pair) | 466 | AST_END(normal_pair) |
453 | 467 | ||
454 | AST_NODE(KeyValue) | 468 | AST_NODE(KeyValue, "KeyValue"_id) |
455 | ast_ptr<ast_node> item; // variable_pair_t | normal_pair_t | 469 | ast_ptr<ast_node> item; // variable_pair_t | normal_pair_t |
456 | AST_END(KeyValue) | 470 | AST_END(KeyValue) |
457 | 471 | ||
458 | AST_NODE(FnArgDef) | 472 | AST_NODE(FnArgDef, "FnArgDef"_id) |
459 | ast_ptr<ast_node> name; // Name_t | SelfName_t | 473 | ast_ptr<ast_node> name; // Name_t | SelfName_t |
460 | ast_ptr<Exp_t, true> defaultValue; | 474 | ast_ptr<Exp_t, true> defaultValue; |
461 | AST_END(FnArgDef) | 475 | AST_END(FnArgDef) |
462 | 476 | ||
463 | AST_NODE(FnArgDefList) | 477 | AST_NODE(FnArgDefList, "FnArgDefList"_id) |
464 | ast_ptr<Seperator_t> sep; | 478 | ast_ptr<Seperator_t> sep; |
465 | ast_list<FnArgDef_t> definitions; | 479 | ast_list<FnArgDef_t> definitions; |
466 | ast_ptr<VarArg_t, true> varArg; | 480 | ast_ptr<VarArg_t, true> varArg; |
467 | AST_END(FnArgDefList) | 481 | AST_END(FnArgDefList) |
468 | 482 | ||
469 | AST_NODE(outer_var_shadow) | 483 | AST_NODE(outer_var_shadow, "outer_var_shadow"_id) |
470 | ast_ptr<NameList_t, true> varList; | 484 | ast_ptr<NameList_t, true> varList; |
471 | AST_END(outer_var_shadow) | 485 | AST_END(outer_var_shadow) |
472 | 486 | ||
473 | AST_NODE(FnArgsDef) | 487 | AST_NODE(FnArgsDef, "FnArgsDef"_id) |
474 | ast_ptr<FnArgDefList_t, true> defList; | 488 | ast_ptr<FnArgDefList_t, true> defList; |
475 | ast_ptr<outer_var_shadow_t, true> shadowOption; | 489 | ast_ptr<outer_var_shadow_t, true> shadowOption; |
476 | AST_END(FnArgsDef) | 490 | AST_END(FnArgsDef) |
477 | 491 | ||
478 | AST_LEAF(fn_arrow) | 492 | AST_LEAF(fn_arrow, "fn_arrow"_id) |
479 | AST_END(fn_arrow) | 493 | AST_END(fn_arrow) |
480 | 494 | ||
481 | AST_NODE(FunLit) | 495 | AST_NODE(FunLit, "FunLit"_id) |
482 | ast_ptr<FnArgsDef_t, true> argsDef; | 496 | ast_ptr<FnArgsDef_t, true> argsDef; |
483 | ast_ptr<fn_arrow_t> arrow; | 497 | ast_ptr<fn_arrow_t> arrow; |
484 | ast_ptr<Body_t, true> body; | 498 | ast_ptr<Body_t, true> body; |
485 | AST_END(FunLit) | 499 | AST_END(FunLit) |
486 | 500 | ||
487 | AST_NODE(NameOrDestructure) | 501 | AST_NODE(NameOrDestructure, "NameOrDestructure"_id) |
488 | ast_ptr<ast_node> item; // Name_t | TableLit_t | 502 | ast_ptr<ast_node> item; // Name_t | TableLit_t |
489 | AST_END(NameOrDestructure) | 503 | AST_END(NameOrDestructure) |
490 | 504 | ||
491 | AST_NODE(AssignableNameList) | 505 | AST_NODE(AssignableNameList, "AssignableNameList"_id) |
492 | ast_ptr<Seperator_t> sep; | 506 | ast_ptr<Seperator_t> sep; |
493 | ast_list<NameOrDestructure_t> items; | 507 | ast_list<NameOrDestructure_t> items; |
494 | AST_END(AssignableNameList) | 508 | AST_END(AssignableNameList) |
495 | 509 | ||
496 | AST_NODE(ArgBlock) | 510 | AST_NODE(ArgBlock, "ArgBlock"_id) |
497 | ast_ptr<Seperator_t> sep; | 511 | ast_ptr<Seperator_t> sep; |
498 | ast_list<Exp_t> arguments; | 512 | ast_list<Exp_t> arguments; |
499 | AST_END(ArgBlock) | 513 | AST_END(ArgBlock) |
500 | 514 | ||
501 | AST_NODE(invoke_args_with_table) | 515 | AST_NODE(invoke_args_with_table, "invoke_args_with_table"_id) |
502 | ast_ptr<ArgBlock_t, true> argBlock; | 516 | ast_ptr<ArgBlock_t, true> argBlock; |
503 | ast_ptr<TableBlock_t, true> tableBlock; | 517 | ast_ptr<TableBlock_t, true> tableBlock; |
504 | AST_END(invoke_args_with_table) | 518 | AST_END(invoke_args_with_table) |
505 | 519 | ||
506 | AST_NODE(InvokeArgs) | 520 | AST_NODE(InvokeArgs, "InvokeArgs"_id) |
507 | ast_ptr<ExpList_t, true> argsList; | 521 | ast_ptr<ExpList_t, true> argsList; |
508 | ast_ptr<invoke_args_with_table_t, true> argsTableBlock; | 522 | ast_ptr<invoke_args_with_table_t, true> argsTableBlock; |
509 | ast_ptr<TableBlock_t, true> tableBlock; | 523 | ast_ptr<TableBlock_t, true> tableBlock; |
510 | AST_END(InvokeArgs) | 524 | AST_END(InvokeArgs) |
511 | 525 | ||
512 | AST_LEAF(const_value) | 526 | AST_LEAF(const_value, "const_value"_id) |
513 | AST_END(const_value) | 527 | AST_END(const_value) |
514 | 528 | ||
515 | AST_NODE(unary_exp) | 529 | AST_NODE(unary_exp, "unary_exp"_id) |
516 | ast_ptr<Exp_t> item; | 530 | ast_ptr<Exp_t> item; |
517 | AST_END(unary_exp) | 531 | AST_END(unary_exp) |
518 | 532 | ||
519 | AST_NODE(Assignment) | 533 | AST_NODE(Assignment, "Assignment"_id) |
520 | ast_ptr<ExpList_t> assignable; | 534 | ast_ptr<ExpList_t> assignable; |
521 | ast_ptr<ast_node> target; // Update_t | Assign_t | 535 | ast_ptr<ast_node> target; // Update_t | Assign_t |
522 | AST_END(Assignment) | 536 | AST_END(Assignment) |
523 | 537 | ||
524 | AST_NODE(if_else_line) | 538 | AST_NODE(if_else_line, "if_else_line"_id) |
525 | ast_ptr<Exp_t> condition; | 539 | ast_ptr<Exp_t> condition; |
526 | ast_ptr<ast_node> elseExpr; // Exp_t | default_value_t | 540 | ast_ptr<ast_node> elseExpr; // Exp_t | default_value_t |
527 | AST_END(if_else_line) | 541 | AST_END(if_else_line) |
528 | 542 | ||
529 | AST_NODE(unless_line) | 543 | AST_NODE(unless_line, "unless_line"_id) |
530 | ast_ptr<Exp_t> condition; | 544 | ast_ptr<Exp_t> condition; |
531 | AST_END(unless_line) | 545 | AST_END(unless_line) |
532 | 546 | ||
533 | AST_NODE(statement_appendix) | 547 | AST_NODE(statement_appendix, "statement_appendix"_id) |
534 | ast_ptr<ast_node> item; // if_else_line_t | unless_line_t | CompInner_t | 548 | ast_ptr<ast_node> item; // if_else_line_t | unless_line_t | CompInner_t |
535 | AST_END(statement_appendix) | 549 | AST_END(statement_appendix) |
536 | 550 | ||
537 | AST_LEAF(BreakLoop) | 551 | AST_LEAF(BreakLoop, "BreakLoop"_id) |
538 | AST_END(BreakLoop) | 552 | AST_END(BreakLoop) |
539 | 553 | ||
540 | AST_NODE(Statement) | 554 | AST_NODE(Statement, "Statement"_id) |
541 | ast_ptr<ast_node> content; /* | 555 | ast_ptr<ast_node> content; /* |
542 | Import_t | While_t | With_t | For_t | ForEach_t | | 556 | Import_t | While_t | With_t | For_t | ForEach_t | |
543 | Switch_t | Return_t | Local_t | Export_t | BreakLoop_t | | 557 | Switch_t | Return_t | Local_t | Export_t | BreakLoop_t | |
@@ -548,19 +562,19 @@ AST_END(Statement) | |||
548 | 562 | ||
549 | class Block_t; | 563 | class Block_t; |
550 | 564 | ||
551 | AST_NODE(Body) | 565 | AST_NODE(Body, "Body"_id) |
552 | ast_ptr<ast_node> content; // Block | Statement | 566 | ast_ptr<ast_node> content; // Block | Statement |
553 | AST_END(Body) | 567 | AST_END(Body) |
554 | 568 | ||
555 | AST_NODE(Line) | 569 | AST_NODE(Line, "Line"_id) |
556 | ast_ptr<Statement_t, true> statment; | 570 | ast_ptr<Statement_t, true> statment; |
557 | AST_END(Line) | 571 | AST_END(Line) |
558 | 572 | ||
559 | AST_NODE(Block) | 573 | AST_NODE(Block, "Block"_id) |
560 | ast_ptr<Seperator_t> sep; | 574 | ast_ptr<Seperator_t> sep; |
561 | ast_list<Line_t> lines; | 575 | ast_list<Line_t> lines; |
562 | AST_END(Block) | 576 | AST_END(Block) |
563 | 577 | ||
564 | AST_NODE(BlockEnd) | 578 | AST_NODE(BlockEnd, "BlockEnd"_id) |
565 | ast_ptr<Block_t> block; | 579 | ast_ptr<Block_t> block; |
566 | AST_END(BlockEnd) | 580 | AST_END(BlockEnd) |
diff --git a/MoonParser/moon_parser.h b/MoonParser/moon_parser.h index 0c3f427..bf618aa 100644 --- a/MoonParser/moon_parser.h +++ b/MoonParser/moon_parser.h | |||
@@ -26,6 +26,6 @@ struct State | |||
26 | "local", "not", "then", "return", "from", | 26 | "local", "not", "then", "return", "from", |
27 | "extends", "for", "do", "or", "export", | 27 | "extends", "for", "do", "or", "export", |
28 | "class", "in", "unless", "when", "elseif", | 28 | "class", "in", "unless", "when", "elseif", |
29 | "switch", "break", "if", "with", "import" | 29 | "switch", "break", "if", "with", "import", "true", "false", "nil" |
30 | }; | 30 | }; |
31 | }; | 31 | }; |
diff --git a/MoonParser/parser.hpp b/MoonParser/parser.hpp index 66d6067..cbabf06 100644 --- a/MoonParser/parser.hpp +++ b/MoonParser/parser.hpp | |||
@@ -16,6 +16,19 @@ | |||
16 | #include <codecvt> | 16 | #include <codecvt> |
17 | #include <locale> | 17 | #include <locale> |
18 | 18 | ||
19 | // const str hash helper functions | ||
20 | inline constexpr std::size_t hash(char const* input) | ||
21 | { | ||
22 | return *input ? *input + 33ull * hash(input + 1) : 5381; | ||
23 | } | ||
24 | inline std::size_t hash(const char* input, int size, int index) | ||
25 | { | ||
26 | return index < size ? input[index] + 33ull * hash(input, size, index + 1) : 5381; | ||
27 | } | ||
28 | inline std::size_t constexpr operator"" _id(const char* s, size_t) | ||
29 | { | ||
30 | return hash(s); | ||
31 | } | ||
19 | 32 | ||
20 | ///type of the parser's input. | 33 | ///type of the parser's input. |
21 | typedef std::basic_string<char32_t> input; | 34 | typedef std::basic_string<char32_t> input; |