Merge pull request #2411 from federicobond/recover-parser

Try to recover from parser errors where possible
This commit is contained in:
chriseth 2017-06-16 15:56:48 +02:00 committed by GitHub
commit 17de4a0756

View File

@ -347,8 +347,12 @@ Parser::FunctionHeaderParserResult Parser::parseFunctionHeader(bool _forceEmptyN
else if (Token::isVisibilitySpecifier(token)) else if (Token::isVisibilitySpecifier(token))
{ {
if (result.visibility != Declaration::Visibility::Default) 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 else
break; break;
@ -501,8 +505,12 @@ ASTPointer<VariableDeclaration> Parser::parseVariableDeclaration(
if (_options.isStateVariable && Token::isVariableVisibilitySpecifier(token)) if (_options.isStateVariable && Token::isVariableVisibilitySpecifier(token))
{ {
if (visibility != Declaration::Visibility::Default) 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 else
{ {
@ -513,14 +521,15 @@ ASTPointer<VariableDeclaration> Parser::parseVariableDeclaration(
else if (_options.allowLocationSpecifier && Token::isLocationSpecifier(token)) else if (_options.allowLocationSpecifier && Token::isLocationSpecifier(token))
{ {
if (location != VariableDeclaration::Location::Default) if (location != VariableDeclaration::Location::Default)
fatalParserError(string("Location already specified.")); parserError(string("Location already specified."));
if (!type) else if (!type)
fatalParserError(string("Location specifier needs explicit type name.")); parserError(string("Location specifier needs explicit type name."));
location = ( else
token == Token::Memory ? location = (
VariableDeclaration::Location::Memory : token == Token::Memory ?
VariableDeclaration::Location::Storage VariableDeclaration::Location::Memory :
); VariableDeclaration::Location::Storage
);
} }
else else
break; break;
@ -702,7 +711,7 @@ ASTPointer<TypeName> Parser::parseTypeName(bool _allowVar)
else if (token == Token::Var) else if (token == Token::Var)
{ {
if (!_allowVar) if (!_allowVar)
fatalParserError(string("Expected explicit type name.")); parserError(string("Expected explicit type name."));
m_scanner->next(); m_scanner->next();
} }
else if (token == Token::Function) else if (token == Token::Function)