aboutsummaryrefslogtreecommitdiff
path: root/MoonParser
diff options
context:
space:
mode:
Diffstat (limited to 'MoonParser')
-rw-r--r--MoonParser/ast.cpp127
-rw-r--r--MoonParser/ast.hpp36
-rw-r--r--MoonParser/moon_ast.cpp822
-rw-r--r--MoonParser/moon_ast.h238
-rw-r--r--MoonParser/moon_parser.h2
-rw-r--r--MoonParser/parser.hpp13
6 files changed, 1052 insertions, 186 deletions
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
11int ast_type_id = 0; 11int ast_type_id = 0;
12 12
13traversal ast_node::traverse(const std::function<traversal (ast_node*)>& func) {
14 return func(this);
15}
13 16
14bool ast_node::visit(const std::function<bool (ast_node*)>& begin, 17ast_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
21void ast_node::eachChild(const std::function<void (ast_node*)>&) { }
22
23bool 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
51bool ast_container::visit(const std::function<bool (ast_node*)>& begin, 57traversal 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
81ast_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
104void 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
121bool 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
139ast_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
160int 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.
75void ast_member::_init() { 176void 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
34enum class traversal {
35 Continue,
36 Return,
37 Stop
38};
39
34/** Base class for AST nodes. 40/** Base class for AST nodes.
35 */ 41 */
36class ast_node : public input_range { 42class 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"; }
147private: 175private:
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>
11using namespace std::string_view_literals;
7#include "moon_ast.h" 12#include "moon_ast.h"
8 13
9input& 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
22const input& AstLeaf::getValue() 14const 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
147int main() 139template<class T, class... Args>
140inline std::unique_ptr<T> MakeUnique(Args&&... args) {
141 return std::unique_ptr<T>(new T(std::forward<Args>(args)...));
142}
143
144inline std::string s(std::string_view sv) {
145 return std::string(sv);
146}
147
148class MoonCompliler
148{ 149{
149 std::string s = R"TestCodesHere( 150public:
150thing = { var: 10, hello: "world", func: => @var } 151 void complile(const std::string& codes) {
151import 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"; 185private:
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
870const std::string MoonCompliler::Empty;
871
872int main()
873{
874 std::string s = R"TestCodesHere(a = 998
875f, 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
888a, b = if hello
889 "hello"
890else
891 "nothing", "yeah"
892
893
894a, b = if hello
895 if yeah then "one", "two" else "mmhh"
896else
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
5input& trim(input& s); 5template <typename T>
6std::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
7class AstLeaf : public ast_node 19class 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) \
16extern rule type; \ 28extern rule type; \
17class type##_t : public AstLeaf \ 29class type##_t : public AstLeaf \
18{ \ 30{ \
19public: \ 31public: \
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) \
24extern rule type; \ 37extern rule type; \
25class type##_t : public ast_container \ 38class type##_t : public ast_container \
26{ \ 39{ \
27public: \ 40public: \
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
34AST_LEAF(Num) 48AST_LEAF(Num, "Num"_id)
35AST_END(Num) 49AST_END(Num)
36 50
37AST_LEAF(_Name) 51AST_LEAF(_Name, "_Name"_id)
38AST_END(_Name) 52AST_END(_Name)
39 53
40AST_NODE(Name) 54AST_NODE(Name, "Name"_id)
41 ast_ptr<_Name_t> name; 55 ast_ptr<_Name_t> name;
42AST_END(Name) 56AST_END(Name)
43 57
44AST_LEAF(self) 58AST_LEAF(self, "self"_id)
45AST_END(self) 59AST_END(self)
46 60
47AST_NODE(self_name) 61AST_NODE(self_name, "self_name"_id)
48 ast_ptr<_Name_t> name; 62 ast_ptr<_Name_t> name;
49AST_END(self_name) 63AST_END(self_name)
50 64
51AST_LEAF(self_class) 65AST_LEAF(self_class, "self_class"_id)
52AST_END(self_class) 66AST_END(self_class)
53 67
54AST_NODE(self_class_name) 68AST_NODE(self_class_name, "self_class_name"_id)
55 ast_ptr<_Name_t> name; 69 ast_ptr<_Name_t> name;
56AST_END(self_class_name) 70AST_END(self_class_name)
57 71
58AST_NODE(SelfName) 72AST_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
60AST_END(SelfName) 74AST_END(SelfName)
61 75
62AST_NODE(KeyName) 76AST_NODE(KeyName, "KeyName"_id)
63 ast_ptr<ast_node> name; // SelfName_t | _Name_t 77 ast_ptr<ast_node> name; // SelfName_t | _Name_t
64AST_END(KeyName) 78AST_END(KeyName)
65 79
66AST_LEAF(VarArg) 80AST_LEAF(VarArg, "VarArg"_id)
67AST_END(VarArg) 81AST_END(VarArg)
68 82
69AST_LEAF(local_flag) 83AST_LEAF(local_flag, "local_flag"_id)
70AST_END(local_flag) 84AST_END(local_flag)
71 85
72AST_LEAF(Seperator) 86AST_LEAF(Seperator, "Seperator"_id)
73AST_END(Seperator) 87AST_END(Seperator)
74 88
75AST_NODE(NameList) 89AST_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;
78AST_END(NameList) 92AST_END(NameList)
79 93
80AST_NODE(Local) 94AST_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
82AST_END(Local) 96AST_END(Local)
83 97
84AST_NODE(colon_import_name) 98AST_NODE(colon_import_name, "colon_import_name"_id)
85 ast_ptr<Name_t> name; 99 ast_ptr<Name_t> name;
86AST_END(colon_import_name) 100AST_END(colon_import_name)
87 101
88class Exp_t; 102class Exp_t;
89 103
90AST_NODE(ImportName) 104AST_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
92AST_END(ImportName) 106AST_END(ImportName)
93 107
94AST_NODE(Import) 108AST_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;
98AST_END(Import) 112AST_END(Import)
99 113
100AST_NODE(ExpListLow) 114AST_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;
103AST_END(ExpListLow) 117AST_END(ExpListLow)
104 118
105AST_NODE(ExpList) 119AST_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;
108AST_END(ExpList) 122AST_END(ExpList)
109 123
110AST_NODE(Return) 124AST_NODE(Return, "Return"_id)
111 ast_ptr<ExpListLow_t, true> valueList; 125 ast_ptr<ExpListLow_t, true> valueList;
112AST_END(Return) 126AST_END(Return)
113 127
114class Assign_t; 128class Assign_t;
115class Body_t; 129class Body_t;
116 130
117AST_NODE(With) 131AST_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;
121AST_END(With) 135AST_END(With)
122 136
123AST_NODE(SwitchCase) 137AST_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;
126AST_END(SwitchCase) 140AST_END(SwitchCase)
127 141
128AST_NODE(Switch) 142AST_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;
133AST_END(Switch) 147AST_END(Switch)
134 148
135AST_NODE(IfCond) 149AST_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;
138AST_END(IfCond) 152AST_END(IfCond)
139 153
140AST_NODE(IfElseIf) 154AST_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;
143AST_END(IfElseIf) 157AST_END(IfElseIf)
144 158
145AST_NODE(If) 159AST_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;
151AST_END(If) 165AST_END(If)
152 166
153AST_NODE(Unless) 167AST_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;
159AST_END(Unless) 173AST_END(Unless)
160 174
161AST_NODE(While) 175AST_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;
164AST_END(While) 178AST_END(While)
165 179
166AST_NODE(for_step_value) 180AST_NODE(for_step_value, "for_step_value"_id)
167 ast_ptr<Exp_t> value; 181 ast_ptr<Exp_t> value;
168AST_END(for_step_value) 182AST_END(for_step_value)
169 183
170AST_NODE(For) 184AST_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
178class AssignableNameList_t; 192class AssignableNameList_t;
179 193
180AST_NODE(ForEach) 194AST_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;
184AST_END(ForEach) 198AST_END(ForEach)
185 199
186AST_NODE(Do) 200AST_NODE(Do, "Do"_id)
187 ast_ptr<Body_t> body; 201 ast_ptr<Body_t> body;
188AST_END(Do) 202AST_END(Do)
189 203
190class CompInner_t; 204class CompInner_t;
191 205
192AST_NODE(Comprehension) 206AST_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;
195AST_END(Comprehension) 209AST_END(Comprehension)
196 210
197AST_NODE(comp_value) 211AST_NODE(comp_value, "comp_value"_id)
198 ast_ptr<Exp_t> value; 212 ast_ptr<Exp_t> value;
199AST_END(comp_value) 213AST_END(comp_value)
200 214
201AST_NODE(TblComprehension) 215AST_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;
205AST_END(TblComprehension) 219AST_END(TblComprehension)
206 220
207AST_NODE(star_exp) 221AST_NODE(star_exp, "star_exp"_id)
208 ast_ptr<Exp_t> value; 222 ast_ptr<Exp_t> value;
209AST_END(star_exp) 223AST_END(star_exp)
210 224
211AST_NODE(CompForEach) 225AST_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
214AST_END(CompForEach) 228AST_END(CompForEach)
215 229
216AST_NODE(CompFor) 230AST_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;
221AST_END(CompFor) 235AST_END(CompFor)
222 236
223AST_NODE(CompClause) 237AST_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
225AST_END(CompClause) 239AST_END(CompClause)
226 240
227AST_NODE(CompInner) 241AST_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
233class TableBlock_t; 247class TableBlock_t;
234 248
235AST_NODE(Assign) 249AST_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
237AST_END(Assign) 251AST_END(Assign)
238 252
239AST_LEAF(update_op) 253AST_LEAF(update_op, "update_op"_id)
240AST_END(update_op) 254AST_END(update_op)
241 255
242AST_NODE(Update) 256AST_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;
245AST_END(Update) 259AST_END(Update)
246 260
247AST_LEAF(BinaryOperator) 261AST_LEAF(BinaryOperator, "BinaryOperator"_id)
248AST_END(BinaryOperator) 262AST_END(BinaryOperator)
249 263
250class Chain_t; 264class Chain_t;
251 265
252AST_NODE(Assignable) 266AST_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
254AST_END(Assignable) 268AST_END(Assignable)
255 269
256class Value_t; 270class Value_t;
257 271
258AST_NODE(exp_op_value) 272AST_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;
261AST_END(exp_op_value) 275AST_END(exp_op_value)
262 276
263AST_NODE(Exp) 277AST_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;
266AST_END(Exp) 280AST_END(Exp)
267 281
268AST_NODE(Callable) 282AST_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
270AST_END(Callable) 284AST_END(Callable)
271 285
272class InvokeArgs_t; 286class InvokeArgs_t;
273 287
274AST_NODE(ChainValue) 288AST_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;
277AST_END(ChainValue) 291AST_END(ChainValue)
278 292
279class KeyValue_t; 293class KeyValue_t;
280 294
281AST_NODE(simple_table) 295AST_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;
284AST_END(simple_table) 298AST_END(simple_table)
285 299
286class String_t; 300class String_t;
287 301
288AST_NODE(SimpleValue) 302AST_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 */
295AST_END(SimpleValue) 309AST_END(SimpleValue)
296 310
297AST_NODE(Chain) 311AST_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
299AST_END(Chain) 313AST_END(Chain)
300 314
301AST_NODE(Value) 315AST_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
303AST_END(Value) 317AST_END(Value)
304 318
305AST_LEAF(LuaString) 319AST_LEAF(LuaString, "LuaString"_id)
306AST_END(LuaString) 320AST_END(LuaString)
307 321
308AST_LEAF(SingleString) 322AST_LEAF(SingleString, "SingleString"_id)
309AST_END(SingleString) 323AST_END(SingleString)
310 324
311AST_LEAF(double_string_inner) 325AST_LEAF(double_string_inner, "double_string_inner"_id)
312AST_END(double_string_inner) 326AST_END(double_string_inner)
313 327
314AST_NODE(double_string_content) 328AST_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
316AST_END(double_string_content) 330AST_END(double_string_content)
317 331
318AST_NODE(DoubleString) 332AST_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;
321AST_END(DoubleString) 335AST_END(DoubleString)
322 336
323AST_NODE(String) 337AST_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
325AST_END(String) 339AST_END(String)
326 340
327AST_NODE(Parens) 341AST_NODE(Parens, "Parens"_id)
328 ast_ptr<Exp_t> expr; 342 ast_ptr<Exp_t> expr;
329AST_END(Parens) 343AST_END(Parens)
330 344
331AST_NODE(FnArgs) 345AST_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;
334AST_END(FnArgs) 348AST_END(FnArgs)
335 349
336class ChainItems_t; 350class ChainItems_t;
337 351
338AST_NODE(chain_call) 352AST_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;
341AST_END(chain_call) 355AST_END(chain_call)
342 356
343AST_NODE(chain_item) 357AST_NODE(chain_item, "chain_item"_id)
344 ast_ptr<ChainItems_t> chain; 358 ast_ptr<ChainItems_t> chain;
345AST_END(chain_item) 359AST_END(chain_item)
346 360
347AST_NODE(DotChainItem) 361AST_NODE(DotChainItem, "DotChainItem"_id)
348 ast_ptr<_Name_t> name; 362 ast_ptr<_Name_t> name;
349AST_END(DotChainItem) 363AST_END(DotChainItem)
350 364
351AST_NODE(ColonChainItem) 365AST_NODE(ColonChainItem, "ColonChainItem"_id)
352 ast_ptr<_Name_t> name; 366 ast_ptr<_Name_t> name;
353AST_END(ColonChainItem) 367AST_END(ColonChainItem)
354 368
355AST_NODE(chain_dot_chain) 369AST_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;
358AST_END(chain_dot_chain) 372AST_END(chain_dot_chain)
@@ -361,183 +375,183 @@ class ColonChain_t;
361class Invoke_t; 375class Invoke_t;
362class Slice_t; 376class Slice_t;
363 377
364AST_NODE(ChainItem) 378AST_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]
366AST_END(ChainItem) 380AST_END(ChainItem)
367 381
368AST_NODE(ChainItems) 382AST_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;
372AST_END(ChainItems) 386AST_END(ChainItems)
373 387
374AST_NODE(invoke_chain) 388AST_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;
377AST_END(invoke_chain) 391AST_END(invoke_chain)
378 392
379AST_NODE(ColonChain) 393AST_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;
382AST_END(ColonChain) 396AST_END(ColonChain)
383 397
384AST_LEAF(default_value) 398AST_LEAF(default_value, "default_value"_id)
385AST_END(default_value) 399AST_END(default_value)
386 400
387AST_NODE(Slice) 401AST_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
391AST_END(Slice) 405AST_END(Slice)
392 406
393AST_NODE(Invoke) 407AST_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
395AST_END(Invoke) 409AST_END(Invoke)
396 410
397class KeyValue_t; 411class KeyValue_t;
398 412
399AST_NODE(TableValue) 413AST_NODE(TableValue, "TableValue"_id)
400 ast_ptr<ast_node> value; // KeyValue_t | Exp_t 414 ast_ptr<ast_node> value; // KeyValue_t | Exp_t
401AST_END(TableValue) 415AST_END(TableValue)
402 416
403AST_NODE(TableLit) 417AST_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;
406AST_END(TableLit) 420AST_END(TableLit)
407 421
408AST_NODE(TableBlock) 422AST_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;
411AST_END(TableBlock) 425AST_END(TableBlock)
412 426
413AST_NODE(class_member_list) 427AST_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;
416AST_END(class_member_list) 430AST_END(class_member_list)
417 431
418AST_NODE(ClassLine) 432AST_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
420AST_END(ClassLine) 434AST_END(ClassLine)
421 435
422AST_NODE(ClassBlock) 436AST_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;
425AST_END(ClassBlock) 439AST_END(ClassBlock)
426 440
427AST_NODE(ClassDecl) 441AST_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;
431AST_END(ClassDecl) 445AST_END(ClassDecl)
432 446
433AST_NODE(export_values) 447AST_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;
436AST_END(export_values) 450AST_END(export_values)
437 451
438AST_LEAF(export_op) 452AST_LEAF(export_op, "export_op"_id)
439AST_END(export_op) 453AST_END(export_op)
440 454
441AST_NODE(Export) 455AST_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
443AST_END(Export) 457AST_END(Export)
444 458
445AST_NODE(variable_pair) 459AST_NODE(variable_pair, "variable_pair"_id)
446 ast_ptr<Name_t> name; 460 ast_ptr<Name_t> name;
447AST_END(variable_pair) 461AST_END(variable_pair)
448 462
449AST_NODE(normal_pair) 463AST_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
452AST_END(normal_pair) 466AST_END(normal_pair)
453 467
454AST_NODE(KeyValue) 468AST_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
456AST_END(KeyValue) 470AST_END(KeyValue)
457 471
458AST_NODE(FnArgDef) 472AST_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;
461AST_END(FnArgDef) 475AST_END(FnArgDef)
462 476
463AST_NODE(FnArgDefList) 477AST_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;
467AST_END(FnArgDefList) 481AST_END(FnArgDefList)
468 482
469AST_NODE(outer_var_shadow) 483AST_NODE(outer_var_shadow, "outer_var_shadow"_id)
470 ast_ptr<NameList_t, true> varList; 484 ast_ptr<NameList_t, true> varList;
471AST_END(outer_var_shadow) 485AST_END(outer_var_shadow)
472 486
473AST_NODE(FnArgsDef) 487AST_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;
476AST_END(FnArgsDef) 490AST_END(FnArgsDef)
477 491
478AST_LEAF(fn_arrow) 492AST_LEAF(fn_arrow, "fn_arrow"_id)
479AST_END(fn_arrow) 493AST_END(fn_arrow)
480 494
481AST_NODE(FunLit) 495AST_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;
485AST_END(FunLit) 499AST_END(FunLit)
486 500
487AST_NODE(NameOrDestructure) 501AST_NODE(NameOrDestructure, "NameOrDestructure"_id)
488 ast_ptr<ast_node> item; // Name_t | TableLit_t 502 ast_ptr<ast_node> item; // Name_t | TableLit_t
489AST_END(NameOrDestructure) 503AST_END(NameOrDestructure)
490 504
491AST_NODE(AssignableNameList) 505AST_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;
494AST_END(AssignableNameList) 508AST_END(AssignableNameList)
495 509
496AST_NODE(ArgBlock) 510AST_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;
499AST_END(ArgBlock) 513AST_END(ArgBlock)
500 514
501AST_NODE(invoke_args_with_table) 515AST_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;
504AST_END(invoke_args_with_table) 518AST_END(invoke_args_with_table)
505 519
506AST_NODE(InvokeArgs) 520AST_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;
510AST_END(InvokeArgs) 524AST_END(InvokeArgs)
511 525
512AST_LEAF(const_value) 526AST_LEAF(const_value, "const_value"_id)
513AST_END(const_value) 527AST_END(const_value)
514 528
515AST_NODE(unary_exp) 529AST_NODE(unary_exp, "unary_exp"_id)
516 ast_ptr<Exp_t> item; 530 ast_ptr<Exp_t> item;
517AST_END(unary_exp) 531AST_END(unary_exp)
518 532
519AST_NODE(Assignment) 533AST_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
522AST_END(Assignment) 536AST_END(Assignment)
523 537
524AST_NODE(if_else_line) 538AST_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
527AST_END(if_else_line) 541AST_END(if_else_line)
528 542
529AST_NODE(unless_line) 543AST_NODE(unless_line, "unless_line"_id)
530 ast_ptr<Exp_t> condition; 544 ast_ptr<Exp_t> condition;
531AST_END(unless_line) 545AST_END(unless_line)
532 546
533AST_NODE(statement_appendix) 547AST_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
535AST_END(statement_appendix) 549AST_END(statement_appendix)
536 550
537AST_LEAF(BreakLoop) 551AST_LEAF(BreakLoop, "BreakLoop"_id)
538AST_END(BreakLoop) 552AST_END(BreakLoop)
539 553
540AST_NODE(Statement) 554AST_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
549class Block_t; 563class Block_t;
550 564
551AST_NODE(Body) 565AST_NODE(Body, "Body"_id)
552 ast_ptr<ast_node> content; // Block | Statement 566 ast_ptr<ast_node> content; // Block | Statement
553AST_END(Body) 567AST_END(Body)
554 568
555AST_NODE(Line) 569AST_NODE(Line, "Line"_id)
556 ast_ptr<Statement_t, true> statment; 570 ast_ptr<Statement_t, true> statment;
557AST_END(Line) 571AST_END(Line)
558 572
559AST_NODE(Block) 573AST_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;
562AST_END(Block) 576AST_END(Block)
563 577
564AST_NODE(BlockEnd) 578AST_NODE(BlockEnd, "BlockEnd"_id)
565 ast_ptr<Block_t> block; 579 ast_ptr<Block_t> block;
566AST_END(BlockEnd) 580AST_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
20inline constexpr std::size_t hash(char const* input)
21{
22 return *input ? *input + 33ull * hash(input + 1) : 5381;
23}
24inline 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}
28inline 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.
21typedef std::basic_string<char32_t> input; 34typedef std::basic_string<char32_t> input;