summaryrefslogtreecommitdiff
path: root/src/shared/cplusplus/Parser.cpp
diff options
context:
space:
mode:
authorRoberto Raggi <roberto.raggi@nokia.com>2009-07-13 14:28:29 +0200
committerRoberto Raggi <roberto.raggi@nokia.com>2009-07-13 14:29:20 +0200
commit6c0854df6672ea54f5810327cab7357ef6b98dde (patch)
tree0201ee8a433e32ee8f8a722ea73cdff844364c60 /src/shared/cplusplus/Parser.cpp
parent224d457aaaa576704bc9273bad61ea25d9866b6c (diff)
downloadqt-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.cpp34
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)) {