From 6c0854df6672ea54f5810327cab7357ef6b98dde Mon Sep 17 00:00:00 2001 From: Roberto Raggi <roberto.raggi@nokia.com> Date: Mon, 13 Jul 2009 14:28:29 +0200 Subject: [PATCH] Improved the parsing of parameter declarations clause. --- src/shared/cplusplus/Parser.cpp | 34 ++++++++++++++++++++++++--------- 1 file changed, 25 insertions(+), 9 deletions(-) diff --git a/src/shared/cplusplus/Parser.cpp b/src/shared/cplusplus/Parser.cpp index 5b39dfa8385..635c337ced4 100644 --- a/src/shared/cplusplus/Parser.cpp +++ b/src/shared/cplusplus/Parser.cpp @@ -1306,24 +1306,40 @@ bool Parser::parseTypeId(ExpressionAST *&node) bool Parser::parseParameterDeclarationClause(ParameterDeclarationClauseAST *&node) { + if (LA() == T_RPAREN) + return true; // nothing to do + DeclarationListAST *parameter_declarations = 0; - if (LA() != T_DOT_DOT_DOT) - parseParameterDeclarationList(parameter_declarations); + unsigned dot_dot_dot_token = 0; - if (LA() == T_DOT_DOT_DOT || (LA() == T_COMMA && LA(2) == T_DOT_DOT_DOT)) { - if (LA() == T_COMMA) - consumeToken(); + if (LA() == T_DOT_DOT_DOT) dot_dot_dot_token = consumeToken(); + else { + parseParameterDeclarationList(parameter_declarations); + + if (LA() == T_DOT_DOT_DOT) { + dot_dot_dot_token = consumeToken(); + } else if (LA() == T_COMMA && LA(2) == T_DOT_DOT_DOT) { + consumeToken(); // skip comma + dot_dot_dot_token = consumeToken(); + } } - ParameterDeclarationClauseAST *ast = new (_pool) ParameterDeclarationClauseAST; - ast->parameter_declarations = parameter_declarations; - ast->dot_dot_dot_token = dot_dot_dot_token; - node = ast; + + if (parameter_declarations || dot_dot_dot_token) { + ParameterDeclarationClauseAST *ast = new (_pool) ParameterDeclarationClauseAST; + ast->parameter_declarations = parameter_declarations; + ast->dot_dot_dot_token = dot_dot_dot_token; + node = ast; + } + return true; } bool Parser::parseParameterDeclarationList(DeclarationListAST *&node) { + if (LA() == T_DOT_DOT_DOT || (LA() == T_COMMA && LA(2) == T_DOT_DOT_DOT)) + return false; // nothing to do. + DeclarationListAST **parameter_declaration_ptr = &node; DeclarationAST *declaration = 0; if (parseParameterDeclaration(declaration)) { -- GitLab