aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorchriseth <chris@ethereum.org>2018-05-04 18:50:12 +0800
committerGitHub <noreply@github.com>2018-05-04 18:50:12 +0800
commit81d61ca086e8e45108b7989e7f1494d90077401e (patch)
tree7ed329c24ea5d5082c325e9ebc270b9b9c31dbc6
parenta244f1a383ad46e9f789d66434a6828db0021f11 (diff)
parented9f80690bde53e56c6ef5cb046fb20713f3f780 (diff)
downloaddexon-solidity-81d61ca086e8e45108b7989e7f1494d90077401e.tar
dexon-solidity-81d61ca086e8e45108b7989e7f1494d90077401e.tar.gz
dexon-solidity-81d61ca086e8e45108b7989e7f1494d90077401e.tar.bz2
dexon-solidity-81d61ca086e8e45108b7989e7f1494d90077401e.tar.lz
dexon-solidity-81d61ca086e8e45108b7989e7f1494d90077401e.tar.xz
dexon-solidity-81d61ca086e8e45108b7989e7f1494d90077401e.tar.zst
dexon-solidity-81d61ca086e8e45108b7989e7f1494d90077401e.zip
Merge pull request #4059 from ethereum/parser-simplify
Simplify the parser expectations
-rw-r--r--libsolidity/parsing/Parser.cpp37
-rw-r--r--libsolidity/parsing/Parser.h2
-rw-r--r--libsolidity/parsing/ParserBase.cpp5
-rw-r--r--libsolidity/parsing/ParserBase.h2
-rw-r--r--test/libsolidity/SolidityParser.cpp2
-rw-r--r--test/libsolidity/StandardCompiler.cpp4
-rw-r--r--test/libsolidity/syntaxTests/parsing/constant_is_keyword.sol2
-rw-r--r--test/libsolidity/syntaxTests/parsing/external_variable.sol2
-rw-r--r--test/libsolidity/syntaxTests/parsing/location_specifiers_for_state_variables.sol2
-rw-r--r--test/libsolidity/syntaxTests/parsing/missing_parameter_name_in_named_args.sol2
-rw-r--r--test/libsolidity/syntaxTests/parsing/missing_variable_name_in_declaration.sol2
-rw-r--r--test/libsolidity/syntaxTests/parsing/payable_accessor.sol2
-rw-r--r--test/libsolidity/syntaxTests/parsing/var_array.sol2
13 files changed, 18 insertions, 48 deletions
diff --git a/libsolidity/parsing/Parser.cpp b/libsolidity/parsing/Parser.cpp
index a9ee9016..37732a37 100644
--- a/libsolidity/parsing/Parser.cpp
+++ b/libsolidity/parsing/Parser.cpp
@@ -1194,7 +1194,8 @@ ASTPointer<Expression> Parser::parseExpression(
ASTPointer<Expression> expression = parseBinaryExpression(4, _lookAheadIndexAccessStructure);
if (Token::isAssignmentOp(m_scanner->currentToken()))
{
- Token::Value assignmentOperator = expectAssignmentOperator();
+ Token::Value assignmentOperator = m_scanner->currentToken();
+ m_scanner->next();
ASTPointer<Expression> rightHandSide = parseExpression();
ASTNodeFactory nodeFactory(*this, expression);
nodeFactory.setEndPositionFromNode(rightHandSide);
@@ -1601,40 +1602,10 @@ ASTPointer<ParameterList> Parser::createEmptyParameterList()
return nodeFactory.createNode<ParameterList>(vector<ASTPointer<VariableDeclaration>>());
}
-string Parser::currentTokenName()
-{
- Token::Value token = m_scanner->currentToken();
- if (Token::isElementaryTypeName(token)) //for the sake of accuracy in reporting
- {
- ElementaryTypeNameToken elemTypeName = m_scanner->currentElementaryTypeNameToken();
- return elemTypeName.toString();
- }
- else
- return Token::name(token);
-}
-
-Token::Value Parser::expectAssignmentOperator()
-{
- Token::Value op = m_scanner->currentToken();
- if (!Token::isAssignmentOp(op))
- fatalParserError(
- string("Expected assignment operator, got '") +
- currentTokenName() +
- string("'")
- );
- m_scanner->next();
- return op;
-}
-
ASTPointer<ASTString> Parser::expectIdentifierToken()
{
- Token::Value id = m_scanner->currentToken();
- if (id != Token::Identifier)
- fatalParserError(
- string("Expected identifier, got '") +
- currentTokenName() +
- string("'")
- );
+ // do not advance on success
+ expectToken(Token::Identifier, false);
return getLiteralAndAdvance();
}
diff --git a/libsolidity/parsing/Parser.h b/libsolidity/parsing/Parser.h
index c4254231..7f02d895 100644
--- a/libsolidity/parsing/Parser.h
+++ b/libsolidity/parsing/Parser.h
@@ -165,8 +165,6 @@ private:
/// @returns an expression parsed in look-ahead fashion from something like "a.b[8][2**70]".
ASTPointer<Expression> expressionFromIndexAccessStructure(IndexAccessedPath const& _pathAndIndices);
- std::string currentTokenName();
- Token::Value expectAssignmentOperator();
ASTPointer<ASTString> expectIdentifierToken();
ASTPointer<ASTString> getLiteralAndAdvance();
///@}
diff --git a/libsolidity/parsing/ParserBase.cpp b/libsolidity/parsing/ParserBase.cpp
index 5b83c5bd..617a1779 100644
--- a/libsolidity/parsing/ParserBase.cpp
+++ b/libsolidity/parsing/ParserBase.cpp
@@ -63,7 +63,7 @@ Token::Value ParserBase::advance()
return m_scanner->next();
}
-void ParserBase::expectToken(Token::Value _value)
+void ParserBase::expectToken(Token::Value _value, bool _advance)
{
Token::Value tok = m_scanner->currentToken();
if (tok != _value)
@@ -98,7 +98,8 @@ void ParserBase::expectToken(Token::Value _value)
string("'")
);
}
- m_scanner->next();
+ if (_advance)
+ m_scanner->next();
}
void ParserBase::increaseRecursionDepth()
diff --git a/libsolidity/parsing/ParserBase.h b/libsolidity/parsing/ParserBase.h
index fd0de0d1..b28e1b1b 100644
--- a/libsolidity/parsing/ParserBase.h
+++ b/libsolidity/parsing/ParserBase.h
@@ -63,7 +63,7 @@ protected:
///@{
///@name Helper functions
/// If current token value is not _value, throw exception otherwise advance token.
- void expectToken(Token::Value _value);
+ void expectToken(Token::Value _value, bool _advance = true);
Token::Value currentToken() const;
Token::Value peekNextToken() const;
std::string currentLiteral() const;
diff --git a/test/libsolidity/SolidityParser.cpp b/test/libsolidity/SolidityParser.cpp
index 1ebf8010..f428f892 100644
--- a/test/libsolidity/SolidityParser.cpp
+++ b/test/libsolidity/SolidityParser.cpp
@@ -992,7 +992,7 @@ BOOST_AUTO_TEST_CASE(keyword_is_reserved)
for (const auto& keyword: keywords)
{
auto text = std::string("contract ") + keyword + " {}";
- CHECK_PARSE_ERROR(text.c_str(), "Expected identifier");
+ CHECK_PARSE_ERROR(text.c_str(), "Expected token Identifier got reserved keyword");
}
}
diff --git a/test/libsolidity/StandardCompiler.cpp b/test/libsolidity/StandardCompiler.cpp
index 74bf01b2..f816905c 100644
--- a/test/libsolidity/StandardCompiler.cpp
+++ b/test/libsolidity/StandardCompiler.cpp
@@ -326,8 +326,8 @@ BOOST_AUTO_TEST_CASE(compilation_error)
{
BOOST_CHECK_EQUAL(
dev::jsonCompactPrint(error),
- "{\"component\":\"general\",\"formattedMessage\":\"fileA:1:23: ParserError: Expected identifier, got 'RBrace'\\n"
- "contract A { function }\\n ^\\n\",\"message\":\"Expected identifier, got 'RBrace'\","
+ "{\"component\":\"general\",\"formattedMessage\":\"fileA:1:23: ParserError: Expected token Identifier got 'RBrace'\\n"
+ "contract A { function }\\n ^\\n\",\"message\":\"Expected token Identifier got 'RBrace'\","
"\"severity\":\"error\",\"sourceLocation\":{\"end\":22,\"file\":\"fileA\",\"start\":22},\"type\":\"ParserError\"}"
);
}
diff --git a/test/libsolidity/syntaxTests/parsing/constant_is_keyword.sol b/test/libsolidity/syntaxTests/parsing/constant_is_keyword.sol
index 40e237d2..59fe8518 100644
--- a/test/libsolidity/syntaxTests/parsing/constant_is_keyword.sol
+++ b/test/libsolidity/syntaxTests/parsing/constant_is_keyword.sol
@@ -2,4 +2,4 @@ contract Foo {
uint constant = 4;
}
// ----
-// ParserError: (30-30): Expected identifier, got 'Assign'
+// ParserError: (30-30): Expected token Identifier got 'Assign'
diff --git a/test/libsolidity/syntaxTests/parsing/external_variable.sol b/test/libsolidity/syntaxTests/parsing/external_variable.sol
index 5188875f..1d2e65e6 100644
--- a/test/libsolidity/syntaxTests/parsing/external_variable.sol
+++ b/test/libsolidity/syntaxTests/parsing/external_variable.sol
@@ -2,4 +2,4 @@ contract c {
uint external x;
}
// ----
-// ParserError: (19-19): Expected identifier, got 'External'
+// ParserError: (19-19): Expected token Identifier got 'External'
diff --git a/test/libsolidity/syntaxTests/parsing/location_specifiers_for_state_variables.sol b/test/libsolidity/syntaxTests/parsing/location_specifiers_for_state_variables.sol
index 1b525506..0fc85177 100644
--- a/test/libsolidity/syntaxTests/parsing/location_specifiers_for_state_variables.sol
+++ b/test/libsolidity/syntaxTests/parsing/location_specifiers_for_state_variables.sol
@@ -2,4 +2,4 @@ contract Foo {
uint[] memory x;
}
// ----
-// ParserError: (23-23): Expected identifier, got 'Memory'
+// ParserError: (23-23): Expected token Identifier got 'Memory'
diff --git a/test/libsolidity/syntaxTests/parsing/missing_parameter_name_in_named_args.sol b/test/libsolidity/syntaxTests/parsing/missing_parameter_name_in_named_args.sol
index 0606e2c7..3604f3b2 100644
--- a/test/libsolidity/syntaxTests/parsing/missing_parameter_name_in_named_args.sol
+++ b/test/libsolidity/syntaxTests/parsing/missing_parameter_name_in_named_args.sol
@@ -3,4 +3,4 @@ contract test {
function b() returns (uint r) { r = a({: 1, : 2, : 3}); }
}
// ----
-// ParserError: (143-143): Expected identifier, got 'Colon'
+// ParserError: (143-143): Expected token Identifier got 'Colon'
diff --git a/test/libsolidity/syntaxTests/parsing/missing_variable_name_in_declaration.sol b/test/libsolidity/syntaxTests/parsing/missing_variable_name_in_declaration.sol
index fd3067e3..bb1d015b 100644
--- a/test/libsolidity/syntaxTests/parsing/missing_variable_name_in_declaration.sol
+++ b/test/libsolidity/syntaxTests/parsing/missing_variable_name_in_declaration.sol
@@ -2,4 +2,4 @@ contract test {
uint256 ;
}
// ----
-// ParserError: (28-28): Expected identifier, got 'Semicolon'
+// ParserError: (28-28): Expected token Identifier got 'Semicolon'
diff --git a/test/libsolidity/syntaxTests/parsing/payable_accessor.sol b/test/libsolidity/syntaxTests/parsing/payable_accessor.sol
index a73108ad..44b04afd 100644
--- a/test/libsolidity/syntaxTests/parsing/payable_accessor.sol
+++ b/test/libsolidity/syntaxTests/parsing/payable_accessor.sol
@@ -2,4 +2,4 @@ contract test {
uint payable x;
}
// ----
-// ParserError: (22-22): Expected identifier, got 'Payable'
+// ParserError: (22-22): Expected token Identifier got 'Payable'
diff --git a/test/libsolidity/syntaxTests/parsing/var_array.sol b/test/libsolidity/syntaxTests/parsing/var_array.sol
index 60f6dc28..86fc4fcb 100644
--- a/test/libsolidity/syntaxTests/parsing/var_array.sol
+++ b/test/libsolidity/syntaxTests/parsing/var_array.sol
@@ -2,4 +2,4 @@ contract Foo {
function f() { var[] a; }
}
// ----
-// ParserError: (34-34): Expected identifier, got 'LBrack'
+// ParserError: (34-34): Expected token Identifier got 'LBrack'