You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
kvirc/src/kvirc/kvs/kvi_kvs_treenode_expression.h

250 lines
9.6 KiB

#ifndef _KVI_KVS_TREENODE_EXPRESSION_H_
#define _KVI_KVS_TREENODE_EXPRESSION_H_
//=============================================================================
//
// File : kvi_kvs_treenode_expression.h
// Creation date : Mon 06 Oct 2003 01.33 CEST by Szymon Stefanek
//
// This file is part of the KVirc irc client distribution
// Copyright (C) 2003 Szymon Stefanek (pragma at kvirc dot net)
//
// This program is FREE software. You can redistribute it and/or
// modify it under the terms of the GNU General Public License
// as published by the Free Software Foundation; either version 2
// of the License, or (at your opinion) any later version.
//
// This program 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 General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with this program. If not, write to the Free Software Foundation,
// Inc. ,51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
//
//=============================================================================
#include "kvi_qstring.h"
#include "kvi_kvs_variant.h"
#include "kvi_kvs_treenode_data.h"
// absolute precedence (~operand part)
#define PREC_MAXIMUM -10
#define PREC_OP_LOGICALNOT -3 /* ! */
#define PREC_OP_BITWISENOT -2 /* ~ */
#define PREC_OP_NEGATE -1 /* - */
// high precedence
#define PREC_OP_BITWISEAND 0 /* & */
#define PREC_OP_BITWISEOR 1 /* | */
#define PREC_OP_BITWISEXOR 2 /* ^ */
#define PREC_OP_SHIFTRIGHT 3 /* >> */
#define PREC_OP_SHIFTLEFT 3 /* << */
#define PREC_OP_MULTIPLICATION 5 /* * */
#define PREC_OP_DIVISION 5 /* / */
#define PREC_OP_MODULUS 5 /* % */
#define PREC_OP_SUM 8 /* + */
#define PREC_OP_SUBTRACTION 8 /* - */
#define PREC_OP_GREATERTHAN 11 /* > */ /* Case sensitive (normal for numbers) */
#define PREC_OP_LOWERTHAN 11 /* < */ /* Case sensitive (normal for numbers) */
#define PREC_OP_EQUALTO 12 /* == */ /* Case sensitive comparison for strings or normal comp.fr numbers */
#define PREC_OP_GREATEROREQUALTO 14 /* >= */ /* Case sensitive (normal for numbers) */
#define PREC_OP_LOWEROREQUALTO 14 /* <= */ /* Case sensitive (normal for numbers) */
#define PREC_OP_NOTEQUALTO 15 /* != */ /* Case sensitive (normal for numbers) */
#define PREC_OP_AND 16 /* && */
#define PREC_OP_OR 17 /* || */
#define PREC_OP_XOR 18 /* ^^ */
// low precedence
class KVIRC_API KviKvsTreeNodeExpression : public KviKvsTreeNodeData
{
// this class is never instantiated
public:
KviKvsTreeNodeExpression(const TQChar * pLocation);
~KviKvsTreeNodeExpression();
protected:
KviKvsTreeNodeExpression * m_pParentExpression;
public:
virtual void contextDescription(TQString &szBuffer);
virtual void dump(const char * prefix);
virtual int precedence();
virtual KviKvsTreeNodeExpression * left();
virtual KviKvsTreeNodeExpression * right();
virtual void setLeft(KviKvsTreeNodeExpression * pLeft);
virtual void setRight(KviKvsTreeNodeExpression * pRight);
virtual int firstBinaryOperator();
KviKvsTreeNodeExpression * parentExpression(){ return m_pParentExpression; };
void setParentExpression(KviKvsTreeNodeExpression * pParent){ m_pParentExpression = pParent; };
virtual KviKvsTreeNodeExpression * parentWithPrecedenceLowerThan(int iPrec);
};
class KVIRC_API KviKvsTreeNodeExpressionVariableOperand : public KviKvsTreeNodeExpression
{
public:
KviKvsTreeNodeExpressionVariableOperand(const TQChar * pLocation,KviKvsTreeNodeData * pData);
~KviKvsTreeNodeExpressionVariableOperand();
protected:
KviKvsTreeNodeData * m_pData; // can't be null
public:
virtual void contextDescription(TQString &szBuffer);
virtual void dump(const char * prefix);
virtual bool evaluateReadOnly(KviKvsRunTimeContext * c,KviKvsVariant * pResult);
};
class KVIRC_API KviKvsTreeNodeExpressionConstantOperand : public KviKvsTreeNodeExpression
{
public:
KviKvsTreeNodeExpressionConstantOperand(const TQChar * pLocation,KviKvsVariant * pConstant);
~KviKvsTreeNodeExpressionConstantOperand();
public:
KviKvsVariant * m_pConstant;
public:
virtual void contextDescription(TQString &szBuffer);
virtual void dump(const char * prefix);
virtual bool evaluateReadOnly(KviKvsRunTimeContext * c,KviKvsVariant * pResult);
};
class KVIRC_API KviKvsTreeNodeExpressionOperator : public KviKvsTreeNodeExpression
{
public:
KviKvsTreeNodeExpressionOperator(const TQChar * pLocation);
~KviKvsTreeNodeExpressionOperator();
public:
virtual void contextDescription(TQString &szBuffer);
virtual void dump(const char * prefix);
};
class KVIRC_API KviKvsTreeNodeExpressionUnaryOperator : public KviKvsTreeNodeExpressionOperator
{
public:
KviKvsTreeNodeExpressionUnaryOperator(const TQChar * pLocation,KviKvsTreeNodeExpression * pData);
~KviKvsTreeNodeExpressionUnaryOperator();
protected:
KviKvsTreeNodeExpression * m_pData; // can't be null!
KviKvsNumber m_nData; // result of the number evaluation
public:
virtual void contextDescription(TQString &szBuffer);
virtual void dump(const char * prefix);
bool evaluateOperand(KviKvsRunTimeContext * c);
};
class KVIRC_API KviKvsTreeNodeExpressionUnaryOperatorNegate : public KviKvsTreeNodeExpressionUnaryOperator
{
public:
KviKvsTreeNodeExpressionUnaryOperatorNegate(const TQChar * pLocation,KviKvsTreeNodeExpression * pData);
~KviKvsTreeNodeExpressionUnaryOperatorNegate();
public:
virtual int precedence();
virtual void contextDescription(TQString &szBuffer);
virtual void dump(const char * prefix);
virtual bool evaluateReadOnly(KviKvsRunTimeContext * c,KviKvsVariant * pResult);
};
class KVIRC_API KviKvsTreeNodeExpressionUnaryOperatorBitwiseNot : public KviKvsTreeNodeExpressionUnaryOperator
{
public:
KviKvsTreeNodeExpressionUnaryOperatorBitwiseNot(const TQChar * pLocation,KviKvsTreeNodeExpression * pData);
~KviKvsTreeNodeExpressionUnaryOperatorBitwiseNot();
public:
virtual int precedence();
virtual void contextDescription(TQString &szBuffer);
virtual void dump(const char * prefix);
virtual bool evaluateReadOnly(KviKvsRunTimeContext * c,KviKvsVariant * pResult);
};
class KVIRC_API KviKvsTreeNodeExpressionUnaryOperatorLogicalNot : public KviKvsTreeNodeExpressionUnaryOperator
{
public:
KviKvsTreeNodeExpressionUnaryOperatorLogicalNot(const TQChar * pLocation,KviKvsTreeNodeExpression * pData);
~KviKvsTreeNodeExpressionUnaryOperatorLogicalNot();
public:
virtual int precedence();
virtual void contextDescription(TQString &szBuffer);
virtual void dump(const char * prefix);
virtual bool evaluateReadOnly(KviKvsRunTimeContext * c,KviKvsVariant * pResult);
};
class KVIRC_API KviKvsTreeNodeExpressionBinaryOperator : public KviKvsTreeNodeExpressionOperator
{
public:
KviKvsTreeNodeExpressionBinaryOperator(const TQChar * pLocation);
~KviKvsTreeNodeExpressionBinaryOperator();
protected:
KviKvsTreeNodeExpression * m_pLeft; // can be zero only during parsing (and thus when deleting)
KviKvsTreeNodeExpression * m_pRight; // can be zero only during parsing (and thus when deleting)
KviKvsNumber m_nLeft; // buffer used to evaluate numeric operands
KviKvsNumber m_nRight; // buffer used to evaluate numeric operands
public:
virtual KviKvsTreeNodeExpression * left();
virtual KviKvsTreeNodeExpression * right();
void setLeft(KviKvsTreeNodeExpression * pLeft);
void setRight(KviKvsTreeNodeExpression * pRight);
virtual int firstBinaryOperator();
public:
void dumpOperands(const char * prefix);
virtual void contextDescription(TQString &szBuffer);
virtual void dump(const char * prefix);
protected:
bool evaluateOperands(KviKvsRunTimeContext * c);
};
#define DECLARE_BINARY_OPERATOR(__name) \
class KVIRC_API __name : public KviKvsTreeNodeExpressionBinaryOperator \
{ \
public: \
__name(const TQChar * pLocation); \
~__name(); \
public: \
virtual void contextDescription(TQString &szBuffer); \
virtual void dump(const char * prefix); \
virtual bool evaluateReadOnly(KviKvsRunTimeContext * c,KviKvsVariant * pResult); \
virtual int precedence(); \
}
DECLARE_BINARY_OPERATOR(KviKvsTreeNodeExpressionBinaryOperatorSum);
DECLARE_BINARY_OPERATOR(KviKvsTreeNodeExpressionBinaryOperatorMultiplication);
DECLARE_BINARY_OPERATOR(KviKvsTreeNodeExpressionBinaryOperatorSubtraction);
DECLARE_BINARY_OPERATOR(KviKvsTreeNodeExpressionBinaryOperatorDivision);
DECLARE_BINARY_OPERATOR(KviKvsTreeNodeExpressionBinaryOperatorModulus);
DECLARE_BINARY_OPERATOR(KviKvsTreeNodeExpressionBinaryOperatorBitwiseAnd);
DECLARE_BINARY_OPERATOR(KviKvsTreeNodeExpressionBinaryOperatorBitwiseOr);
DECLARE_BINARY_OPERATOR(KviKvsTreeNodeExpressionBinaryOperatorBitwiseXor);
DECLARE_BINARY_OPERATOR(KviKvsTreeNodeExpressionBinaryOperatorShiftLeft);
DECLARE_BINARY_OPERATOR(KviKvsTreeNodeExpressionBinaryOperatorShiftRight);
DECLARE_BINARY_OPERATOR(KviKvsTreeNodeExpressionBinaryOperatorAnd);
DECLARE_BINARY_OPERATOR(KviKvsTreeNodeExpressionBinaryOperatorOr);
DECLARE_BINARY_OPERATOR(KviKvsTreeNodeExpressionBinaryOperatorXor);
DECLARE_BINARY_OPERATOR(KviKvsTreeNodeExpressionBinaryOperatorGreaterThan);
DECLARE_BINARY_OPERATOR(KviKvsTreeNodeExpressionBinaryOperatorLowerThan);
DECLARE_BINARY_OPERATOR(KviKvsTreeNodeExpressionBinaryOperatorGreaterOrEqualTo);
DECLARE_BINARY_OPERATOR(KviKvsTreeNodeExpressionBinaryOperatorLowerOrEqualTo);
DECLARE_BINARY_OPERATOR(KviKvsTreeNodeExpressionBinaryOperatorEqualTo);
DECLARE_BINARY_OPERATOR(KviKvsTreeNodeExpressionBinaryOperatorNotEqualTo);
#endif //!_KVI_KVS_TREENODE_EXPRESSION_H_