diff options
| author | Li Jin <dragon-fly@qq.com> | 2019-09-08 00:28:49 +0800 |
|---|---|---|
| committer | Li Jin <dragon-fly@qq.com> | 2019-09-08 00:28:49 +0800 |
| commit | fabc309a0a0a6f210a8a7ed8f0d1f8498971f409 (patch) | |
| tree | 0187faf6b0caf17d1767b5a01ea174704742ab6f | |
| parent | 5e3d082dd2ea31acf0cc722c19b78aa4ef6e6077 (diff) | |
| download | yuescript-fabc309a0a0a6f210a8a7ed8f0d1f8498971f409.tar.gz yuescript-fabc309a0a0a6f210a8a7ed8f0d1f8498971f409.tar.bz2 yuescript-fabc309a0a0a6f210a8a7ed8f0d1f8498971f409.zip | |
completing moonscript compiler with c++.
Diffstat (limited to '')
| -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; |
