00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023 #ifndef QTXEVALEXPR_H
00024 #define QTXEVALEXPR_H
00025
00026 #include "Qtx.h"
00027
00028 #include <QList>
00029 #include <QVariant>
00030
00031 #ifdef WIN32
00032 #pragma warning( disable:4251 )
00033 #endif
00034
00035 class QtxEvalSet;
00036 class QtxEvalParser;
00037
00038 class QTX_EXPORT QtxEvalExpr
00039 {
00040 public:
00042 typedef enum
00043 {
00044 OK,
00045 OperandsNotMatch,
00046 InvalidResult,
00047 InvalidOperation,
00048 OperationsNull,
00049 InvalidToken,
00050 CloseExpected,
00051 ExcessClose,
00052 BracketsNotMatch,
00053 StackUnderflow,
00054 ExcessData
00055 } Error;
00056
00057 public:
00058 QtxEvalExpr( const QString& = QString() );
00059 QtxEvalExpr( const bool, const QString& = QString() );
00060 ~QtxEvalExpr();
00061
00062 QVariant calculate( const QString& = QString() );
00063
00064 QString expression() const;
00065 void setExpression( const QString& );
00066
00067 Error error() const;
00068 QtxEvalParser* parser() const;
00069
00070 bool autoDeleteOperationSets() const;
00071 void setAutoDeleteOperationSets( const bool );
00072
00073 QList<QtxEvalSet*> operationSets() const;
00074 QtxEvalSet* operationSet( const QString& ) const;
00075 void removeOperationSet( QtxEvalSet* );
00076 void insertOperationSet( QtxEvalSet*, const int = -1 );
00077
00078 private:
00079 void intialize( const bool, const QString& );
00080
00081 private:
00082 QString myExpr;
00083 QtxEvalParser* myParser;
00084 };
00085
00086 class QTX_EXPORT QtxEvalParser
00087 {
00088 public:
00089 QtxEvalParser();
00090 virtual ~QtxEvalParser();
00091
00092 QVariant calculate();
00093 QVariant calculate( const QString& );
00094 bool setExpression( const QString& );
00095
00096 QList<QtxEvalSet*> operationSets() const;
00097 QtxEvalSet* operationSet( const QString& ) const;
00098 void removeOperationSet( QtxEvalSet* );
00099 void insertOperationSet( QtxEvalSet*, const int = -1 );
00100
00101 bool autoDeleteOperationSets() const;
00102 void setAutoDeleteOperationSets( const bool );
00103
00104 virtual void clearParameters();
00105 virtual bool removeParameter( const QString& name );
00106 virtual QVariant parameter( const QString& name ) const;
00107 virtual bool hasParameter( const QString& name ) const;
00108 virtual void setParameter( const QString& name, const QVariant& value );
00109 QStringList parameters() const;
00110
00111 QtxEvalExpr::Error error() const;
00112
00113 bool firstInvalid( QString& ) const;
00114 void removeInvalids();
00115 QString dump() const;
00116
00117 static QString toString( const QList<QVariant>& );
00118
00119 protected:
00121 typedef enum
00122 {
00123 Value,
00124 Param,
00125 Open,
00126 Close,
00127 Pre,
00128 Post,
00129 Binary
00130 } PostfixItemType;
00131
00133 typedef struct
00134 {
00135 QVariant myValue;
00136 PostfixItemType myType;
00137 } PostfixItem;
00138
00139 typedef QList<PostfixItem> Postfix;
00140 typedef QList<QtxEvalSet*> SetList;
00141 typedef QMap<QString, QVariant> ParamMap;
00142
00143 protected:
00144 QString dump( const Postfix& ) const;
00145 virtual bool prepare( const QString&, Postfix& );
00146 virtual bool setOperationTypes( Postfix& );
00147 virtual bool sort( const Postfix&, Postfix&, const QStringList&,
00148 const QStringList&, int f = -1, int l = -1 );
00149
00150 virtual bool parse( const QString& );
00151 virtual void setError( const QtxEvalExpr::Error );
00152
00153 bool calculate( const QString&, QVariant&, QVariant& );
00154
00155 static int search( const QStringList&, const QString&,
00156 int offset, int& matchLen, int& listind );
00157 static QString note( const QString& str, int pos, int len );
00158 static int globalBrackets( const Postfix&, int, int );
00159
00160 private:
00161 void operationList( QStringList& ) const;
00162 void bracketsList( QStringList&, bool ) const;
00163 bool createValue( const QString&, QVariant& ) const;
00164 int priority( const QString&, bool isBin ) const;
00165 QtxEvalExpr::Error isValid( const QString&,
00166 const QVariant::Type, const QVariant::Type ) const;
00167 QtxEvalExpr::Error calculation( const QString&, QVariant&, QVariant& ) const;
00168
00169 bool checkOperations() const;
00170
00171 private:
00172 SetList mySets;
00173 QtxEvalExpr::Error myError;
00174 ParamMap myParams;
00175 Postfix myPostfix;
00176 bool myAutoDel;
00177 };
00178
00179 class QTX_EXPORT QtxEvalSet
00180 {
00181 public:
00182 QtxEvalSet();
00183 virtual ~QtxEvalSet();
00184
00185 virtual QString name() const = 0;
00186
00187 virtual void operationList( QStringList& ) const = 0;
00188
00189 virtual void bracketsList( QStringList&, bool open ) const = 0;
00190
00191 virtual bool createValue( const QString&, QVariant& ) const;
00192
00193 virtual int priority( const QString&, bool isBin ) const = 0;
00194
00195 virtual QtxEvalExpr::Error isValid( const QString&, const QVariant::Type,
00196 const QVariant::Type ) const = 0;
00197
00198 virtual QtxEvalExpr::Error calculate( const QString&, QVariant&, QVariant& ) const = 0;
00199 };
00200
00201 class QTX_EXPORT QtxEvalSetBase : public QtxEvalSet
00202 {
00203 public:
00204 QtxEvalSetBase();
00205 virtual ~QtxEvalSetBase();
00206
00207 virtual void operationList( QStringList& ) const;
00208 virtual void bracketsList( QStringList&, bool open ) const;
00209
00210 virtual QtxEvalExpr::Error isValid( const QString&, const QVariant::Type,
00211 const QVariant::Type ) const;
00212 protected:
00213 typedef QList<QVariant::Type> ListOfTypes;
00214
00215 void addTypes( const ListOfTypes& );
00216 void addOperations( const QStringList& );
00217
00218 private:
00219 QStringList myOpers;
00220 ListOfTypes myTypes;
00221 };
00222
00223 class QTX_EXPORT QtxEvalSetArithmetic : public QtxEvalSetBase
00224 {
00225 public:
00226 QtxEvalSetArithmetic();
00227 virtual ~QtxEvalSetArithmetic();
00228
00229 virtual bool createValue( const QString&, QVariant& ) const;
00230 virtual int priority( const QString&, bool isBin ) const;
00231 virtual QtxEvalExpr::Error calculate( const QString&, QVariant&, QVariant& ) const;
00232
00233 static QString Name();
00234 virtual QString name() const;
00235 };
00236
00237 class QTX_EXPORT QtxEvalSetLogic : public QtxEvalSetBase
00238 {
00239 public:
00240 QtxEvalSetLogic();
00241 virtual ~QtxEvalSetLogic();
00242
00243 virtual bool createValue( const QString&, QVariant& ) const;
00244 virtual int priority( const QString&, bool isBin ) const;
00245 virtual QtxEvalExpr::Error calculate( const QString&, QVariant&, QVariant& ) const;
00246
00247 static QString Name();
00248 virtual QString name() const;
00249
00250 private:
00251 int intValue( const QVariant& v ) const;
00252 };
00253
00254 class QTX_EXPORT QtxEvalSetMath : public QtxEvalSetBase
00255 {
00256 public:
00257 QtxEvalSetMath();
00258 virtual ~QtxEvalSetMath();
00259
00260 virtual bool createValue( const QString&, QVariant& ) const;
00261 virtual int priority( const QString&, bool isBin ) const;
00262 virtual QtxEvalExpr::Error calculate( const QString&, QVariant&, QVariant& ) const;
00263
00264 static QString Name();
00265 virtual QString name() const;
00266 };
00267
00268 class QTX_EXPORT QtxEvalSetString : public QtxEvalSetBase
00269 {
00270 public:
00271 QtxEvalSetString();
00272 virtual ~QtxEvalSetString();
00273
00274 virtual bool createValue( const QString&, QVariant& ) const;
00275 virtual int priority( const QString&, bool isBin ) const;
00276 virtual QtxEvalExpr::Error calculate( const QString&, QVariant&, QVariant& ) const;
00277
00278 static QString Name();
00279 virtual QString name() const;
00280 };
00281
00282 class QTX_EXPORT QtxEvalSetSets : public QtxEvalSetBase
00283 {
00284 public:
00285 typedef QList<QVariant> ValueSet;
00286
00287 public:
00288 QtxEvalSetSets();
00289 virtual ~QtxEvalSetSets();
00290
00291 virtual void bracketsList( QStringList&, bool open ) const;
00292 virtual int priority( const QString&, bool isBin ) const;
00293 virtual QtxEvalExpr::Error isValid( const QString&, const QVariant::Type,
00294 const QVariant::Type ) const;
00295 virtual QtxEvalExpr::Error calculate( const QString&, QVariant&, QVariant& ) const;
00296
00297 static void add( ValueSet&, const QVariant& );
00298 static void add( ValueSet&, const ValueSet& );
00299 static void remove( ValueSet&, const QVariant& );
00300 static void remove( ValueSet&, const ValueSet& );
00301
00302 static QString Name();
00303 virtual QString name() const;
00304 };
00305
00306 class QTX_EXPORT QtxEvalSetConst : public QtxEvalSet
00307 {
00308 public:
00309 QtxEvalSetConst();
00310 virtual ~QtxEvalSetConst();
00311
00312 static QString Name();
00313 virtual QString name() const;
00314
00315 virtual bool createValue( const QString&, QVariant& ) const;
00316
00317 virtual void operationList( QStringList& ) const;
00318 virtual void bracketsList( QStringList&, bool open ) const;
00319 virtual int priority( const QString&, bool isBin ) const;
00320 virtual QtxEvalExpr::Error isValid( const QString&, const QVariant::Type,
00321 const QVariant::Type ) const;
00322 virtual QtxEvalExpr::Error calculate( const QString&, QVariant&, QVariant& ) const;
00323 };
00324
00325 #endif // QTXEVALEXPR_H