Website Summary Files Commits Branches @commit @diff @stats
path: root / JSImpl / src / Parser.cpp
diff options
context:
space:
mode:
Commit8f9f28a9875816f5b61893f69d7bd3d2cf4182c6 (patch)
Author
 Dimitar Trendafilov <dimitar@coherent-labs.com>
2018-10-24 19:49:08 +0300
Committer
 Dimitar Trendafilov <dimitar@coherent-labs.com>
2018-10-24 19:49:08 +0300
Files1898055fa2e7a1305ef4bd0dd79181d533cf0d65 /JSImpl/src/Parser.cpp
IPL-8f9f28a9875816f5b61893f69d7bd3d2cf4182c6.tar
IPL-8f9f28a9875816f5b61893f69d7bd3d2cf4182c6.tar.gz
IPL-8f9f28a9875816f5b61893f69d7bd3d2cf4182c6.zip
Parentd57561ef43c80fa6050e80f4876a45ba886818ff (diff)
Parent74363cca95d59c3b756675701f6e843597593225 (diff)
Merge branch 'tree_interpreter'
1 files changed, 37 insertions, 19 deletions
-rw-r--r--JSImpl/src/Parser.cpp56
diff --git a/JSImpl/src/Parser.cpp b/JSImpl/src/Parser.cpp
index a2a46e2..4e1fbca 100644
--- a/JSImpl/src/Parser.cpp
+++ b/JSImpl/src/Parser.cpp
@@ -350,9 +350,10 @@ ExpressionPtr Parser::Unary()
TokenType::PlusPlus,
}))
{
+ auto op = Prev().Type;
auto ls = LeftSideExpression();
auto suffix = false;
- return IPLMakeSharePtr<UnaryExpression>(ls, Prev().Type, suffix);
+ return IPLMakeSharePtr<UnaryExpression>(ls, op, suffix);
}
else if (MatchOneOf({
TokenType::Void,
@@ -649,22 +650,23 @@ ExpressionPtr Parser::Expression()
ExpressionPtr Parser::Statement()
{
- if (auto result = EmptyStatement()) return result;
- else if(auto result = VariableDefinition()) return result;
- else if(auto result = Block()) return result;
- else if(auto result = LabeledStatement()) return result;
- else if(auto result = IfStatementfull()) return result;
- else if(auto result = SwitchStatement()) return result;
- else if(auto result = DoStatement()) return result;
- else if(auto result = WhileStatement()) return result;
- else if(auto result = ForStatement()) return result;
- else if(auto result = WithStatement()) return result;
- else if(auto result = ContinueStatement()) return result;
- else if(auto result = BreakStatement()) return result;
- else if(auto result = OptionalLabel()) return result;
- else if(auto result = ReturnStatement()) return result;
- else if(auto result = TryStatement()) return result;
- return nullptr;
+ ExpressionPtr result;
+ if (result = EmptyStatement()) return result;
+ else if(result = VariableDefinition()) return result;
+ else if(result = Block()) return result;
+ else if(result = LabeledStatement()) return result;
+ else if(result = IfStatementfull()) return result;
+ else if(result = SwitchStatement()) return result;
+ else if(result = DoStatement()) return result;
+ else if(result = WhileStatement()) return result;
+ else if(result = ForStatement()) return result;
+ else if(result = WithStatement()) return result;
+ else if(result = ContinueStatement()) return result;
+ else if(result = BreakStatement()) return result;
+ else if(result = OptionalLabel()) return result;
+ else if(result = ReturnStatement()) return result;
+ else if(result = TryStatement()) return result;
+ return result;
}
ExpressionPtr Parser::EmptyStatement()
@@ -738,13 +740,13 @@ ExpressionPtr Parser::Block()
if (Match(TokenType::LeftBrace))
{
- if (Match(TokenType::RightBrace))
+ if (!Match(TokenType::RightBrace))
{
return BlockStatementsPrefix();
}
else
{
- // TODO log error
+ // TODO log error - empty block?
assert(false);
return nullptr;
}
@@ -846,14 +848,30 @@ ExpressionPtr Parser::ForStatement()
{
if (Match(TokenType::For))
{
+ if (!Match(TokenType::LeftParen))
+ {
+ assert(false);
+ }
auto initializer = Expression();
if (!initializer)
{
initializer = VariableDefinition();
}
+ if (!Match(TokenType::Semicolon))
+ {
+ assert(false);
+ }
auto cond = Expression();
+ if (!Match(TokenType::Semicolon))
+ {
+ assert(false);
+ }
auto iteration = Expression();
+ if (!Match(TokenType::RightParen))
+ {
+ assert(false);
+ }
auto body = Statement();
return IPLMakeSharePtr<::ForStatement>(initializer, cond, iteration, body);
}