diff options
author | Noel Power <noel.power@novell.com> | 2010-11-08 16:53:09 +0000 |
---|---|---|
committer | Noel Power <noel.power@novell.com> | 2010-11-08 16:57:57 +0000 |
commit | 81e857c1d7331bb1d9f2608d844d579e179e10d5 (patch) | |
tree | 96ca1e12a2869870631439902226c007bdbc2419 /basic/source/comp/exprtree.cxx | |
parent | b1f0e0298c71475a0d8bc17976cb7ae39e3acb93 (diff) |
in vba mode use proper logical operator precedence
Diffstat (limited to 'basic/source/comp/exprtree.cxx')
-rw-r--r-- | basic/source/comp/exprtree.cxx | 119 |
1 files changed, 115 insertions, 4 deletions
diff --git a/basic/source/comp/exprtree.cxx b/basic/source/comp/exprtree.cxx index 5622f3663ab8..6cf3f36a5646 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; |