Files
libreoffice/basic/source/inc/expr.hxx

237 lines
9.7 KiB
C++
Raw Normal View History

2000-09-18 15:18:56 +00:00
/*************************************************************************
*
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* Copyright 2008 by Sun Microsystems, Inc.
*
* OpenOffice.org - a multi-platform office productivity suite
2000-09-18 15:18:56 +00:00
*
* $RCSfile: expr.hxx,v $
* $Revision: 1.13 $
2000-09-18 15:18:56 +00:00
*
* This file is part of OpenOffice.org.
2000-09-18 15:18:56 +00:00
*
* OpenOffice.org is free software: you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public License version 3
* only, as published by the Free Software Foundation.
2000-09-18 15:18:56 +00:00
*
* OpenOffice.org is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Lesser General Public License version 3 for more details
* (a copy is included in the LICENSE file that accompanied this code).
2000-09-18 15:18:56 +00:00
*
* You should have received a copy of the GNU Lesser General Public License
* version 3 along with OpenOffice.org. If not, see
* <http://www.openoffice.org/license.html>
* for a copy of the LGPLv3 License.
2000-09-18 15:18:56 +00:00
*
************************************************************************/
#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;
struct SbVar { // Variablen-Element:
SbiExprNode* pNext; // Weiteres Element (bei Strukturen)
SbiSymDef* pDef; // Symboldefinition
SbiExprList* pPar; // optionale Parameter (wird geloescht)
};
enum SbiExprType { // Expression-Typen:
SbSTDEXPR, // normaler Ausdruck
SbLVALUE, // beliebiger lValue
SbSYMBOL, // beliebiges zusammengesetztes Symbol
SbOPERAND // Variable/Funktion
};
enum SbiNodeType {
SbxNUMVAL, // nVal = Wert
SbxSTRVAL, // aStrVal = Wert, before #i59791/#i45570: nStringId = Wert
2000-09-18 15:18:56 +00:00
SbxVARVAL, // aVar = Wert
SbxTYPEOF, // TypeOf ObjExpr Is Type
2000-09-18 15:18:56 +00:00
SbxNODE // Node
};
enum RecursiveMode
{
UNDEFINED,
FORCE_CALL,
PREVENT_CALL
};
2000-09-18 15:18:56 +00:00
class SbiExprNode { // Operatoren (und Operanden)
friend class SbiExpression;
friend class SbiConstExpression;
union {
USHORT nTypeStrId; // gepoolter String-ID, #i59791/#i45570 Now only for TypeOf
2000-09-18 15:18:56 +00:00
double nVal; // numerischer Wert
SbVar aVar; // oder Variable
};
String aStrVal; // #i59791/#i45570 Store string directly
2000-09-18 15:18:56 +00:00
SbiExprNode* pLeft; // linker Zweig
SbiExprNode* pRight; // rechter Zweig (NULL bei unaeren Ops)
2000-10-10 12:02:28 +00:00
SbiExprNode* pWithParent; // Knoten, dessen Member this per with ist
2000-09-18 15:18:56 +00:00
SbiCodeGen* pGen; // Code-Generator
SbiNodeType eNodeType; // Art des Nodes
SbxDataType eType; // aktueller Datentyp
SbiToken eTok; // Token des Operators
BOOL bComposite; // TRUE: Zusammengesetzter Ausdruck
BOOL bError; // TRUE: Fehlerhaft
void FoldConstants(); // Constant Folding durchfuehren
void CollectBits(); // Umwandeln von Zahlen in Strings
BOOL IsOperand() // TRUE, wenn Operand
{ return BOOL( eNodeType != SbxNODE && eNodeType != SbxTYPEOF ); }
BOOL IsTypeOf()
{ return BOOL( eNodeType == SbxTYPEOF ); }
2000-09-18 15:18:56 +00:00
BOOL IsNumber(); // TRUE bei Zahlen
BOOL IsString(); // TRUE bei Strings
BOOL IsLvalue(); // TRUE, falls als Lvalue verwendbar
void GenElement( SbiOpcode ); // Element
void BaseInit( SbiParser* p ); // Hilfsfunktion fuer Ctor, AB 17.12.95
public:
SbiExprNode( SbiParser*, double, SbxDataType );
SbiExprNode( SbiParser*, const String& );
SbiExprNode( SbiParser*, const SbiSymDef&, SbxDataType, SbiExprList* = NULL );
SbiExprNode( SbiParser*, SbiExprNode*, SbiToken, SbiExprNode* );
SbiExprNode( SbiParser*, SbiExprNode*, USHORT ); // #120061 TypeOf
2000-09-18 15:18:56 +00:00
virtual ~SbiExprNode();
BOOL IsValid() { return BOOL( !bError ); }
BOOL IsConstant() // TRUE bei konstantem Operanden
{ return BOOL( eNodeType == SbxSTRVAL || eNodeType == SbxNUMVAL ); }
2000-09-18 15:18:56 +00:00
BOOL IsIntConst(); // TRUE bei Integer-Konstanten
BOOL IsVariable(); // TRUE, wenn Variable
2000-10-10 12:02:28 +00:00
SbiExprNode* GetWithParent() { return pWithParent; }
void SetWithParent( SbiExprNode* p ) { pWithParent = p; }
2000-09-18 15:18:56 +00:00
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; }
SbiExprList* GetParameters() { return aVar.pPar; }
2000-09-18 15:18:56 +00:00
void Optimize(); // Baumabgleich
void Gen( RecursiveMode eRecMode = UNDEFINED ); // Ausgabe eines Nodes
2000-09-18 15:18:56 +00:00
};
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
BOOL bBased; // TRUE: einfacher DIM-Teil (+BASE)
BOOL bError; // TRUE: Fehler
BOOL bByVal; // TRUE: ByVal-Parameter
SbiExprNode* Term();
SbiExprNode* ObjTerm( SbiSymDef& );
SbiExprNode* Operand();
SbiExprNode* Unary();
SbiExprNode* Exp();
SbiExprNode* MulDiv();
SbiExprNode* IntDiv();
SbiExprNode* Mod();
SbiExprNode* AddSub();
SbiExprNode* Cat();
SbiExprNode* Like();
SbiExprNode* Comp();
SbiExprNode* Boolean();
public:
SbiExpression( SbiParser*, SbiExprType = SbSTDEXPR ); // 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
2000-09-18 15:18:56 +00:00
~SbiExpression();
String& GetName() { return aArgName; }
void SetBased() { bBased = TRUE; }
BOOL IsBased() { return bBased; }
void SetByVal() { bByVal = TRUE; }
BOOL IsByVal() { return bByVal; }
BOOL IsValid() { return pExpr->IsValid(); }
BOOL IsConstant() { return pExpr->IsConstant(); }
BOOL IsVariable() { return pExpr->IsVariable(); }
BOOL IsLvalue() { return pExpr->IsLvalue(); }
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
2000-09-18 15:18:56 +00:00
};
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
SbiProcDef* pProc; // DECLARE-Funktion (Parameter-Anpassung)
short nExpr; // Anzahl Expressions
short nDim; // Anzahl Dimensionen
BOOL bError; // TRUE: Fehler
BOOL bBracket; // TRUE: Klammern
public:
SbiExprList( SbiParser* );
virtual ~SbiExprList();
BOOL IsBracket() { return bBracket; }
BOOL IsValid() { return BOOL( !bError ); }
short GetSize() { return nExpr; }
short GetDims() { return nDim; }
SbiExpression* Get( short );
BOOL Test( const SbiProcDef& ); // Parameter-Checks
void Gen(); // Code-Erzeugung
// Setzen einer Funktionsdefinition zum Abgleich der Parameter
void SetProc( SbiProcDef* p ) { pProc = p; }
void addExpression( SbiExpression* pExpr );
2000-09-18 15:18:56 +00:00
};
class SbiParameters : public SbiExprList {
public:
SbiParameters( SbiParser*, BOOL bConst = FALSE, BOOL bPar = TRUE);// parsender Ctor
2000-09-18 15:18:56 +00:00
};
class SbiDimList : public SbiExprList {
BOOL bConst; // TRUE: Alles sind Integer-Konstanten
public:
SbiDimList( SbiParser* ); // Parsender Ctor
BOOL IsConstant() { return bConst; }
};
#endif