aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorLefteris Karapetsas <lefteris@refu.co>2014-12-16 21:46:17 +0800
committerLefteris Karapetsas <lefteris@refu.co>2014-12-17 07:03:30 +0800
commitadbea475963ab376c2ae378a03bc58f2fb454b6e (patch)
tree4a6f0f245c39dd24c340012f6032bf77b8a86c79
parent062b51e7bdf572abba25a76fc8c3bb6e96da71c9 (diff)
downloaddexon-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.h7
-rw-r--r--Parser.cpp9
-rw-r--r--Parser.h5
-rw-r--r--grammar.txt6
4 files changed, 16 insertions, 11 deletions
diff --git a/AST.h b/AST.h
index 2fb6a2e3..dcbca1ee 100644
--- a/AST.h
+++ b/AST.h
@@ -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;
};
diff --git a/Parser.cpp b/Parser.cpp
index 2669ce20..73235675 100644
--- a/Parser.cpp
+++ b/Parser.cpp
@@ -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();
diff --git a/Parser.h b/Parser.h
index cd3d5bab..bf3a6bea 100644
--- a/Parser.h
+++ b/Parser.h
@@ -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? ';'