diff options
author | Roberto Raggi <roberto.raggi@nokia.com> | 2009-07-13 14:28:29 +0200 |
---|---|---|
committer | Roberto Raggi <roberto.raggi@nokia.com> | 2009-07-13 14:29:20 +0200 |
commit | 6c0854df6672ea54f5810327cab7357ef6b98dde (patch) | |
tree | 0201ee8a433e32ee8f8a722ea73cdff844364c60 /src/shared/cplusplus/Parser.cpp | |
parent | 224d457aaaa576704bc9273bad61ea25d9866b6c (diff) | |
download | qt-creator-6c0854df6672ea54f5810327cab7357ef6b98dde.tar.gz |
Improved the parsing of parameter declarations clause.
Diffstat (limited to 'src/shared/cplusplus/Parser.cpp')
-rw-r--r-- | src/shared/cplusplus/Parser.cpp | 34 |
1 files changed, 25 insertions, 9 deletions
diff --git a/src/shared/cplusplus/Parser.cpp b/src/shared/cplusplus/Parser.cpp index 5b39dfa838..635c337ced 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)) { |