summaryrefslogtreecommitdiff
path: root/src/MoonP/moon_parser.h
diff options
context:
space:
mode:
Diffstat (limited to 'src/MoonP/moon_parser.h')
-rw-r--r--src/MoonP/moon_parser.h263
1 files changed, 251 insertions, 12 deletions
diff --git a/src/MoonP/moon_parser.h b/src/MoonP/moon_parser.h
index fc4ee55..933aa7a 100644
--- a/src/MoonP/moon_parser.h
+++ b/src/MoonP/moon_parser.h
@@ -9,27 +9,266 @@ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLI
9#pragma once 9#pragma once
10 10
11#include <string> 11#include <string>
12#include <codecvt>
13#include <unordered_set> 12#include <unordered_set>
14#include <stack> 13#include <stack>
15#include <algorithm> 14#include <algorithm>
16#include <vector> 15#include <vector>
16#include <sstream>
17#include <string_view>
18using namespace std::string_view_literals;
17#include "MoonP/ast.hpp" 19#include "MoonP/ast.hpp"
18using namespace parserlib; 20#include "MoonP/moon_ast.h"
19 21
20namespace MoonP { 22namespace MoonP {
21 23
22struct State { 24struct ParseInfo {
23 State() { 25 ast_ptr<false,ast_node> node;
24 indents.push(0); 26 std::string error;
25 stringOpen = -1; 27 std::unique_ptr<input> input;
28 std::string errorMessage(std::string_view msg, const input_range* loc) const;
29};
30
31#define AST_RULE(type) \
32 rule type; \
33 ast<type##_t> type##_impl = type; \
34 template<> inline rule& getRule<type##_t>() { return type; }
35
36extern std::unordered_set<std::string> LuaKeywords;
37extern std::unordered_set<std::string> Keywords;
38
39class MoonParser {
40public:
41 MoonParser();
42
43 template<class AST>
44 ParseInfo parse(const std::string& codes) {
45 error_list errors;
46 auto res = parse(codes, getRule<AST>());
47 if (res.node.template is<AST>()) {
48 return res;
49 }
50 return res;
51 }
52
53 template <class AST>
54 bool match(const std::string& codes) {
55 auto rEnd = rule(getRule<AST>() >> eof());
56 return parse(codes, rEnd).node;
57 }
58
59 std::string toString(ast_node* node);
60 std::string toString(input::iterator begin, input::iterator end);
61
62 input encode(std::string_view input);
63 std::string decode(const input& input);
64
65protected:
66 ParseInfo parse(const std::string& codes, rule& r);
67
68 struct State {
69 State() {
70 indents.push(0);
71 stringOpen = -1;
72 }
73 std::string buffer;
74 size_t stringOpen;
75 std::stack<int> indents;
76 std::stack<bool> doStack;
77 };
78
79private:
80 Converter _converter;
81
82 template <class T>
83 inline rule& getRule() {
84 assert(false);
85 return Cut;
26 } 86 }
27 std::string buffer; 87
28 size_t stringOpen; 88 rule plain_space;
29 std::stack<int> indents; 89 rule Break;
30 std::stack<bool> doStack; 90 rule Any;
31 static std::unordered_set<std::string> luaKeywords; 91 rule White;
32 static std::unordered_set<std::string> keywords; 92 rule Stop;
93 rule Comment;
94 rule multi_line_open;
95 rule multi_line_close;
96 rule multi_line_content;
97 rule MultiLineComment;
98 rule Indent;
99 rule EscapeNewLine;
100 rule Space;
101 rule SomeSpace;
102 rule SpaceBreak;
103 rule EmptyLine;
104 rule AlphaNum;
105 rule Cut;
106 rule check_indent;
107 rule CheckIndent;
108 rule advance;
109 rule Advance;
110 rule push_indent;
111 rule PushIndent;
112 rule PreventIndent;
113 rule PopIndent;
114 rule InBlock;
115 rule ImportName;
116 rule ImportNameList;
117 rule import_literal_chain;
118 rule WithExp;
119 rule PopDo;
120 rule DisableDo;
121 rule SwitchElse;
122 rule SwitchBlock;
123 rule IfElseIf;
124 rule IfElse;
125 rule for_args;
126 rule for_in;
127 rule CompClause;
128 rule Chain;
129 rule KeyValue;
130 rule single_string_inner;
131 rule interp;
132 rule double_string_plain;
133 rule lua_string_open;
134 rule lua_string_close;
135 rule FnArgsExpList;
136 rule FnArgs;
137 rule chain_call;
138 rule chain_item;
139 rule ChainItems;
140 rule chain_dot_chain;
141 rule ColonChain;
142 rule chain_with_colon;
143 rule ChainItem;
144 rule Index;
145 rule invoke_chain;
146 rule TableValue;
147 rule table_lit_lines;
148 rule TableLitLine;
149 rule TableValueList;
150 rule TableBlockInner;
151 rule ClassLine;
152 rule KeyValueLine;
153 rule KeyValueList;
154 rule ArgLine;
155 rule ArgBlock;
156 rule invoke_args_with_table;
157 rule minus_exp;
158 rule sharp_exp;
159 rule tilde_exp;
160 rule not_exp;
161 rule empty_line_stop;
162 rule Line;
163 rule Shebang;
164
165 AST_RULE(Num)
166 AST_RULE(Name)
167 AST_RULE(Variable)
168 AST_RULE(LuaKeyword)
169 AST_RULE(self)
170 AST_RULE(self_name)
171 AST_RULE(self_class)
172 AST_RULE(self_class_name)
173 AST_RULE(SelfName)
174 AST_RULE(KeyName)
175 AST_RULE(VarArg)
176 AST_RULE(local_flag)
177 AST_RULE(Seperator)
178 AST_RULE(NameList)
179 AST_RULE(Local)
180 AST_RULE(colon_import_name)
181 AST_RULE(import_literal_inner)
182 AST_RULE(ImportLiteral)
183 AST_RULE(ImportFrom)
184 AST_RULE(ImportAs)
185 AST_RULE(Import)
186 AST_RULE(Backcall)
187 AST_RULE(ExpListLow)
188 AST_RULE(ExpList)
189 AST_RULE(Return)
190 AST_RULE(With)
191 AST_RULE(SwitchCase)
192 AST_RULE(Switch)
193 AST_RULE(IfCond)
194 AST_RULE(If)
195 AST_RULE(Unless)
196 AST_RULE(While)
197 AST_RULE(for_step_value)
198 AST_RULE(For)
199 AST_RULE(ForEach)
200 AST_RULE(Do)
201 AST_RULE(Comprehension)
202 AST_RULE(comp_value)
203 AST_RULE(TblComprehension)
204 AST_RULE(star_exp)
205 AST_RULE(CompForEach)
206 AST_RULE(CompFor)
207 AST_RULE(CompInner)
208 AST_RULE(Assign)
209 AST_RULE(update_op)
210 AST_RULE(Update)
211 AST_RULE(BinaryOperator)
212 AST_RULE(BackcallOperator)
213 AST_RULE(Assignable)
214 AST_RULE(AssignableChain)
215 AST_RULE(exp_op_value)
216 AST_RULE(Exp)
217 AST_RULE(Callable)
218 AST_RULE(ChainValue)
219 AST_RULE(simple_table)
220 AST_RULE(SimpleValue)
221 AST_RULE(Value)
222 AST_RULE(LuaStringOpen);
223 AST_RULE(LuaStringContent);
224 AST_RULE(LuaStringClose);
225 AST_RULE(LuaString)
226 AST_RULE(SingleString)
227 AST_RULE(double_string_inner)
228 AST_RULE(double_string_content)
229 AST_RULE(DoubleString)
230 AST_RULE(String)
231 AST_RULE(Parens)
232 AST_RULE(DotChainItem)
233 AST_RULE(ColonChainItem)
234 AST_RULE(default_value)
235 AST_RULE(Slice)
236 AST_RULE(Invoke)
237 AST_RULE(existential_op)
238 AST_RULE(TableLit)
239 AST_RULE(TableBlock)
240 AST_RULE(class_member_list)
241 AST_RULE(ClassBlock)
242 AST_RULE(ClassDecl)
243 AST_RULE(export_values)
244 AST_RULE(export_op)
245 AST_RULE(Export)
246 AST_RULE(variable_pair)
247 AST_RULE(normal_pair)
248 AST_RULE(FnArgDef)
249 AST_RULE(FnArgDefList)
250 AST_RULE(outer_var_shadow)
251 AST_RULE(FnArgsDef)
252 AST_RULE(fn_arrow)
253 AST_RULE(FunLit)
254 AST_RULE(NameOrDestructure)
255 AST_RULE(AssignableNameList)
256 AST_RULE(InvokeArgs)
257 AST_RULE(const_value)
258 AST_RULE(unary_exp)
259 AST_RULE(ExpListAssign)
260 AST_RULE(if_else_line)
261 AST_RULE(unless_line)
262 AST_RULE(statement_appendix)
263 AST_RULE(BreakLoop)
264 AST_RULE(Statement)
265 AST_RULE(Body)
266 AST_RULE(Block)
267 AST_RULE(File)
268};
269
270namespace Utils {
271 void replace(std::string& str, std::string_view from, std::string_view to);
33}; 272};
34 273
35} // namespace MoonP 274} // namespace MoonP