6 static const std::unordered_map
<std::string
, TokenType
> keywords
=
12 {"return", Tok_Return
},
14 {"continue", Tok_Continue
},
15 {"func", Tok_Function
},
17 {"expression", Tok_Expression
},
18 {"statement", Tok_Statement
},
20 {"parse_statement", Tok_ParseStatement
},
21 {"parse_expression", Tok_ParseExpression
},
22 {"global", Tok_Global
},
25 {"typeof", Tok_TypeOf
},
26 {"sizeof", Tok_SizeOf
},
28 // these aren't implemented yet
29 {"switch", Tok_Switch
},
31 {"import", Tok_Import
},
35 std::shared_ptr
<std::vector
<Token
<Iter
>>> tokenize(Iter begin
, Iter end
)
37 auto tokens_ptr
= std::make_shared
<std::vector
<Token
<Iter
>>>();
38 std::vector
<Token
<Iter
>> &tokens
= *tokens_ptr
;
47 case '\n': // ignore whitespaces
51 tokens
.emplace_back(Tok_LeftParen
, i
, i
+1);
55 tokens
.emplace_back(Tok_RightParen
, i
, i
+1);
59 tokens
.emplace_back(Tok_LeftBracket
, i
, i
+1);
63 tokens
.emplace_back(Tok_RightBracket
, i
, i
+1);
67 tokens
.emplace_back(Tok_LeftBrace
, i
, i
+1);
71 tokens
.emplace_back(Tok_RightBrace
, i
, i
+1);
75 tokens
.emplace_back(Tok_Comma
, i
, i
+1);
79 tokens
.emplace_back(Tok_Dot
, i
, i
+1);
83 tokens
.emplace_back(Tok_Semicolon
, i
, i
+1);
87 tokens
.emplace_back(Tok_Colon
, i
, i
+1);
91 if(i
+1 != end
&& *(i
+1) == '=')
93 tokens
.emplace_back(Tok_PlusEqual
, i
, i
+2);
98 tokens
.emplace_back(Tok_Plus
, i
, i
+1);
103 if(i
+1 != end
&& *(i
+1) == '=')
105 tokens
.emplace_back(Tok_DashEqual
, i
, i
+2);
110 tokens
.emplace_back(Tok_Dash
, i
, i
+1);
115 if(i
+1 != end
&& *(i
+1) == '=')
117 tokens
.emplace_back(Tok_StarEqual
, i
, i
+2);
122 tokens
.emplace_back(Tok_Star
, i
, i
+1);
127 if(i
+1 != end
&& *(i
+1) == '=')
129 tokens
.emplace_back(Tok_PercentEqual
, i
, i
+2);
134 tokens
.emplace_back(Tok_Percent
, i
, i
+1);
139 if(i
+1 != end
&& *(i
+1) == '/')
142 while(i
!=end
&& *i
!= '\n')
147 else if(i
+1 != end
&& *(i
+1) == '=')
149 tokens
.emplace_back(Tok_SlashEqual
, i
, i
+2);
154 tokens
.emplace_back(Tok_Slash
, i
, i
+1);
159 if(i
+1 != end
&& *(i
+1) == '=')
161 tokens
.emplace_back(Tok_LessEqual
, i
, i
+2);
166 tokens
.emplace_back(Tok_Less
, i
, i
+1);
171 if(i
+1 != end
&& *(i
+1) == '=')
173 tokens
.emplace_back(Tok_GreaterEqual
, i
, i
+2);
178 tokens
.emplace_back(Tok_Greater
, i
, i
+1);
183 if(i
+1 != end
&& *(i
+1) == '=')
185 tokens
.emplace_back(Tok_EqOp
, i
, i
+2);
190 tokens
.emplace_back(Tok_Equal
, i
, i
+1);
195 if(i
+1 != end
&& *(i
+1) == '=')
197 tokens
.emplace_back(Tok_NotEqual
, i
, i
+2);
202 tokens
.emplace_back(Tok_Not
, i
, i
+1);
207 if(i
+1 != end
&& *(i
+1) == '&')
209 tokens
.emplace_back(Tok_LogicalAnd
, i
, i
+2);
214 auto lc
= Utils::LineColumn(begin
, i
);
215 throw std::runtime_error(
216 std::to_string(lc
.first
) + ":" +
217 std::to_string(lc
.second
) + ": unrecognized symbol: '" + *i
+ "'"
222 if(i
+1 != end
&& *(i
+1) == '|')
224 tokens
.emplace_back(Tok_LogicalOr
, i
, i
+2);
229 auto lc
= Utils::LineColumn(begin
, i
);
230 throw std::runtime_error(
231 std::to_string(lc
.first
) + ":" +
232 std::to_string(lc
.second
) + ": unrecognized symbol: '" + *i
+ "'"
238 while(i
!=end
&& !(*i
== '"' && *(i
-1) != '\\'))
243 tokens
.emplace_back(Tok_String
, start
, i
);
248 while(i
!=end
&& std::isdigit(*i
))
252 if(i
!=end
&& (*i
== '.'))
255 while((i
!= end
) && std::isdigit(*i
))
260 if((i
!= end
) && (*i
== 'e'))
263 if((i
!= end
) && (*i
== '-'))
267 while(i
!=end
&& std::isdigit(*i
))
272 tokens
.emplace_back(Tok_Number
, start
, i
);
275 else if(std::isalpha(*i
) || (*i
== '_') || (*i
== '$'))
278 while(i
!=end
&& (std::isalnum(*i
) || *i
== '_'))
282 auto kw
= keywords
.find(std::string(start
, i
));
283 if(kw
== keywords
.end())
285 tokens
.emplace_back(Tok_Identifier
, start
, i
);
289 tokens
.emplace_back(kw
->second
, start
, i
);
295 auto lc
= Utils::LineColumn(begin
, i
);
296 throw std::runtime_error(
297 std::to_string(lc
.first
) + ":" +
298 std::to_string(lc
.second
) + ": unrecognized symbol: '" + *i
+ "'"
309 using FuncType
= Interpreter
;
310 using Value
= Interpreter::Value
;
311 using Iter
= std::vector
<Token
<std::string::iterator
>>::iterator
;
312 using return_t
= std::shared_ptr
<ASTNode
<Iter
,Value
,FuncType
>>;
314 template<typename StrIter
>
315 return_t
operator()(StrIter sbegin
, StrIter send
)
317 auto source
= std::make_shared
<std::string
>(sbegin
, send
);
318 auto tokens
= tokenize(source
->begin(), source
->end());
319 this->begin
= tokens
->begin();
320 this->end
= tokens
->end();
322 accepted
= this->end
;
323 auto node
= statement_list();
324 node
->source
= source
;
325 node
->tokens
= tokens
;
327 node
->inject_dependencies();
331 template<class StrIter
>
332 return_t
parse_expression(StrIter sbegin
, StrIter send
)
334 auto source
= std::make_shared
<std::string
>(sbegin
, send
);
335 auto tokens
= tokenize(source
->begin(), source
->end());
336 this->begin
= tokens
->begin();
337 this->end
= tokens
->end();
339 accepted
= this->end
;
340 auto node
= expression();
341 node
->source
= source
;
342 node
->tokens
= tokens
;
344 node
->inject_dependencies();
359 void rewind(Iter pos
);
361 bool peek(TokenType t
, int amount
= 0);
363 bool accept(TokenType t
);
367 bool expect(TokenType t
);
369 void expect(const std::string
&expected
);
373 return_t
field_name();
375 return_t
identifier_list();
379 return_t
parse_expression();
381 return_t
parse_statement();
393 return_t
do_import();
395 return_t
table_initializer();
397 return_t
array_initializer();
399 return_t
primary_expression();
401 return_t
postfix_expression();
403 return_t
unary_expression();
405 return_t
multiplicative_expression();
407 return_t
additive_expression();
409 return_t
relational_expression();
411 return_t
equality_expression();
413 return_t
logical_and_expression();
415 return_t
logical_or_expression();
417 return_t
assignment_expression();
419 return_t
initializer_assignment_expression();
421 return_t
expression();
425 return_t
if_statement();
427 return_t
while_statement();
431 return_t
for_statement();
433 return_t
break_statement();
435 return_t
continue_statement();
437 return_t
return_statement();
439 return_t
statement();
441 return_t
statement_list();