diff options
author | Lefteris Karapetsas <lefteris@refu.co> | 2014-12-16 21:46:17 +0800 |
---|---|---|
committer | Lefteris Karapetsas <lefteris@refu.co> | 2014-12-17 07:03:30 +0800 |
commit | adbea475963ab376c2ae378a03bc58f2fb454b6e (patch) | |
tree | 4a6f0f245c39dd24c340012f6032bf77b8a86c79 | |
parent | 062b51e7bdf572abba25a76fc8c3bb6e96da71c9 (diff) | |
download | dexon-solidity-adbea475963ab376c2ae378a03bc58f2fb454b6e.tar dexon-solidity-adbea475963ab376c2ae378a03bc58f2fb454b6e.tar.gz dexon-solidity-adbea475963ab376c2ae378a03bc58f2fb454b6e.tar.bz2 dexon-solidity-adbea475963ab376c2ae378a03bc58f2fb454b6e.tar.lz dexon-solidity-adbea475963ab376c2ae378a03bc58f2fb454b6e.tar.xz dexon-solidity-adbea475963ab376c2ae378a03bc58f2fb454b6e.tar.zst dexon-solidity-adbea475963ab376c2ae378a03bc58f2fb454b6e.zip |
Minor issues, grammar update, new ForStatement test
-rw-r--r-- | AST.h | 7 | ||||
-rw-r--r-- | Parser.cpp | 9 | ||||
-rw-r--r-- | Parser.h | 5 | ||||
-rw-r--r-- | grammar.txt | 6 |
4 files changed, 16 insertions, 11 deletions
@@ -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; }; @@ -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(); @@ -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. diff --git a/grammar.txt b/grammar.txt index 7c0ac3a5..8c34997b 100644 --- a/grammar.txt +++ b/grammar.txt @@ -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? ';' |