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

View File

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

View File

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

View File

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