Minor issues, grammar update, new ForStatement test

This commit is contained in:
Lefteris Karapetsas 2014-12-16 14:46:17 +01:00
parent 062b51e7bd
commit adbea47596
4 changed files with 16 additions and 11 deletions

7
AST.h
View File

@ -509,6 +509,9 @@ private:
ASTPointer<Statement> m_body;
};
/**
* For loop statement
*/
class ForStatement: public BreakableStatement
{
public:
@ -527,9 +530,13 @@ public:
virtual void checkTypeRequirements() override;
private:
/// For statement's initialization expresion. for(XXX; ; ). Can be empty
ASTPointer<Statement> m_initExpression;
/// For statement's condition expresion. for(; XXX ; ). Can be empty
ASTPointer<Expression> m_condExpression;
/// For statement's loop expresion. for(;;XXX). Can be empty
ASTPointer<ExpressionStatement> m_loopExpression;
/// The body of the loop
ASTPointer<Statement> m_body;
};

View File

@ -330,10 +330,7 @@ ASTPointer<Statement> Parser::parseStatement()
}
break;
default:
if (peekVariableDefinition())
statement = parseVariableDefinition();
else // "ordinary" expression statement
statement = parseExpressionStatement();
statement = parseVarDefOrExprStmt();
}
expectToken(Token::SEMICOLON);
return statement;
@ -382,7 +379,7 @@ ASTPointer<ForStatement> Parser::parseForStatement()
// LTODO: Maybe here have some predicate like peekExpression() instead of checking for semicolon and RPAREN?
if (m_scanner->getCurrentToken() != Token::SEMICOLON)
initExpression = parseVardefOrExprstatement();
initExpression = parseVarDefOrExprStmt();
expectToken(Token::SEMICOLON);
if (m_scanner->getCurrentToken() != Token::SEMICOLON)
@ -401,7 +398,7 @@ ASTPointer<ForStatement> Parser::parseForStatement()
body);
}
ASTPointer<Statement> Parser::parseVardefOrExprstatement()
ASTPointer<Statement> Parser::parseVarDefOrExprStmt()
{
if (peekVariableDefinition())
return parseVariableDefinition();

View File

@ -60,7 +60,7 @@ private:
ASTPointer<IfStatement> parseIfStatement();
ASTPointer<WhileStatement> parseWhileStatement();
ASTPointer<ForStatement> parseForStatement();
ASTPointer<Statement> parseVardefOrExprstatement();
ASTPointer<Statement> parseVarDefOrExprStmt();
ASTPointer<VariableDefinition> parseVariableDefinition();
ASTPointer<ExpressionStatement> parseExpressionStatement();
ASTPointer<Expression> parseExpression();
@ -74,8 +74,7 @@ private:
///@{
///@name Helper functions
/// Peeks ahead in the scanner to determine if an expression statement
/// could be a variable definition
/// Peeks ahead in the scanner to determine if a variable definition is going to follow
bool peekVariableDefinition();
/// If current token value is not _value, throw exception otherwise advance token.

View File

@ -16,11 +16,13 @@ Mapping = 'mapping' '(' ElementaryTypeName '=>' TypeName ')'
Block = '{' Statement* '}'
Statement = IfStatement | WhileStatement | Block |
( Continue | Break | Return | VariableDefinition | Expression ) ';'
( Continue | Break | Return | VariableDefinition | ExpressionStatement ) ';'
ExpressionStatement = Expression
IfStatement = 'if' '(' Expression ')' Statement ( 'else' Statement )?
WhileStatement = 'while' '(' Expression ')' Statement
ForStatement = 'for' '(' (VardefOrExpressionstatement)? ';' (Expression)? ';' (Expressionstatement)? ')' Statement
VardefOrExprStmt = Variabledefinition | ExpressionStatement
ForStatement = 'for' '(' (VardefOrExprStmt)? ';' (Expression)? ';' (ExpressionStatement)? ')' Statement
Continue = 'continue' ';'
Break = 'break' ';'
Return = 'return' Expression? ';'