[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