Check token within parseCase

This commit is contained in:
Alex Beregszaszi 2017-05-19 18:04:40 +01:00
parent db3d9e0416
commit e48e84ca2b
2 changed files with 9 additions and 7 deletions

View File

@ -75,7 +75,7 @@ assembly::Statement Parser::parseStatement()
while (m_scanner->currentToken() == Token::Case) while (m_scanner->currentToken() == Token::Case)
_switch.cases.emplace_back(parseCase()); _switch.cases.emplace_back(parseCase());
if (m_scanner->currentToken() == Token::Default) if (m_scanner->currentToken() == Token::Default)
_switch.cases.emplace_back(parseCase(true)); _switch.cases.emplace_back(parseCase());
if (_switch.cases.size() == 0) if (_switch.cases.size() == 0)
fatalParserError("Switch statement without any cases."); fatalParserError("Switch statement without any cases.");
_switch.location.end = _switch.cases.back().body.location.end; _switch.location.end = _switch.cases.back().body.location.end;
@ -148,19 +148,21 @@ assembly::Statement Parser::parseStatement()
return statement; return statement;
} }
assembly::Case Parser::parseCase(bool _defaultCase) assembly::Case Parser::parseCase()
{ {
assembly::Case _case = createWithLocation<assembly::Case>(); assembly::Case _case = createWithLocation<assembly::Case>();
if (_defaultCase) if (m_scanner->currentToken() == Token::Default)
expectToken(Token::Default); m_scanner->next();
else else if (m_scanner->currentToken() == Token::Case)
{ {
expectToken(Token::Case); m_scanner->next();
assembly::Statement statement = parseElementaryOperation(); assembly::Statement statement = parseElementaryOperation();
if (statement.type() != typeid(assembly::Literal)) if (statement.type() != typeid(assembly::Literal))
fatalParserError("Literal expected."); fatalParserError("Literal expected.");
_case.value = make_shared<Literal>(std::move(boost::get<assembly::Literal>(statement))); _case.value = make_shared<Literal>(std::move(boost::get<assembly::Literal>(statement)));
} }
else
fatalParserError("Case or default case expected.");
_case.body = parseBlock(); _case.body = parseBlock();
_case.location.end = _case.body.location.end; _case.location.end = _case.body.location.end;
return _case; return _case;

View File

@ -62,7 +62,7 @@ protected:
Block parseBlock(); Block parseBlock();
Statement parseStatement(); Statement parseStatement();
Case parseCase(bool _defaultCase = false); Case parseCase();
/// Parses a functional expression that has to push exactly one stack element /// Parses a functional expression that has to push exactly one stack element
Statement parseExpression(); Statement parseExpression();
std::map<std::string, dev::solidity::Instruction> const& instructions(); std::map<std::string, dev::solidity::Instruction> const& instructions();