1 /*************************************************************************
3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
5 * Copyright 2008 by Sun Microsystems, Inc.
7 * OpenOffice.org - a multi-platform office productivity suite
9 * $RCSfile: expr.hxx,v $
10 * $Revision: 1.15.40.1 $
12 * This file is part of OpenOffice.org.
14 * OpenOffice.org is free software: you can redistribute it and/or modify
15 * it under the terms of the GNU Lesser General Public License version 3
16 * only, as published by the Free Software Foundation.
18 * OpenOffice.org is distributed in the hope that it will be useful,
19 * but WITHOUT ANY WARRANTY; without even the implied warranty of
20 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
21 * GNU Lesser General Public License version 3 for more details
22 * (a copy is included in the LICENSE file that accompanied this code).
24 * You should have received a copy of the GNU Lesser General Public License
25 * version 3 along with OpenOffice.org. If not, see
26 * <http://www.openoffice.org/license.html>
27 * for a copy of the LGPLv3 License.
29 ************************************************************************/
34 #include "opcodes.hxx"
49 typedef ::std::vector
<SbiExprList
*> SbiExprListVector
;
51 struct SbVar
{ // Variablen-Element:
52 SbiExprNode
* pNext
; // Weiteres Element (bei Strukturen)
53 SbiSymDef
* pDef
; // Symboldefinition
54 SbiExprList
* pPar
; // optionale Parameter (wird geloescht)
55 SbiExprListVector
* pvMorePar
; // Array of arrays foo(pPar)(avMorePar[0])(avMorePar[1])...
58 enum SbiExprType
{ // Expression-Typen:
59 SbSTDEXPR
, // normaler Ausdruck
60 SbLVALUE
, // beliebiger lValue
61 SbSYMBOL
, // beliebiges zusammengesetztes Symbol
62 SbOPERAND
// Variable/Funktion
65 enum SbiExprMode
{ // Expression context:
66 EXPRMODE_STANDARD
, // default
67 EXPRMODE_STANDALONE
, // a param1, param2 OR a( param1, param2 ) = 42
68 EXPRMODE_LPAREN_PENDING
, // start of parameter list with bracket, special handling
69 EXPRMODE_LPAREN_NOT_NEEDED
, // pending LPAREN has not been used
70 EXPRMODE_ARRAY_OR_OBJECT
, // '=' or '(' or '.' found after ')' on ParenLevel 0, stopping
71 // expression, assuming array syntax a(...)[(...)] = ?
73 EXPRMODE_EMPTY_PAREN
// It turned out that the paren don't contain anything: a()
77 SbxNUMVAL
, // nVal = Wert
78 SbxSTRVAL
, // aStrVal = Wert, before #i59791/#i45570: nStringId = Wert
79 SbxVARVAL
, // aVar = Wert
80 SbxTYPEOF
, // TypeOf ObjExpr Is Type
92 class SbiExprNode
{ // Operatoren (und Operanden)
93 friend class SbiExpression
;
94 friend class SbiConstExpression
;
96 USHORT nTypeStrId
; // gepoolter String-ID, #i59791/#i45570 Now only for TypeOf
97 double nVal
; // numerischer Wert
98 SbVar aVar
; // oder Variable
100 String aStrVal
; // #i59791/#i45570 Store string directly
101 SbiExprNode
* pLeft
; // linker Zweig
102 SbiExprNode
* pRight
; // rechter Zweig (NULL bei unaeren Ops)
103 SbiExprNode
* pWithParent
; // Knoten, dessen Member this per with ist
104 SbiCodeGen
* pGen
; // Code-Generator
105 SbiNodeType eNodeType
; // Art des Nodes
106 SbxDataType eType
; // aktueller Datentyp
107 SbiToken eTok
; // Token des Operators
108 BOOL bComposite
; // TRUE: Zusammengesetzter Ausdruck
109 BOOL bError
; // TRUE: Fehlerhaft
110 void FoldConstants(); // Constant Folding durchfuehren
111 void CollectBits(); // Umwandeln von Zahlen in Strings
112 BOOL
IsOperand() // TRUE, wenn Operand
113 { return BOOL( eNodeType
!= SbxNODE
&& eNodeType
!= SbxTYPEOF
); }
115 { return BOOL( eNodeType
== SbxTYPEOF
); }
116 BOOL
IsNumber(); // TRUE bei Zahlen
117 BOOL
IsString(); // TRUE bei Strings
118 BOOL
IsLvalue(); // TRUE, falls als Lvalue verwendbar
119 void GenElement( SbiOpcode
); // Element
120 void BaseInit( SbiParser
* p
); // Hilfsfunktion fuer Ctor, AB 17.12.95
123 SbiExprNode( SbiParser
*, double, SbxDataType
);
124 SbiExprNode( SbiParser
*, const String
& );
125 SbiExprNode( SbiParser
*, const SbiSymDef
&, SbxDataType
, SbiExprList
* = NULL
);
126 SbiExprNode( SbiParser
*, SbiExprNode
*, SbiToken
, SbiExprNode
* );
127 SbiExprNode( SbiParser
*, SbiExprNode
*, USHORT
); // #120061 TypeOf
128 virtual ~SbiExprNode();
130 BOOL
IsValid() { return BOOL( !bError
); }
131 BOOL
IsConstant() // TRUE bei konstantem Operanden
132 { return BOOL( eNodeType
== SbxSTRVAL
|| eNodeType
== SbxNUMVAL
); }
133 BOOL
IsIntConst(); // TRUE bei Integer-Konstanten
134 BOOL
IsVariable(); // TRUE, wenn Variable
136 SbiExprNode
* GetWithParent() { return pWithParent
; }
137 void SetWithParent( SbiExprNode
* p
) { pWithParent
= p
; }
139 SbxDataType
GetType() { return eType
; }
140 void SetType( SbxDataType eTp
) { eType
= eTp
; }
141 SbiNodeType
GetNodeType() { return eNodeType
; }
142 SbiSymDef
* GetVar(); // Variable (falls vorhanden)
143 SbiSymDef
* GetRealVar(); // letzte Variable in x.y.z
144 SbiExprNode
* GetRealNode(); // letzter Knoten in x.y.z
145 short GetDepth(); // Tiefe eines Baumes berechnen
146 const String
& GetString() { return aStrVal
; }
147 short GetNumber() { return (short)nVal
; }
148 SbiExprList
* GetParameters() { return aVar
.pPar
; }
149 SbiExprListVector
* GetMoreParameters() { return aVar
.pvMorePar
; }
151 void Optimize(); // Baumabgleich
153 void Gen( RecursiveMode eRecMode
= UNDEFINED
); // Ausgabe eines Nodes
156 class SbiExpression
{ // der Ausdruck:
157 friend class SbiExprList
;
158 friend class SbiParameters
;
159 friend class SbiDimList
;
161 String aArgName
; // Name fuer bananntes Argument
162 SbiParser
* pParser
; // fuer Fehlermeldungen, Parsing
163 SbiExpression
* pNext
; // Link bei Parameterlisten
164 SbiExprNode
* pExpr
; // Der Expression-Baum
165 SbiExprType eCurExpr
; // Art des Ausdrucks
166 SbiExprMode m_eMode
; // Expression context
167 BOOL bBased
; // TRUE: einfacher DIM-Teil (+BASE)
168 BOOL bError
; // TRUE: Fehler
169 BOOL bByVal
; // TRUE: ByVal-Parameter
170 BOOL bBracket
; // TRUE: Parameter list with brackets
173 SbiExprNode
* ObjTerm( SbiSymDef
& );
174 SbiExprNode
* Operand();
175 SbiExprNode
* Unary();
177 SbiExprNode
* MulDiv();
178 SbiExprNode
* IntDiv();
180 SbiExprNode
* AddSub();
184 SbiExprNode
* Boolean();
186 SbiExpression( SbiParser
*, SbiExprType
= SbSTDEXPR
, SbiExprMode eMode
= EXPRMODE_STANDARD
); // Parsender Ctor
187 SbiExpression( SbiParser
*, const String
& );
188 SbiExpression( SbiParser
*, double, SbxDataType
= SbxDOUBLE
);
189 SbiExpression( SbiParser
*, const SbiSymDef
&, SbiExprList
* = NULL
);
190 SbiExpression( SbiParser
*, SbiToken
); // Spezial-Expr mit Spezial-Tokens
192 String
& GetName() { return aArgName
; }
193 void SetBased() { bBased
= TRUE
; }
194 BOOL
IsBased() { return bBased
; }
195 void SetByVal() { bByVal
= TRUE
; }
196 BOOL
IsByVal() { return bByVal
; }
197 BOOL
IsBracket() { return bBracket
; }
198 BOOL
IsValid() { return pExpr
->IsValid(); }
199 BOOL
IsConstant() { return pExpr
->IsConstant(); }
200 BOOL
IsVariable() { return pExpr
->IsVariable(); }
201 BOOL
IsLvalue() { return pExpr
->IsLvalue(); }
202 BOOL
IsIntConstant() { return pExpr
->IsIntConst(); }
203 const String
& GetString() { return pExpr
->GetString(); }
204 SbiSymDef
* GetVar() { return pExpr
->GetVar(); }
205 SbiSymDef
* GetRealVar() { return pExpr
->GetRealVar(); }
206 SbiExprNode
* GetExprNode() { return pExpr
; }
207 SbxDataType
GetType() { return pExpr
->GetType(); }
208 void SetType( SbxDataType eType
){ pExpr
->eType
= eType
; }
209 void Gen( RecursiveMode eRecMode
= UNDEFINED
); // Ausgabe eines Nodes
212 class SbiConstExpression
: public SbiExpression
{
216 public: // numerische Konstante
217 SbiConstExpression( SbiParser
* );
218 SbxDataType
GetType() { return eType
; }
219 const String
& GetString() { return aVal
; }
220 double GetValue() { return nVal
; }
221 short GetShortValue();
224 class SbiExprList
{ // Basisklasse fuer Parameter und Dims
226 SbiParser
* pParser
; // Parser
227 SbiExpression
* pFirst
; // Expressions
228 SbiProcDef
* pProc
; // DECLARE-Funktion (Parameter-Anpassung)
229 short nExpr
; // Anzahl Expressions
230 short nDim
; // Anzahl Dimensionen
231 BOOL bError
; // TRUE: Fehler
232 BOOL bBracket
; // TRUE: Klammern
234 SbiExprList( SbiParser
* );
235 virtual ~SbiExprList();
236 BOOL
IsBracket() { return bBracket
; }
237 BOOL
IsValid() { return BOOL( !bError
); }
238 short GetSize() { return nExpr
; }
239 short GetDims() { return nDim
; }
240 SbiExpression
* Get( short );
241 BOOL
Test( const SbiProcDef
& ); // Parameter-Checks
242 void Gen(); // Code-Erzeugung
243 // Setzen einer Funktionsdefinition zum Abgleich der Parameter
244 void SetProc( SbiProcDef
* p
) { pProc
= p
; }
245 void addExpression( SbiExpression
* pExpr
);
248 class SbiParameters
: public SbiExprList
{
250 SbiParameters( SbiParser
*, BOOL bConst
= FALSE
, BOOL bPar
= TRUE
);// parsender Ctor
253 class SbiDimList
: public SbiExprList
{
254 BOOL bConst
; // TRUE: Alles sind Integer-Konstanten
256 SbiDimList( SbiParser
* ); // Parsender Ctor
257 BOOL
IsConstant() { return bConst
; }