OSDN Git Service

parse braces on the RHS of assignments
authorOswald Buddenhagen <oswald.buddenhagen@nokia.com>
Thu, 24 Jun 2010 15:37:21 +0000 (17:37 +0200)
committerOswald Buddenhagen <oswald.buddenhagen@nokia.com>
Thu, 24 Jun 2010 17:19:21 +0000 (19:19 +0200)
this is less insane than (and thus incompatible to) qmake, but i
postulate that nobody will complain. :)

src/shared/proparser/profileparser.cpp

index 4228ede..ede2d67 100644 (file)
@@ -290,7 +290,7 @@ bool ProFileParser::read(ProFile *pro, const QString &in)
     m_operator = NoOperator;
     m_markLine = m_lineNo;
     Context context = CtxTest;
-    int parens = 0;
+    int parens = 0; // Braces in value context
     int argc = 0;
     int litCount = 0;
     int expCount = 0;
@@ -650,6 +650,7 @@ bool ProFileParser::read(ProFile *pro, const QString &in)
                         FLUSH_LHS_LITERAL(false);
                         finalizeCond(tokPtr, buf, ptr);
                         flushScopes(tokPtr);
+                      closeScope:
                         if (!m_blockstack.top().braceLevel) {
                             parseError(fL1S("Excess closing brace."));
                         } else if (!--m_blockstack.top().braceLevel
@@ -695,6 +696,20 @@ bool ProFileParser::read(ProFile *pro, const QString &in)
                         needSep = 0;
                         goto nextToken;
                     }
+                } else { // context == CtxValue
+                    if (c == '{') {
+                        ++parens;
+                    } else if (c == '}') {
+                        if (!parens) {
+                            FLUSH_RHS_LITERAL(false);
+                            tokPtr[-1] = litCount ? litCount + expCount : 0;
+                            tokPtr = ptr;
+                            putTok(tokPtr, TokValueTerminator);
+                            context = CtxTest;
+                            goto closeScope;
+                        }
+                        --parens;
+                    }
                 }
                 if (putSpace) {
                     putSpace = false;