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 | 72ea99b811c7a3886353a4249b196b5fb4147fa0 (patch) | |
tree | 383905636fd0c0e7aa3c35fe6f957ed41496be62 /basic | |
parent | 8c2f066e018635a74eb3b388c44ac0a2670b4bfc (diff) |
in vba mode use proper logical operator precedence
Diffstat (limited to 'basic')
-rw-r--r-- | basic/source/comp/exprtree.cxx | 119 | ||||
-rw-r--r-- | basic/source/inc/expr.hxx | 6 |
2 files changed, 121 insertions, 4 deletions
diff --git a/basic/source/comp/exprtree.cxx b/basic/source/comp/exprtree.cxx index 1c835fbf70..b492c794e0 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 785ee8e151..7aeab031f0 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: |