mirror of
https://github.com/ethereum/solidity
synced 2023-10-03 13:03:40 +00:00
Parser for try/catch.
This commit is contained in:
parent
a54d9d622f
commit
6d6914f98f
@ -1106,6 +1106,8 @@ ASTPointer<Statement> Parser::parseStatement()
|
|||||||
m_scanner->next();
|
m_scanner->next();
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
case Token::Try:
|
||||||
|
return parseTryStatement(docString);
|
||||||
case Token::Assembly:
|
case Token::Assembly:
|
||||||
return parseInlineAssembly(docString);
|
return parseInlineAssembly(docString);
|
||||||
case Token::Emit:
|
case Token::Emit:
|
||||||
@ -1187,6 +1189,62 @@ ASTPointer<IfStatement> Parser::parseIfStatement(ASTPointer<ASTString> const& _d
|
|||||||
return nodeFactory.createNode<IfStatement>(_docString, condition, trueBody, falseBody);
|
return nodeFactory.createNode<IfStatement>(_docString, condition, trueBody, falseBody);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
ASTPointer<TryStatement> Parser::parseTryStatement(ASTPointer<ASTString> const& _docString)
|
||||||
|
{
|
||||||
|
RecursionGuard recursionGuard(*this);
|
||||||
|
ASTNodeFactory nodeFactory(*this);
|
||||||
|
expectToken(Token::Try);
|
||||||
|
ASTPointer<Expression> externalCall = parseExpression();
|
||||||
|
vector<ASTPointer<TryCatchClause>> clauses;
|
||||||
|
|
||||||
|
ASTNodeFactory successClauseFactory(*this);
|
||||||
|
ASTPointer<ParameterList> returnsParameters;
|
||||||
|
if (m_scanner->currentToken() == Token::Returns)
|
||||||
|
{
|
||||||
|
m_scanner->next();
|
||||||
|
VarDeclParserOptions options;
|
||||||
|
options.allowEmptyName = true;
|
||||||
|
options.allowLocationSpecifier = true;
|
||||||
|
returnsParameters = parseParameterList(options, false);
|
||||||
|
}
|
||||||
|
ASTPointer<Block> successBlock = parseBlock();
|
||||||
|
successClauseFactory.setEndPositionFromNode(successBlock);
|
||||||
|
clauses.emplace_back(successClauseFactory.createNode<TryCatchClause>(
|
||||||
|
make_shared<ASTString>(), returnsParameters, successBlock
|
||||||
|
));
|
||||||
|
|
||||||
|
do
|
||||||
|
{
|
||||||
|
clauses.emplace_back(parseCatchClause());
|
||||||
|
}
|
||||||
|
while (m_scanner->currentToken() == Token::Catch);
|
||||||
|
nodeFactory.setEndPositionFromNode(clauses.back());
|
||||||
|
return nodeFactory.createNode<TryStatement>(
|
||||||
|
_docString, externalCall, clauses
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
ASTPointer<TryCatchClause> Parser::parseCatchClause()
|
||||||
|
{
|
||||||
|
RecursionGuard recursionGuard(*this);
|
||||||
|
ASTNodeFactory nodeFactory(*this);
|
||||||
|
expectToken(Token::Catch);
|
||||||
|
ASTPointer<ASTString> errorName = make_shared<string>();
|
||||||
|
ASTPointer<ParameterList> errorParameters;
|
||||||
|
if (m_scanner->currentToken() != Token::LBrace)
|
||||||
|
{
|
||||||
|
if (m_scanner->currentToken() == Token::Identifier)
|
||||||
|
errorName = expectIdentifierToken();
|
||||||
|
VarDeclParserOptions options;
|
||||||
|
options.allowEmptyName = true;
|
||||||
|
options.allowLocationSpecifier = true;
|
||||||
|
errorParameters = parseParameterList(options, !errorName->empty());
|
||||||
|
}
|
||||||
|
ASTPointer<Block> block = parseBlock();
|
||||||
|
nodeFactory.setEndPositionFromNode(block);
|
||||||
|
return nodeFactory.createNode<TryCatchClause>(errorName, errorParameters, block);
|
||||||
|
}
|
||||||
|
|
||||||
ASTPointer<WhileStatement> Parser::parseWhileStatement(ASTPointer<ASTString> const& _docString)
|
ASTPointer<WhileStatement> Parser::parseWhileStatement(ASTPointer<ASTString> const& _docString)
|
||||||
{
|
{
|
||||||
RecursionGuard recursionGuard(*this);
|
RecursionGuard recursionGuard(*this);
|
||||||
|
@ -119,6 +119,8 @@ private:
|
|||||||
ASTPointer<Statement> parseStatement();
|
ASTPointer<Statement> parseStatement();
|
||||||
ASTPointer<InlineAssembly> parseInlineAssembly(ASTPointer<ASTString> const& _docString = {});
|
ASTPointer<InlineAssembly> parseInlineAssembly(ASTPointer<ASTString> const& _docString = {});
|
||||||
ASTPointer<IfStatement> parseIfStatement(ASTPointer<ASTString> const& _docString);
|
ASTPointer<IfStatement> parseIfStatement(ASTPointer<ASTString> const& _docString);
|
||||||
|
ASTPointer<TryStatement> parseTryStatement(ASTPointer<ASTString> const& _docString);
|
||||||
|
ASTPointer<TryCatchClause> parseCatchClause();
|
||||||
ASTPointer<WhileStatement> parseWhileStatement(ASTPointer<ASTString> const& _docString);
|
ASTPointer<WhileStatement> parseWhileStatement(ASTPointer<ASTString> const& _docString);
|
||||||
ASTPointer<WhileStatement> parseDoWhileStatement(ASTPointer<ASTString> const& _docString);
|
ASTPointer<WhileStatement> parseDoWhileStatement(ASTPointer<ASTString> const& _docString);
|
||||||
ASTPointer<ForStatement> parseForStatement(ASTPointer<ASTString> const& _docString);
|
ASTPointer<ForStatement> parseForStatement(ASTPointer<ASTString> const& _docString);
|
||||||
|
Loading…
Reference in New Issue
Block a user