1*cdf0e10cSrcweir /************************************************************************* 2*cdf0e10cSrcweir * 3*cdf0e10cSrcweir * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. 4*cdf0e10cSrcweir * 5*cdf0e10cSrcweir * Copyright 2000, 2010 Oracle and/or its affiliates. 6*cdf0e10cSrcweir * 7*cdf0e10cSrcweir * OpenOffice.org - a multi-platform office productivity suite 8*cdf0e10cSrcweir * 9*cdf0e10cSrcweir * This file is part of OpenOffice.org. 10*cdf0e10cSrcweir * 11*cdf0e10cSrcweir * OpenOffice.org is free software: you can redistribute it and/or modify 12*cdf0e10cSrcweir * it under the terms of the GNU Lesser General Public License version 3 13*cdf0e10cSrcweir * only, as published by the Free Software Foundation. 14*cdf0e10cSrcweir * 15*cdf0e10cSrcweir * OpenOffice.org is distributed in the hope that it will be useful, 16*cdf0e10cSrcweir * but WITHOUT ANY WARRANTY; without even the implied warranty of 17*cdf0e10cSrcweir * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 18*cdf0e10cSrcweir * GNU Lesser General Public License version 3 for more details 19*cdf0e10cSrcweir * (a copy is included in the LICENSE file that accompanied this code). 20*cdf0e10cSrcweir * 21*cdf0e10cSrcweir * You should have received a copy of the GNU Lesser General Public License 22*cdf0e10cSrcweir * version 3 along with OpenOffice.org. If not, see 23*cdf0e10cSrcweir * <http://www.openoffice.org/license.html> 24*cdf0e10cSrcweir * for a copy of the LGPLv3 License. 25*cdf0e10cSrcweir * 26*cdf0e10cSrcweir ************************************************************************/ 27*cdf0e10cSrcweir 28*cdf0e10cSrcweir #ifndef _SYMTBL_HXX 29*cdf0e10cSrcweir #define _SYMTBL_HXX 30*cdf0e10cSrcweir 31*cdf0e10cSrcweir #include <svl/svarray.hxx> 32*cdf0e10cSrcweir #include <tools/string.hxx> 33*cdf0e10cSrcweir #include <basic/sbxdef.hxx> 34*cdf0e10cSrcweir #include <basic/sbdef.hxx> 35*cdf0e10cSrcweir 36*cdf0e10cSrcweir class SbiSymDef; // Basisklasse 37*cdf0e10cSrcweir class SbiProcDef; // Prozedur 38*cdf0e10cSrcweir class SbiConstDef; // Konstante 39*cdf0e10cSrcweir class SbiSymPool; // Symbol-Pool 40*cdf0e10cSrcweir class SbiStringPool; // gepoolte Strings 41*cdf0e10cSrcweir 42*cdf0e10cSrcweir class SvStream; 43*cdf0e10cSrcweir class SbiParser; 44*cdf0e10cSrcweir 45*cdf0e10cSrcweir enum SbiSymScope { SbLOCAL, SbPARAM, SbPUBLIC, SbGLOBAL, SbRTL }; 46*cdf0e10cSrcweir 47*cdf0e10cSrcweir /////////////////////////////////////////////////////////////////////////// 48*cdf0e10cSrcweir 49*cdf0e10cSrcweir // Der String-Pool nimmt String-Eintraege auf und sorgt dafuer, 50*cdf0e10cSrcweir // dass sie nicht doppelt vorkommen. 51*cdf0e10cSrcweir 52*cdf0e10cSrcweir SV_DECL_PTRARR_DEL(SbiStrings,String*,5,5) 53*cdf0e10cSrcweir 54*cdf0e10cSrcweir class SbiStringPool { // String-Pool 55*cdf0e10cSrcweir SbiStrings aData; // Daten 56*cdf0e10cSrcweir String aEmpty; // for convenience 57*cdf0e10cSrcweir SbiParser* pParser; // der Parser 58*cdf0e10cSrcweir public: 59*cdf0e10cSrcweir SbiStringPool( SbiParser* ); 60*cdf0e10cSrcweir ~SbiStringPool(); 61*cdf0e10cSrcweir sal_uInt16 GetSize() const { return aData.Count(); } 62*cdf0e10cSrcweir // AB 8.4.1999, Default wegen #64236 auf sal_True geaendert 63*cdf0e10cSrcweir // Wenn der Bug sauber behoben ist, wieder auf sal_False aendern. 64*cdf0e10cSrcweir short Add( const String&, sal_Bool=sal_True ); 65*cdf0e10cSrcweir short Add( double, SbxDataType ); 66*cdf0e10cSrcweir const String& Find( sal_uInt16 ) const; 67*cdf0e10cSrcweir SbiParser* GetParser() { return pParser; } 68*cdf0e10cSrcweir }; 69*cdf0e10cSrcweir 70*cdf0e10cSrcweir /////////////////////////////////////////////////////////////////////////// 71*cdf0e10cSrcweir 72*cdf0e10cSrcweir SV_DECL_PTRARR_DEL(SbiSymbols,SbiSymDef*,5,5) 73*cdf0e10cSrcweir 74*cdf0e10cSrcweir class SbiSymPool { // Symbol-Pool 75*cdf0e10cSrcweir friend class SbiSymDef; 76*cdf0e10cSrcweir friend class SbiProcDef; 77*cdf0e10cSrcweir protected: 78*cdf0e10cSrcweir SbiStringPool& rStrings; // verwendeter Stringpool 79*cdf0e10cSrcweir SbiSymbols aData; // Daten 80*cdf0e10cSrcweir SbiSymPool* pParent; // uebergeordneter Symbol-Pool 81*cdf0e10cSrcweir SbiParser* pParser; // der Parser 82*cdf0e10cSrcweir SbiSymScope eScope; // Scope des Pools 83*cdf0e10cSrcweir sal_uInt16 nProcId; // aktuelles ProcId fuer STATIC-Variable 84*cdf0e10cSrcweir sal_uInt16 nCur; // Iterator 85*cdf0e10cSrcweir public: 86*cdf0e10cSrcweir SbiSymPool( SbiStringPool&, SbiSymScope ); 87*cdf0e10cSrcweir ~SbiSymPool(); 88*cdf0e10cSrcweir 89*cdf0e10cSrcweir void Clear(); 90*cdf0e10cSrcweir 91*cdf0e10cSrcweir void SetParent( SbiSymPool* p ) { pParent = p; } 92*cdf0e10cSrcweir void SetProcId( short n ) { nProcId = n; } 93*cdf0e10cSrcweir sal_uInt16 GetSize() const { return aData.Count(); } 94*cdf0e10cSrcweir SbiSymScope GetScope() const { return eScope; } 95*cdf0e10cSrcweir void SetScope( SbiSymScope s ) { eScope = s; } 96*cdf0e10cSrcweir SbiParser* GetParser() { return pParser; } 97*cdf0e10cSrcweir 98*cdf0e10cSrcweir SbiSymDef* AddSym( const String& ); // Symbol hinzufuegen 99*cdf0e10cSrcweir SbiProcDef* AddProc( const String& );// Prozedur hinzufuegen 100*cdf0e10cSrcweir void Add( SbiSymDef* ); // Symbol uebernehmen 101*cdf0e10cSrcweir SbiSymDef* Find( const String& ) const;// Variablenname 102*cdf0e10cSrcweir SbiSymDef* FindId( sal_uInt16 ) const; // Variable per ID suchen 103*cdf0e10cSrcweir SbiSymDef* Get( sal_uInt16 ) const; // Variable per Position suchen 104*cdf0e10cSrcweir SbiSymDef* First(), *Next(); // Iteratoren 105*cdf0e10cSrcweir 106*cdf0e10cSrcweir sal_uInt32 Define( const String& ); // Label definieren 107*cdf0e10cSrcweir sal_uInt32 Reference( const String& ); // Label referenzieren 108*cdf0e10cSrcweir void CheckRefs(); // offene Referenzen suchen 109*cdf0e10cSrcweir }; 110*cdf0e10cSrcweir 111*cdf0e10cSrcweir /////////////////////////////////////////////////////////////////////////// 112*cdf0e10cSrcweir 113*cdf0e10cSrcweir class SbiSymDef { // Allgemeiner Symboleintrag 114*cdf0e10cSrcweir friend class SbiSymPool; 115*cdf0e10cSrcweir protected: 116*cdf0e10cSrcweir String aName; // Name des Eintrags 117*cdf0e10cSrcweir SbxDataType eType; // Typ des Eintrags 118*cdf0e10cSrcweir SbiSymPool* pIn; // Parent-Pool 119*cdf0e10cSrcweir SbiSymPool* pPool; // Pool fuer Unterelemente 120*cdf0e10cSrcweir short nLen; // Stringlaenge bei STRING*n 121*cdf0e10cSrcweir short nDims; // Array-Dimensionen 122*cdf0e10cSrcweir sal_uInt16 nId; // Symbol-Nummer 123*cdf0e10cSrcweir sal_uInt16 nTypeId; // String-ID des Datentyps (Dim X AS Dytentyp) 124*cdf0e10cSrcweir sal_uInt16 nProcId; // aktuelles ProcId fuer STATIC-Variable 125*cdf0e10cSrcweir sal_uInt16 nPos; // Positions-Nummer 126*cdf0e10cSrcweir sal_uInt32 nChain; // Backchain-Kette 127*cdf0e10cSrcweir sal_Bool bNew : 1; // sal_True: Dim As New... 128*cdf0e10cSrcweir sal_Bool bChained : 1; // sal_True: Symbol ist in Code definiert 129*cdf0e10cSrcweir sal_Bool bByVal : 1; // sal_True: ByVal-Parameter 130*cdf0e10cSrcweir sal_Bool bOpt : 1; // sal_True: optionaler Parameter 131*cdf0e10cSrcweir sal_Bool bStatic : 1; // sal_True: STATIC-Variable 132*cdf0e10cSrcweir sal_Bool bAs : 1; // sal_True: Datentyp per AS XXX definiert 133*cdf0e10cSrcweir sal_Bool bGlobal : 1; // sal_True: Global-Variable 134*cdf0e10cSrcweir sal_Bool bParamArray : 1; // sal_True: ParamArray parameter 135*cdf0e10cSrcweir sal_Bool bWithEvents : 1; // sal_True: Declared WithEvents 136*cdf0e10cSrcweir sal_Bool bWithBrackets : 1; // sal_True: Followed by () 137*cdf0e10cSrcweir sal_uInt16 nDefaultId; // Symbol number of default value 138*cdf0e10cSrcweir short nFixedStringLength; // String length in: Dim foo As String*Length 139*cdf0e10cSrcweir public: 140*cdf0e10cSrcweir SbiSymDef( const String& ); 141*cdf0e10cSrcweir virtual ~SbiSymDef(); 142*cdf0e10cSrcweir virtual SbiProcDef* GetProcDef(); 143*cdf0e10cSrcweir virtual SbiConstDef* GetConstDef(); 144*cdf0e10cSrcweir 145*cdf0e10cSrcweir SbxDataType GetType() const { return eType; } 146*cdf0e10cSrcweir virtual void SetType( SbxDataType ); 147*cdf0e10cSrcweir const String& GetName(); 148*cdf0e10cSrcweir SbiSymScope GetScope() const; 149*cdf0e10cSrcweir sal_uInt16 GetProcId() const{ return nProcId; } 150*cdf0e10cSrcweir sal_uInt32 GetAddr() const { return nChain; } 151*cdf0e10cSrcweir sal_uInt16 GetId() const { return nId; } 152*cdf0e10cSrcweir sal_uInt16 GetTypeId() const{ return nTypeId; } 153*cdf0e10cSrcweir void SetTypeId( sal_uInt16 n ) { nTypeId = n; eType = SbxOBJECT; } 154*cdf0e10cSrcweir sal_uInt16 GetPos() const { return nPos; } 155*cdf0e10cSrcweir void SetLen( short n ){ nLen = n; } 156*cdf0e10cSrcweir short GetLen() const { return nLen; } 157*cdf0e10cSrcweir void SetDims( short n ) { nDims = n; } 158*cdf0e10cSrcweir short GetDims() const { return nDims; } 159*cdf0e10cSrcweir sal_Bool IsDefined() const{ return bChained; } 160*cdf0e10cSrcweir void SetOptional() { bOpt = sal_True; } 161*cdf0e10cSrcweir void SetParamArray() { bParamArray = sal_True; } 162*cdf0e10cSrcweir void SetWithEvents() { bWithEvents = sal_True; } 163*cdf0e10cSrcweir void SetWithBrackets(){ bWithBrackets = sal_True; } 164*cdf0e10cSrcweir void SetByVal( sal_Bool bByVal_ = sal_True ) 165*cdf0e10cSrcweir { bByVal = bByVal_; } 166*cdf0e10cSrcweir void SetStatic( sal_Bool bAsStatic = sal_True ) { bStatic = bAsStatic; } 167*cdf0e10cSrcweir void SetNew() { bNew = sal_True; } 168*cdf0e10cSrcweir void SetDefinedAs() { bAs = sal_True; } 169*cdf0e10cSrcweir void SetGlobal(sal_Bool b){ bGlobal = b; } 170*cdf0e10cSrcweir void SetDefaultId( sal_uInt16 n ) { nDefaultId = n; } 171*cdf0e10cSrcweir sal_uInt16 GetDefaultId( void ) { return nDefaultId; } 172*cdf0e10cSrcweir sal_Bool IsOptional() const{ return bOpt; } 173*cdf0e10cSrcweir sal_Bool IsParamArray() const{ return bParamArray; } 174*cdf0e10cSrcweir sal_Bool IsWithEvents() const{ return bWithEvents; } 175*cdf0e10cSrcweir sal_Bool IsWithBrackets() const{ return bWithBrackets; } 176*cdf0e10cSrcweir sal_Bool IsByVal() const { return bByVal; } 177*cdf0e10cSrcweir sal_Bool IsStatic() const { return bStatic; } 178*cdf0e10cSrcweir sal_Bool IsNew() const { return bNew; } 179*cdf0e10cSrcweir sal_Bool IsDefinedAs() const { return bAs; } 180*cdf0e10cSrcweir sal_Bool IsGlobal() const { return bGlobal; } 181*cdf0e10cSrcweir short GetFixedStringLength( void ) const { return nFixedStringLength; } 182*cdf0e10cSrcweir void SetFixedStringLength( short n ) { nFixedStringLength = n; } 183*cdf0e10cSrcweir 184*cdf0e10cSrcweir SbiSymPool& GetPool(); 185*cdf0e10cSrcweir sal_uInt32 Define(); // Symbol in Code definieren 186*cdf0e10cSrcweir sal_uInt32 Reference(); // Symbol in Code referenzieren 187*cdf0e10cSrcweir 188*cdf0e10cSrcweir private: 189*cdf0e10cSrcweir SbiSymDef( const SbiSymDef& ); 190*cdf0e10cSrcweir 191*cdf0e10cSrcweir }; 192*cdf0e10cSrcweir 193*cdf0e10cSrcweir class SbiProcDef : public SbiSymDef { // Prozedur-Definition (aus Basic): 194*cdf0e10cSrcweir SbiSymPool aParams; // Parameter 195*cdf0e10cSrcweir SbiSymPool aLabels; // lokale Sprungziele 196*cdf0e10cSrcweir String aLibName; // LIB "name" 197*cdf0e10cSrcweir String aAlias; // ALIAS "name" 198*cdf0e10cSrcweir sal_uInt16 nLine1, nLine2; // Zeilenbereich 199*cdf0e10cSrcweir PropertyMode mePropMode; // Marks if this is a property procedure and which 200*cdf0e10cSrcweir String maPropName; // Property name if property procedure (!= proc name) 201*cdf0e10cSrcweir sal_Bool bCdecl : 1; // sal_True: CDECL angegeben 202*cdf0e10cSrcweir sal_Bool bPublic : 1; // sal_True: proc ist PUBLIC 203*cdf0e10cSrcweir sal_Bool mbProcDecl : 1; // sal_True: instanciated by SbiParser::ProcDecl 204*cdf0e10cSrcweir public: 205*cdf0e10cSrcweir SbiProcDef( SbiParser*, const String&, sal_Bool bProcDecl=false ); 206*cdf0e10cSrcweir virtual ~SbiProcDef(); 207*cdf0e10cSrcweir virtual SbiProcDef* GetProcDef(); 208*cdf0e10cSrcweir virtual void SetType( SbxDataType ); 209*cdf0e10cSrcweir SbiSymPool& GetParams() { return aParams; } 210*cdf0e10cSrcweir SbiSymPool& GetLabels() { return aLabels; } 211*cdf0e10cSrcweir SbiSymPool& GetLocals() { return GetPool();} 212*cdf0e10cSrcweir String& GetLib() { return aLibName; } 213*cdf0e10cSrcweir String& GetAlias() { return aAlias; } 214*cdf0e10cSrcweir void SetPublic( sal_Bool b ) { bPublic = b; } 215*cdf0e10cSrcweir sal_Bool IsPublic() const { return bPublic; } 216*cdf0e10cSrcweir void SetCdecl( sal_Bool b = sal_True) { bCdecl = b; } 217*cdf0e10cSrcweir sal_Bool IsCdecl() const { return bCdecl; } 218*cdf0e10cSrcweir sal_Bool IsUsedForProcDecl() const { return mbProcDecl; } 219*cdf0e10cSrcweir void SetLine1( sal_uInt16 n ) { nLine1 = n; } 220*cdf0e10cSrcweir sal_uInt16 GetLine1() const { return nLine1; } 221*cdf0e10cSrcweir void SetLine2( sal_uInt16 n ) { nLine2 = n; } 222*cdf0e10cSrcweir sal_uInt16 GetLine2() const { return nLine2; } 223*cdf0e10cSrcweir PropertyMode getPropertyMode() { return mePropMode; } 224*cdf0e10cSrcweir void setPropertyMode( PropertyMode ePropMode ); 225*cdf0e10cSrcweir const String& GetPropName() { return maPropName; } 226*cdf0e10cSrcweir 227*cdf0e10cSrcweir // Match mit einer Forward-Deklaration. Die Parameternamen 228*cdf0e10cSrcweir // werden abgeglichen und die Forward-Deklaration wird 229*cdf0e10cSrcweir // durch this ersetzt 230*cdf0e10cSrcweir void Match( SbiProcDef* pForward ); 231*cdf0e10cSrcweir 232*cdf0e10cSrcweir private: 233*cdf0e10cSrcweir SbiProcDef( const SbiProcDef& ); 234*cdf0e10cSrcweir 235*cdf0e10cSrcweir }; 236*cdf0e10cSrcweir 237*cdf0e10cSrcweir class SbiConstDef : public SbiSymDef 238*cdf0e10cSrcweir { 239*cdf0e10cSrcweir double nVal; 240*cdf0e10cSrcweir String aVal; 241*cdf0e10cSrcweir public: 242*cdf0e10cSrcweir SbiConstDef( const String& ); 243*cdf0e10cSrcweir virtual ~SbiConstDef(); 244*cdf0e10cSrcweir virtual SbiConstDef* GetConstDef(); 245*cdf0e10cSrcweir void Set( double, SbxDataType ); 246*cdf0e10cSrcweir void Set( const String& ); 247*cdf0e10cSrcweir double GetValue() { return nVal; } 248*cdf0e10cSrcweir const String& GetString() { return aVal; } 249*cdf0e10cSrcweir }; 250*cdf0e10cSrcweir 251*cdf0e10cSrcweir 252*cdf0e10cSrcweir #endif 253*cdf0e10cSrcweir 254