diff options
author | chriseth <chris@ethereum.org> | 2017-06-16 21:56:48 +0800 |
---|---|---|
committer | GitHub <noreply@github.com> | 2017-06-16 21:56:48 +0800 |
commit | 17de4a0756ad86b6facbf592dce2a4c32ef7585c (patch) | |
tree | 99651050cc863b287ed5c48d0498e6c93b851127 | |
parent | 54e97d1c34d7c291673e695a991db8df627c503e (diff) | |
parent | 0eaae03bbfaf02327c8b8d3f7b38cc3825ea1062 (diff) | |
download | dexon-solidity-17de4a0756ad86b6facbf592dce2a4c32ef7585c.tar.gz dexon-solidity-17de4a0756ad86b6facbf592dce2a4c32ef7585c.tar.zst dexon-solidity-17de4a0756ad86b6facbf592dce2a4c32ef7585c.zip |
Merge pull request #2411 from federicobond/recover-parser
Try to recover from parser errors where possible
-rw-r--r-- | libsolidity/parsing/Parser.cpp | 35 |
1 files changed, 22 insertions, 13 deletions
diff --git a/libsolidity/parsing/Parser.cpp b/libsolidity/parsing/Parser.cpp index 7c439211..88b41f20 100644 --- a/libsolidity/parsing/Parser.cpp +++ b/libsolidity/parsing/Parser.cpp @@ -347,8 +347,12 @@ Parser::FunctionHeaderParserResult Parser::parseFunctionHeader(bool _forceEmptyN else if (Token::isVisibilitySpecifier(token)) { if (result.visibility != Declaration::Visibility::Default) - fatalParserError(string("Multiple visibility specifiers.")); - result.visibility = parseVisibilitySpecifier(token); + { + parserError(string("Multiple visibility specifiers.")); + m_scanner->next(); + } + else + result.visibility = parseVisibilitySpecifier(token); } else break; @@ -501,8 +505,12 @@ ASTPointer<VariableDeclaration> Parser::parseVariableDeclaration( if (_options.isStateVariable && Token::isVariableVisibilitySpecifier(token)) { if (visibility != Declaration::Visibility::Default) - fatalParserError(string("Visibility already specified.")); - visibility = parseVisibilitySpecifier(token); + { + parserError(string("Visibility already specified.")); + m_scanner->next(); + } + else + visibility = parseVisibilitySpecifier(token); } else { @@ -513,14 +521,15 @@ ASTPointer<VariableDeclaration> Parser::parseVariableDeclaration( else if (_options.allowLocationSpecifier && Token::isLocationSpecifier(token)) { if (location != VariableDeclaration::Location::Default) - fatalParserError(string("Location already specified.")); - if (!type) - fatalParserError(string("Location specifier needs explicit type name.")); - location = ( - token == Token::Memory ? - VariableDeclaration::Location::Memory : - VariableDeclaration::Location::Storage - ); + parserError(string("Location already specified.")); + else if (!type) + parserError(string("Location specifier needs explicit type name.")); + else + location = ( + token == Token::Memory ? + VariableDeclaration::Location::Memory : + VariableDeclaration::Location::Storage + ); } else break; @@ -702,7 +711,7 @@ ASTPointer<TypeName> Parser::parseTypeName(bool _allowVar) else if (token == Token::Var) { if (!_allowVar) - fatalParserError(string("Expected explicit type name.")); + parserError(string("Expected explicit type name.")); m_scanner->next(); } else if (token == Token::Function) |