diff options
Diffstat (limited to 'src/shared/cplusplus/Parser.cpp')
-rw-r--r-- | src/shared/cplusplus/Parser.cpp | 46 |
1 files changed, 42 insertions, 4 deletions
diff --git a/src/shared/cplusplus/Parser.cpp b/src/shared/cplusplus/Parser.cpp index 08266e9f79..dba11df713 100644 --- a/src/shared/cplusplus/Parser.cpp +++ b/src/shared/cplusplus/Parser.cpp @@ -1464,11 +1464,11 @@ bool Parser::parseAccessSpecifier(SpecifierAST *&node) bool Parser::parseAccessDeclaration(DeclarationAST *&node) { - if (LA() == T_PUBLIC || LA() == T_PROTECTED || LA() == T_PRIVATE || LA() == T_SIGNALS) { - bool isSignals = LA() == T_SIGNALS; + if (LA() == T_PUBLIC || LA() == T_PROTECTED || LA() == T_PRIVATE || LA() == T_Q_SIGNALS) { + bool isSignals = LA() == T_Q_SIGNALS; AccessDeclarationAST *ast = new (_pool) AccessDeclarationAST; ast->access_specifier_token = consumeToken(); - if (! isSignals && LA() == T_SLOTS) + if (! isSignals && LA() == T_Q_SLOTS) ast->slots_token = consumeToken(); match(T_COLON, &ast->colon_token); node = ast; @@ -1489,7 +1489,7 @@ bool Parser::parseMemberSpecification(DeclarationAST *&node) case T_TEMPLATE: return parseTemplateDeclaration(node); - case T_SIGNALS: + case T_Q_SIGNALS: case T_PUBLIC: case T_PROTECTED: case T_PRIVATE: @@ -1861,6 +1861,9 @@ bool Parser::parseStatement(StatementAST *&node) case T_DO: return parseDoStatement(node); + case T_Q_FOREACH: + return parseForeachStatement(node); + case T_FOR: return parseForStatement(node); @@ -2108,6 +2111,41 @@ bool Parser::parseDoStatement(StatementAST *&node) return false; } +bool Parser::parseForeachStatement(StatementAST *&node) +{ + if (LA() == T_Q_FOREACH) { + ForeachStatementAST *ast = new (_pool) ForeachStatementAST; + ast->foreach_token = consumeToken(); + match(T_LPAREN, &ast->lparen_token); + + unsigned startOfTypeSpecifier = cursor(); + bool blocked = blockErrors(true); + + if (parseTypeSpecifier(ast->type_specifiers)) + parseDeclarator(ast->declarator); + + if (! ast->type_specifiers || ! ast->declarator) { + ast->type_specifiers = 0; + ast->declarator = 0; + + blockErrors(blocked); + rewind(startOfTypeSpecifier); + parseExpression(ast->expression); + } + + blockErrors(blocked); + + match(T_COMMA, &ast->comma_token); + parseExpression(ast->expression); + match(T_RPAREN, &ast->rparen_token); + parseStatement(ast->statement); + + node = ast; + return true; + } + return false; +} + bool Parser::parseForStatement(StatementAST *&node) { if (LA() == T_FOR) { |