From 3b11ee9e0e1be7f3022645ef764fdc3a902b9910 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20Marjam=C3=A4ki?= Date: Mon, 25 Nov 2013 20:58:40 +0100 Subject: [PATCH] AST: Improved handling of brackets --- lib/tokenlist.cpp | 18 +++++++++++++----- test/testtokenize.cpp | 11 +++++++---- 2 files changed, 20 insertions(+), 9 deletions(-) diff --git a/lib/tokenlist.cpp b/lib/tokenlist.cpp index b2dd8f01b..d08964fd4 100644 --- a/lib/tokenlist.cpp +++ b/lib/tokenlist.cpp @@ -363,10 +363,8 @@ static bool iscast(const Token *tok) return false; for (const Token *tok2 = tok->next(); tok2; tok2 = tok2->next()) { - if (tok2->str() == ")") - return (tok2->next() && !tok2->next()->isOp()); if (!Token::Match(tok2, "%var%|*")) - return false; + return Token::Match(tok2, ") %any%") && (!tok2->next()->isOp() && tok2->next()->str() != "["); } return false; @@ -500,16 +498,26 @@ static void compileScope(Token *&tok, std::stack &op) } } -static void compileDot(Token *&tok, std::stack &op) +static void compileParAndBrackets(Token *&tok, std::stack &op) { compileScope(tok,op); while (tok) { - if (tok->str() == ".") { + if (tok->str() == "[") { compileBinOp(tok, compileScope, op); } else break; } } +static void compileDot(Token *&tok, std::stack &op) +{ + compileParAndBrackets(tok,op); + while (tok) { + if (tok->str() == ".") { + compileBinOp(tok, compileParAndBrackets, op); + } else break; + } +} + static void compileMulDiv(Token *&tok, std::stack &op) { compileDot(tok,op); diff --git a/test/testtokenize.cpp b/test/testtokenize.cpp index 8310f5d57..2f6b1751d 100644 --- a/test/testtokenize.cpp +++ b/test/testtokenize.cpp @@ -10008,10 +10008,6 @@ private: ASSERT_EQUALS("'X''a'>", testAst("('X' > 'a')")); ASSERT_EQUALS("'X''a'>", testAst("(L'X' > L'a')")); - - // ({..}) - ASSERT_EQUALS("a{+d+", testAst("a+({b+c;})+d")); - ASSERT_EQUALS("a{d*+", testAst("a+({b+c;})*d")); } void astpar() const { // parentheses @@ -10023,11 +10019,18 @@ private: // casts ASSERT_EQUALS("a1(2(+=",testAst("a=(t)1+(t)2;")); ASSERT_EQUALS("a1(2+=",testAst("a=(t)1+2;")); + + // ({..}) + ASSERT_EQUALS("a{+d+", testAst("a+({b+c;})+d")); + ASSERT_EQUALS("a{d*+", testAst("a+({b+c;})*d")); } void astbrackets() const { // [] ASSERT_EQUALS("a23+[4+", testAst("a[2+3]+4")); ASSERT_EQUALS("a1[0[", testAst("a[1][0]")); + ASSERT_EQUALS("ab0[=", testAst("a=(b)[0];")); + ASSERT_EQUALS("abc0[.=", testAst("a=b.c[0];")); + ASSERT_EQUALS("ab0[1[=", testAst("a=b[0][1];")); } void astunaryop() const { // unary operators