mirror of
https://github.com/ethereum/solidity
synced 2023-10-03 13:03:40 +00:00
Remove parser error recovery mode
This commit is contained in:
@@ -74,56 +74,10 @@ void ParserBase::expectToken(Token _value, bool _advance)
|
||||
{
|
||||
Token tok = m_scanner->currentToken();
|
||||
if (tok != _value)
|
||||
{
|
||||
std::string const expectedToken = ParserBase::tokenName(_value);
|
||||
if (m_parserErrorRecovery)
|
||||
parserError(6635_error, "Expected " + expectedToken + " but got " + tokenName(tok));
|
||||
else
|
||||
fatalParserError(2314_error, "Expected " + expectedToken + " but got " + tokenName(tok));
|
||||
// Do not advance so that recovery can sync or make use of the current token.
|
||||
// This is especially useful if the expected token
|
||||
// is the only one that is missing and is at the end of a construct.
|
||||
// "{ ... ; }" is such an example.
|
||||
// ^
|
||||
_advance = false;
|
||||
}
|
||||
if (_advance)
|
||||
advance();
|
||||
}
|
||||
|
||||
void ParserBase::expectTokenOrConsumeUntil(Token _value, std::string const& _currentNodeName, bool _advance)
|
||||
{
|
||||
solAssert(m_inParserRecovery, "The function is supposed to be called during parser recovery only.");
|
||||
|
||||
Token tok = m_scanner->currentToken();
|
||||
if (tok != _value)
|
||||
{
|
||||
SourceLocation errorLoc = currentLocation();
|
||||
int startPosition = errorLoc.start;
|
||||
while (m_scanner->currentToken() != _value && m_scanner->currentToken() != Token::EOS)
|
||||
advance();
|
||||
|
||||
std::string const expectedToken = ParserBase::tokenName(_value);
|
||||
if (m_scanner->currentToken() == Token::EOS)
|
||||
{
|
||||
// rollback to where the token started, and raise exception to be caught at a higher level.
|
||||
m_scanner->setPosition(static_cast<size_t>(startPosition));
|
||||
std::string const msg = "In " + _currentNodeName + ", " + expectedToken + "is expected; got " + ParserBase::tokenName(tok) + " instead.";
|
||||
fatalParserError(1957_error, errorLoc, msg);
|
||||
}
|
||||
else
|
||||
{
|
||||
parserWarning(3796_error, "Recovered in " + _currentNodeName + " at " + expectedToken + ".");
|
||||
m_inParserRecovery = false;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
std::string expectedToken = ParserBase::tokenName(_value);
|
||||
parserWarning(3347_error, "Recovered in " + _currentNodeName + " at " + expectedToken + ".");
|
||||
m_inParserRecovery = false;
|
||||
}
|
||||
|
||||
fatalParserError(
|
||||
2314_error,
|
||||
"Expected " + ParserBase::tokenName(_value) + " but got " + tokenName(tok)
|
||||
);
|
||||
if (_advance)
|
||||
advance();
|
||||
}
|
||||
|
||||
@@ -38,14 +38,9 @@ struct ErrorId;
|
||||
class ParserBase
|
||||
{
|
||||
public:
|
||||
/// Set @a _parserErrorRecovery to true for additional error
|
||||
/// recovery. This is experimental and intended for use
|
||||
/// by front-end tools that need partial AST information even
|
||||
/// when errors occur.
|
||||
explicit ParserBase(ErrorReporter& errorReporter, bool _parserErrorRecovery = false): m_errorReporter(errorReporter)
|
||||
{
|
||||
m_parserErrorRecovery = _parserErrorRecovery;
|
||||
}
|
||||
explicit ParserBase(ErrorReporter& errorReporter):
|
||||
m_errorReporter(errorReporter)
|
||||
{}
|
||||
|
||||
virtual ~ParserBase() = default;
|
||||
|
||||
@@ -70,13 +65,9 @@ protected:
|
||||
///@{
|
||||
///@name Helper functions
|
||||
/// If current token value is not @a _value, throw exception otherwise advance token
|
||||
// @a if _advance is true and error recovery is in effect.
|
||||
// if @a _advance is true
|
||||
void expectToken(Token _value, bool _advance = true);
|
||||
|
||||
/// Like expectToken but if there is an error ignores tokens until
|
||||
/// the expected token or EOS is seen. If EOS is encountered, back up to the error point,
|
||||
/// and throw an exception so that a higher grammar rule has an opportunity to recover.
|
||||
void expectTokenOrConsumeUntil(Token _value, std::string const& _currentNodeName, bool _advance = true);
|
||||
Token currentToken() const;
|
||||
Token peekNextToken() const;
|
||||
std::string tokenName(Token _token);
|
||||
@@ -108,10 +99,6 @@ protected:
|
||||
ErrorReporter& m_errorReporter;
|
||||
/// Current recursion depth during parsing.
|
||||
size_t m_recursionDepth = 0;
|
||||
/// True if we are in parser error recovery. Usually this means we are scanning for
|
||||
/// a synchronization token like ';', or '}'. We use this to reduce cascaded error messages.
|
||||
bool m_inParserRecovery = false;
|
||||
bool m_parserErrorRecovery = false;
|
||||
};
|
||||
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user