|  | /************************************************************** | 
|  | * | 
|  | * Licensed to the Apache Software Foundation (ASF) under one | 
|  | * or more contributor license agreements.  See the NOTICE file | 
|  | * distributed with this work for additional information | 
|  | * regarding copyright ownership.  The ASF licenses this file | 
|  | * to you under the Apache License, Version 2.0 (the | 
|  | * "License"); you may not use this file except in compliance | 
|  | * with the License.  You may obtain a copy of the License at | 
|  | * | 
|  | *   http://www.apache.org/licenses/LICENSE-2.0 | 
|  | * | 
|  | * Unless required by applicable law or agreed to in writing, | 
|  | * software distributed under the License is distributed on an | 
|  | * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY | 
|  | * KIND, either express or implied.  See the License for the | 
|  | * specific language governing permissions and limitations | 
|  | * under the License. | 
|  | * | 
|  | *************************************************************/ | 
|  |  | 
|  |  | 
|  |  | 
|  | #ifndef _EXPR_HXX | 
|  | #define _EXPR_HXX | 
|  |  | 
|  | #include "opcodes.hxx" | 
|  | #include "token.hxx" | 
|  |  | 
|  | class SbiExprNode; | 
|  | class SbiExpression; | 
|  | class SbiExprList; | 
|  | class SbiDimList; | 
|  | class SbiParameters; | 
|  | class SbiParser; | 
|  | class SbiCodeGen; | 
|  | class SbiSymDef; | 
|  | class SbiProcDef; | 
|  |  | 
|  |  | 
|  | #include <vector> | 
|  | typedef ::std::vector<SbiExprList*> SbiExprListVector; | 
|  |  | 
|  | struct SbVar {                      // Variablen-Element: | 
|  | SbiExprNode*        pNext;		// Weiteres Element (bei Strukturen) | 
|  | SbiSymDef*          pDef;		// Symboldefinition | 
|  | SbiExprList*        pPar;		// optionale Parameter (wird geloescht) | 
|  | SbiExprListVector*  pvMorePar;  // Array of arrays foo(pPar)(avMorePar[0])(avMorePar[1])... | 
|  | }; | 
|  |  | 
|  | struct KeywordSymbolInfo | 
|  | { | 
|  | String			m_aKeywordSymbol; | 
|  | SbxDataType		m_eSbxDataType; | 
|  | SbiToken		m_eTok; | 
|  | }; | 
|  |  | 
|  | enum SbiExprType {					// Expression-Typen: | 
|  | SbSTDEXPR,                      // normaler Ausdruck | 
|  | SbLVALUE,                       // beliebiger lValue | 
|  | SbSYMBOL,                       // beliebiges zusammengesetztes Symbol | 
|  | SbOPERAND						// Variable/Funktion | 
|  | }; | 
|  |  | 
|  | enum SbiExprMode {					// Expression context: | 
|  | EXPRMODE_STANDARD,              // default | 
|  | EXPRMODE_STANDALONE,            // a param1, param2 OR a( param1, param2 ) = 42 | 
|  | EXPRMODE_LPAREN_PENDING,        // start of parameter list with bracket, special handling | 
|  | EXPRMODE_LPAREN_NOT_NEEDED,     // pending LPAREN has not been used | 
|  | EXPRMODE_ARRAY_OR_OBJECT,       // '=' or '(' or '.' found after ')' on ParenLevel 0, stopping | 
|  | // expression, assuming array syntax a(...)[(...)] = ? | 
|  | // or a(...).b(...) | 
|  | EXPRMODE_EMPTY_PAREN            // It turned out that the paren don't contain anything: a() | 
|  | }; | 
|  |  | 
|  | enum SbiNodeType { | 
|  | SbxNUMVAL,                      // nVal = Wert | 
|  | SbxSTRVAL,                      // aStrVal = Wert, before #i59791/#i45570: nStringId = Wert | 
|  | SbxVARVAL,                      // aVar = Wert | 
|  | SbxTYPEOF,                      // TypeOf ObjExpr Is Type | 
|  | SbxNODE,						// Node | 
|  | SbxNEW,							// new <type> expression | 
|  | SbxDUMMY | 
|  | }; | 
|  |  | 
|  | enum RecursiveMode | 
|  | { | 
|  | UNDEFINED, | 
|  | FORCE_CALL, | 
|  | PREVENT_CALL | 
|  | }; | 
|  |  | 
|  | class SbiExprNode {                  // Operatoren (und Operanden) | 
|  | friend class SbiExpression; | 
|  | friend class SbiConstExpression; | 
|  | union { | 
|  | sal_uInt16 nTypeStrId; 	     	// gepoolter String-ID, #i59791/#i45570 Now only for TypeOf | 
|  | double nVal;                // numerischer Wert | 
|  | SbVar  aVar;                // oder Variable | 
|  | }; | 
|  | String aStrVal;					// #i59791/#i45570 Store string directly | 
|  | SbiExprNode* pLeft;             // linker Zweig | 
|  | SbiExprNode* pRight;            // rechter Zweig (NULL bei unaeren Ops) | 
|  | SbiExprNode* pWithParent;       // Knoten, dessen Member this per with ist | 
|  | SbiCodeGen*  pGen; 				// Code-Generator | 
|  | SbiNodeType  eNodeType;         // Art des Nodes | 
|  | SbxDataType eType;              // aktueller Datentyp | 
|  | SbiToken     eTok;              // Token des Operators | 
|  | sal_Bool  bComposite;				// sal_True: Zusammengesetzter Ausdruck | 
|  | sal_Bool  bError; 	                // sal_True: Fehlerhaft | 
|  | void  FoldConstants();          // Constant Folding durchfuehren | 
|  | void  CollectBits();            // Umwandeln von Zahlen in Strings | 
|  | sal_Bool  IsOperand()               // sal_True, wenn Operand | 
|  | { return sal_Bool( eNodeType != SbxNODE && eNodeType != SbxTYPEOF && eNodeType != SbxNEW ); } | 
|  | sal_Bool  IsTypeOf() | 
|  | { return sal_Bool( eNodeType == SbxTYPEOF ); } | 
|  | sal_Bool  IsNew() | 
|  | { return sal_Bool( eNodeType == SbxNEW ); } | 
|  | sal_Bool  IsNumber();               // sal_True bei Zahlen | 
|  | sal_Bool  IsString();               // sal_True bei Strings | 
|  | sal_Bool  IsLvalue();               // sal_True, falls als Lvalue verwendbar | 
|  | void  GenElement( SbiOpcode );  // Element | 
|  | void  BaseInit( SbiParser* p );	// Hilfsfunktion fuer Ctor, AB 17.12.95 | 
|  | public: | 
|  | SbiExprNode( void ); | 
|  | SbiExprNode( SbiParser*, double, SbxDataType ); | 
|  | SbiExprNode( SbiParser*, const String& ); | 
|  | SbiExprNode( SbiParser*, const SbiSymDef&, SbxDataType, SbiExprList* = NULL ); | 
|  | SbiExprNode( SbiParser*, SbiExprNode*, SbiToken, SbiExprNode* ); | 
|  | SbiExprNode( SbiParser*, SbiExprNode*, sal_uInt16 );	// #120061 TypeOf | 
|  | SbiExprNode( SbiParser*, sal_uInt16 );					// new <type> | 
|  | virtual ~SbiExprNode(); | 
|  |  | 
|  | sal_Bool IsValid()                  { return sal_Bool( !bError ); } | 
|  | sal_Bool IsConstant()               // sal_True bei konstantem Operanden | 
|  | { return sal_Bool( eNodeType == SbxSTRVAL || eNodeType == SbxNUMVAL ); } | 
|  | sal_Bool IsIntConst();              // sal_True bei Integer-Konstanten | 
|  | sal_Bool IsVariable();              // sal_True, wenn Variable | 
|  |  | 
|  | SbiExprNode* GetWithParent()			{ return pWithParent; } | 
|  | void SetWithParent( SbiExprNode* p )	{ pWithParent = p; } | 
|  |  | 
|  | SbxDataType GetType()           { return eType; } | 
|  | void SetType( SbxDataType eTp )	{ eType = eTp; } | 
|  | SbiNodeType GetNodeType()       { return eNodeType; } | 
|  | SbiSymDef* GetVar();			// Variable (falls vorhanden) | 
|  | SbiSymDef* GetRealVar();		// letzte Variable in x.y.z | 
|  | SbiExprNode* GetRealNode();		// letzter Knoten in x.y.z | 
|  | short GetDepth();               // Tiefe eines Baumes berechnen | 
|  | const String& GetString() 		{ return aStrVal; } | 
|  | short GetNumber() 				{ return (short)nVal; } | 
|  | SbiExprList* GetParameters()	{ return aVar.pPar; } | 
|  | SbiExprListVector* GetMoreParameters()	{ return aVar.pvMorePar; } | 
|  |  | 
|  | void Optimize();                // Baumabgleich | 
|  |  | 
|  | void Gen( RecursiveMode eRecMode = UNDEFINED );	// Ausgabe eines Nodes | 
|  | }; | 
|  |  | 
|  | class SbiExpression {                // der Ausdruck: | 
|  | friend class SbiExprList; | 
|  | friend class SbiParameters; | 
|  | friend class SbiDimList; | 
|  | protected: | 
|  | String 		  aArgName;         // Name fuer bananntes Argument | 
|  | SbiParser* 	  pParser;			// fuer Fehlermeldungen, Parsing | 
|  | SbiExpression* pNext;            // Link bei Parameterlisten | 
|  | SbiExprNode*   pExpr;            // Der Expression-Baum | 
|  | SbiExprType	  eCurExpr;			// Art des Ausdrucks | 
|  | SbiExprMode   m_eMode;			// Expression context | 
|  | sal_Bool  		  bBased;			// sal_True: einfacher DIM-Teil (+BASE) | 
|  | sal_Bool          bError;           // sal_True: Fehler | 
|  | sal_Bool          bByVal;           // sal_True: ByVal-Parameter | 
|  | sal_Bool          bBracket;         // sal_True: Parameter list with brackets | 
|  | sal_uInt16        nParenLevel; | 
|  | SbiExprNode* Term( const KeywordSymbolInfo* pKeywordSymbolInfo = NULL ); | 
|  | SbiExprNode* ObjTerm( SbiSymDef& ); | 
|  | SbiExprNode* Operand( bool bUsedForTypeOf = false ); | 
|  | SbiExprNode* Unary(); | 
|  | SbiExprNode* Exp(); | 
|  | SbiExprNode* MulDiv(); | 
|  | SbiExprNode* IntDiv(); | 
|  | SbiExprNode* Mod(); | 
|  | SbiExprNode* AddSub(); | 
|  | SbiExprNode* Cat(); | 
|  | SbiExprNode* Like(); | 
|  | SbiExprNode* VBA_Not(); | 
|  | SbiExprNode* Comp(); | 
|  | SbiExprNode* Boolean(); | 
|  | public: | 
|  | SbiExpression( SbiParser*, SbiExprType = SbSTDEXPR, | 
|  | SbiExprMode eMode = EXPRMODE_STANDARD, const KeywordSymbolInfo* pKeywordSymbolInfo = NULL ); // Parsender Ctor | 
|  | SbiExpression( SbiParser*, const String& ); | 
|  | SbiExpression( SbiParser*, double, SbxDataType = SbxDOUBLE ); | 
|  | SbiExpression( SbiParser*, const SbiSymDef&, SbiExprList* = NULL ); | 
|  | SbiExpression( SbiParser*, SbiToken );        // Spezial-Expr mit Spezial-Tokens | 
|  | ~SbiExpression(); | 
|  | String& GetName()               { return aArgName;            } | 
|  | void SetBased()					{ bBased = sal_True; 			  } | 
|  | sal_Bool IsBased()					{ return bBased; 			  } | 
|  | void SetByVal()                 { bByVal = sal_True;              } | 
|  | sal_Bool IsByVal()                  { return bByVal;              } | 
|  | sal_Bool IsBracket()                { return bBracket;            } | 
|  | sal_Bool IsValid()                  { return pExpr->IsValid();    } | 
|  | sal_Bool IsConstant()               { return pExpr->IsConstant(); } | 
|  | sal_Bool IsVariable()               { return pExpr->IsVariable(); } | 
|  | sal_Bool IsLvalue()                 { return pExpr->IsLvalue();   } | 
|  | sal_Bool IsIntConstant()            { return pExpr->IsIntConst(); } | 
|  | const String& GetString()       { return pExpr->GetString();  } | 
|  | SbiSymDef* GetVar()             { return pExpr->GetVar();     } | 
|  | SbiSymDef* GetRealVar()         { return pExpr->GetRealVar(); } | 
|  | SbiExprNode* GetExprNode()		{ return pExpr; } | 
|  | SbxDataType GetType()           { return pExpr->GetType();    } | 
|  | void SetType( SbxDataType eType){ pExpr->eType = eType;       } | 
|  | void Gen( RecursiveMode eRecMode = UNDEFINED );	// Ausgabe eines Nodes | 
|  | }; | 
|  |  | 
|  | class SbiConstExpression : public SbiExpression { | 
|  | double nVal; | 
|  | String aVal; | 
|  | SbxDataType eType; | 
|  | public:                             // numerische Konstante | 
|  | SbiConstExpression( SbiParser* ); | 
|  | SbxDataType GetType() { return eType; } | 
|  | const String& GetString() { return aVal; } | 
|  | double GetValue() { return nVal; } | 
|  | short GetShortValue(); | 
|  | }; | 
|  |  | 
|  | class SbiExprList {                  // Basisklasse fuer Parameter und Dims | 
|  | protected: | 
|  | SbiParser* pParser;				// Parser | 
|  | SbiExpression* pFirst;          // Expressions | 
|  | short nExpr;                    // Anzahl Expressions | 
|  | short nDim;						// Anzahl Dimensionen | 
|  | sal_Bool  bError;                   // sal_True: Fehler | 
|  | sal_Bool  bBracket;                 // sal_True: Klammern | 
|  | public: | 
|  | SbiExprList( SbiParser* ); | 
|  | virtual ~SbiExprList(); | 
|  | sal_Bool  IsBracket()               { return bBracket;        } | 
|  | sal_Bool  IsValid()                 { return sal_Bool( !bError ); } | 
|  | short GetSize()                 { return nExpr;           } | 
|  | short GetDims()                 { return nDim;     		  } | 
|  | SbiExpression* Get( short ); | 
|  | sal_Bool  Test( const SbiProcDef& );	// Parameter-Checks | 
|  | void  Gen();                    // Code-Erzeugung | 
|  | void addExpression( SbiExpression* pExpr ); | 
|  | }; | 
|  |  | 
|  | class SbiParameters : public SbiExprList { | 
|  | public: | 
|  | SbiParameters( SbiParser*, sal_Bool bConst = sal_False, sal_Bool bPar = sal_True);// parsender Ctor | 
|  | }; | 
|  |  | 
|  | class SbiDimList : public SbiExprList { | 
|  | sal_Bool  bConst;                   // sal_True: Alles sind Integer-Konstanten | 
|  | public: | 
|  | SbiDimList( SbiParser* );         // Parsender Ctor | 
|  | sal_Bool  IsConstant()              { return bConst; } | 
|  | }; | 
|  |  | 
|  | #endif |