From 4524ad08701939cc22d28494c57dda1cdfba9e10 Mon Sep 17 00:00:00 2001 From: Rhett Aultman Date: Sat, 30 Jul 2016 00:13:05 -0700 Subject: Add support for do/while loops This commit adds support for a standard do while ; form of statement. While loops were already being supported; supporting a do/while loop mostly involves reusing code from while loops but putting the conditional checking last. --- libsolidity/parsing/Parser.cpp | 19 ++++++++++++++++++- 1 file changed, 18 insertions(+), 1 deletion(-) (limited to 'libsolidity/parsing/Parser.cpp') diff --git a/libsolidity/parsing/Parser.cpp b/libsolidity/parsing/Parser.cpp index 0e99d1e7..52b53619 100644 --- a/libsolidity/parsing/Parser.cpp +++ b/libsolidity/parsing/Parser.cpp @@ -722,6 +722,8 @@ ASTPointer Parser::parseStatement() return parseIfStatement(docString); case Token::While: return parseWhileStatement(docString); + case Token::Do: + return parseDoWhileStatement(docString); case Token::For: return parseForStatement(docString); case Token::LBrace: @@ -816,9 +818,24 @@ ASTPointer Parser::parseWhileStatement(ASTPointer con expectToken(Token::RParen); ASTPointer body = parseStatement(); nodeFactory.setEndPositionFromNode(body); - return nodeFactory.createNode(_docString, condition, body); + return nodeFactory.createNode(_docString, condition, body, false); } +ASTPointer Parser::parseDoWhileStatement(ASTPointer const& _docString) +{ + ASTNodeFactory nodeFactory(*this); + expectToken(Token::Do); + ASTPointer body = parseStatement(); + expectToken(Token::While); + expectToken(Token::LParen); + ASTPointer condition = parseExpression(); + expectToken(Token::RParen); + nodeFactory.markEndPosition(); + expectToken(Token::Semicolon); + return nodeFactory.createNode(_docString, condition, body, true); +} + + ASTPointer Parser::parseForStatement(ASTPointer const& _docString) { ASTNodeFactory nodeFactory(*this); -- cgit