[Libreoffice-commits] .: basic/source

Noel Power noelp at kemper.freedesktop.org
Mon Nov 8 08:58:25 PST 2010


 basic/source/comp/exprtree.cxx |  119 +++++++++++++++++++++++++++++++++++++++--
 basic/source/inc/expr.hxx      |    6 ++
 2 files changed, 121 insertions(+), 4 deletions(-)

New commits:
commit 72ea99b811c7a3886353a4249b196b5fb4147fa0
Author: Noel Power <noel.power at novell.com>
Date:   Mon Nov 8 16:53:09 2010 +0000

    in vba mode use proper logical operator precedence

diff --git a/basic/source/comp/exprtree.cxx b/basic/source/comp/exprtree.cxx
index 1c835fb..b492c79 100644
--- a/basic/source/comp/exprtree.cxx
+++ b/basic/source/comp/exprtree.cxx
@@ -583,13 +583,19 @@ SbiExprNode* SbiExpression::Unary()
     {
         case MINUS:
             eTok = NEG;
-        case NOT:
             pParser->Next();
-            // process something like "Do While Not "foo"="" "
+            pNd = new SbiExprNode( pParser, Unary(), eTok, NULL );
+            break;
+        case NOT:
             if( pParser->IsVBASupportOn() )
-                pNd = new SbiExprNode( pParser, Like(), eTok, NULL );
+            {
+                pNd = Operand();
+            }
             else
+            {
+                pParser->Next();
                 pNd = new SbiExprNode( pParser, Unary(), eTok, NULL );
+            }
             break;
         case PLUS:
             pParser->Next();
@@ -734,9 +740,114 @@ SbiExprNode* SbiExpression::Comp()
     return pNd;
 }
 
+
+SbiExprNode* SbiExpression::VBA_Not()
+{
+    SbiExprNode* pNd = NULL;
+
+    SbiToken eTok = pParser->Peek();
+    if( eTok == NOT )
+    {
+        pParser->Next();
+        pNd = new SbiExprNode( pParser, VBA_Not(), eTok, NULL );
+    }
+    else
+    {
+        pNd = Comp();
+    }
+    return pNd;
+}
+
+SbiExprNode* SbiExpression::VBA_And()
+{
+    SbiExprNode* pNd = VBA_Not();
+    if( m_eMode != EXPRMODE_EMPTY_PAREN )
+    {
+        for( ;; )
+        {
+            SbiToken eTok = pParser->Peek();
+            if( eTok != AND )
+                break;
+            eTok = pParser->Next();
+            pNd = new SbiExprNode( pParser, pNd, eTok, VBA_Not() );
+        }
+    }
+    return pNd;
+}
+
+SbiExprNode* SbiExpression::VBA_Or()
+{
+    SbiExprNode* pNd = VBA_And();
+    if( m_eMode != EXPRMODE_EMPTY_PAREN )
+    {
+        for( ;; )
+        {
+            SbiToken eTok = pParser->Peek();
+            if( eTok != OR )
+                break;
+            eTok = pParser->Next();
+            pNd = new SbiExprNode( pParser, pNd, eTok, VBA_And() );
+        }
+    }
+    return pNd;
+}
+
+SbiExprNode* SbiExpression::VBA_Xor()
+{
+    SbiExprNode* pNd = VBA_Or();
+    if( m_eMode != EXPRMODE_EMPTY_PAREN )
+    {
+        for( ;; )
+        {
+            SbiToken eTok = pParser->Peek();
+            if( eTok != XOR )
+                break;
+            eTok = pParser->Next();
+            pNd = new SbiExprNode( pParser, pNd, eTok, VBA_Or() );
+        }
+    }
+    return pNd;
+
+}
+
+SbiExprNode* SbiExpression::VBA_Eqv()
+{
+    SbiExprNode* pNd = VBA_Xor();
+    if( m_eMode != EXPRMODE_EMPTY_PAREN )
+    {
+        for( ;; )
+        {
+            SbiToken eTok = pParser->Peek();
+            if( eTok != EQV )
+                break;
+            eTok = pParser->Next();
+            pNd = new SbiExprNode( pParser, pNd, eTok, VBA_Xor() );
+        }
+    }
+    return pNd;
+}
+
+SbiExprNode* SbiExpression::VBA_Imp()
+{
+    SbiExprNode* pNd = VBA_Eqv();
+    if( m_eMode != EXPRMODE_EMPTY_PAREN )
+    {
+        for( ;; )
+        {
+            SbiToken eTok = pParser->Peek();
+            if( eTok != IMP )
+                break;
+            eTok = pParser->Next();
+            pNd = new SbiExprNode( pParser, pNd, eTok, VBA_Eqv() );
+        }
+    }
+    return pNd;
+
+}
+
 SbiExprNode* SbiExpression::Like()
 {
-    SbiExprNode* pNd = Comp();
+    SbiExprNode* pNd = pParser->IsVBASupportOn() ? VBA_Imp() : Comp();
     if( m_eMode != EXPRMODE_EMPTY_PAREN )
     {
         short nCount = 0;
diff --git a/basic/source/inc/expr.hxx b/basic/source/inc/expr.hxx
index 785ee8e..7aeab03 100644
--- a/basic/source/inc/expr.hxx
+++ b/basic/source/inc/expr.hxx
@@ -189,6 +189,12 @@ protected:
     SbiExprNode* AddSub();
     SbiExprNode* Cat();
     SbiExprNode* Like();
+    SbiExprNode* VBA_Not();
+    SbiExprNode* VBA_And();
+    SbiExprNode* VBA_Or();
+    SbiExprNode* VBA_Xor();
+    SbiExprNode* VBA_Eqv();
+    SbiExprNode* VBA_Imp();
     SbiExprNode* Comp();
     SbiExprNode* Boolean();
 public:


More information about the Libreoffice-commits mailing list