summaryrefslogtreecommitdiff
path: root/src/shared
diff options
context:
space:
mode:
authorRoberto Raggi <roberto.raggi@nokia.com>2010-09-09 17:11:06 +0200
committerRoberto Raggi <roberto.raggi@nokia.com>2010-09-09 17:11:57 +0200
commit52786e1e3961393ac8b83341f3c6425235945441 (patch)
treebeb5250fa911bb69918b4af47f6fe5ab46af3c97 /src/shared
parentbe82d9dd3c60d1cab49e40da3cfc7f4d77d94b85 (diff)
downloadqt-creator-52786e1e3961393ac8b83341f3c6425235945441.tar.gz
Improved parsing of expression-or-declaration statements.
Done-with: Erik Verbruggen
Diffstat (limited to 'src/shared')
-rw-r--r--src/shared/cplusplus/Parser.cpp47
1 files changed, 30 insertions, 17 deletions
diff --git a/src/shared/cplusplus/Parser.cpp b/src/shared/cplusplus/Parser.cpp
index 131b6bbd0d..e2fd3a67df 100644
--- a/src/shared/cplusplus/Parser.cpp
+++ b/src/shared/cplusplus/Parser.cpp
@@ -2936,8 +2936,14 @@ bool Parser::parseExpressionOrDeclarationStatement(StatementAST *&node)
const bool blocked = blockErrors(true);
ExpressionAST *expression = 0;
- if (parseExpression(expression) && LA() == T_SEMICOLON) {
- const unsigned semicolon_token = consumeToken();
+ const bool hasExpression = parseExpression(expression);
+ const unsigned afterExpression = cursor();
+
+ if (hasExpression/* && LA() == T_SEMICOLON*/) {
+ //const unsigned semicolon_token = consumeToken();
+ unsigned semicolon_token = 0;
+ if (LA() == T_SEMICOLON)
+ semicolon_token = cursor();
ExpressionStatementAST *as_expression = new (_pool) ExpressionStatementAST;
as_expression->expression = expression;
@@ -2951,6 +2957,7 @@ bool Parser::parseExpressionOrDeclarationStatement(StatementAST *&node)
if (! binary->left_expression->asBinaryExpression()) {
(void) blockErrors(blocked);
node = as_expression;
+ match(T_SEMICOLON, &as_expression->semicolon_token);
return true;
} else {
invalidAssignment = true;
@@ -2960,6 +2967,7 @@ bool Parser::parseExpressionOrDeclarationStatement(StatementAST *&node)
if (call->base_expression->asIdExpression() != 0) {
(void) blockErrors(blocked);
node = as_expression;
+ match(T_SEMICOLON, &as_expression->semicolon_token);
return true;
}
}
@@ -2968,30 +2976,35 @@ bool Parser::parseExpressionOrDeclarationStatement(StatementAST *&node)
DeclarationAST *declaration = 0;
if (parseSimpleDeclaration(declaration)) {
- SimpleDeclarationAST *simple = declaration->asSimpleDeclaration();
- if (simple->semicolon_token == semicolon_token && simple->decl_specifier_list && simple->declarator_list) {
- DeclarationStatementAST *as_declaration = new (_pool) DeclarationStatementAST;
- as_declaration->declaration = declaration;
+ DeclarationStatementAST *as_declaration = new (_pool) DeclarationStatementAST;
+ as_declaration->declaration = declaration;
- if (invalidAssignment || (simple->decl_specifier_list != 0 && simple->declarator_list != 0)) {
- node = as_declaration;
- (void) blockErrors(blocked);
- return true;
- }
-
- ExpressionOrDeclarationStatementAST *ast = new (_pool) ExpressionOrDeclarationStatementAST;
- ast->declaration = as_declaration;
- ast->expression = as_expression;
- node = ast;
+ SimpleDeclarationAST *simple = declaration->asSimpleDeclaration();
+ if (! semicolon_token || invalidAssignment || semicolon_token != simple->semicolon_token ||
+ (simple->decl_specifier_list != 0 && simple->declarator_list != 0)) {
+ node = as_declaration;
+ (void) blockErrors(blocked);
+ return true;
}
+
+ ExpressionOrDeclarationStatementAST *ast = new (_pool) ExpressionOrDeclarationStatementAST;
+ ast->declaration = as_declaration;
+ ast->expression = as_expression;
+ node = ast;
+ (void) blockErrors(blocked);
+ return true;
}
- rewind(semicolon_token + 1);
+
(void) blockErrors(blocked);
+
+ rewind(afterExpression);
+ match(T_SEMICOLON, &as_expression->semicolon_token);
return true;
}
rewind(start);
(void) blockErrors(blocked);
+
return parseDeclarationStatement(node);
}