diff options
Diffstat (limited to 'Parser.cpp')
-rw-r--r-- | Parser.cpp | 17 |
1 files changed, 14 insertions, 3 deletions
@@ -374,14 +374,25 @@ ASTPointer<WhileStatement> Parser::parseWhileStatement() ASTPointer<ForStatement> Parser::parseForStatement() { ASTNodeFactory nodeFactory(*this); + ASTPointer<ASTNode> initExpression; + ASTPointer<Expression> conditionExpression; + ASTPointer<ExpressionStatement> loopExpression; expectToken(Token::FOR); expectToken(Token::LPAREN); - ASTPointer<ASTNode> initExpression = parseVardefOrExprstatement(); + + // LTODO: Maybe here have some predicate like peekExpression() instead of checking for semicolon and RPAREN? + if (m_scanner->getCurrentToken() != Token::SEMICOLON) + initExpression = parseVardefOrExprstatement(); expectToken(Token::SEMICOLON); - ASTPointer<Expression> conditionExpression = parseExpression(); + + if (m_scanner->getCurrentToken() != Token::SEMICOLON) + conditionExpression = parseExpression(); expectToken(Token::SEMICOLON); - ASTPointer<ExpressionStatement> loopExpression = parseExpressionStatement(); + + if (m_scanner->getCurrentToken() != Token::RPAREN) + loopExpression = parseExpressionStatement(); expectToken(Token::RPAREN); + ASTPointer<Statement> body = parseStatement(); nodeFactory.setEndPositionFromNode(body); return nodeFactory.createNode<ForStatement>(initExpression, |