Website Summary Files Commits Branches @commit @diff @stats
path: root / JSImpl / src / Parser.cpp
diff options
context:
space:
mode:
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);
}