mirror of
https://github.com/ethereum/solidity
synced 2023-10-03 13:03:40 +00:00
Minor issues, grammar update, new ForStatement test
This commit is contained in:
parent
062b51e7bd
commit
adbea47596
7
AST.h
7
AST.h
@ -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;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -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();
|
||||||
|
5
Parser.h
5
Parser.h
@ -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.
|
||||||
|
@ -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? ';'
|
||||||
|
Loading…
Reference in New Issue
Block a user