1 // Copyright (C) 2007-2014 CEA/DEN, EDF R&D, OPEN CASCADE
3 // This library is free software; you can redistribute it and/or
4 // modify it under the terms of the GNU Lesser General Public
5 // License as published by the Free Software Foundation; either
6 // version 2.1 of the License, or (at your option) any later version.
8 // This library is distributed in the hope that it will be useful,
9 // but WITHOUT ANY WARRANTY; without even the implied warranty of
10 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
11 // Lesser General Public License for more details.
13 // You should have received a copy of the GNU Lesser General Public
14 // License along with this library; if not, write to the Free Software
15 // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
17 // See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
20 // File: QtxEvalExpr.h
21 // Author: Alexander SOLOVYOV, Sergey TELKOV
32 #pragma warning( disable:4251 )
38 class QTX_EXPORT QtxEvalExpr
41 //! Parsing error type
44 OK, //!< No errors found
45 OperandsNotMatch, //!< Types of arguments are invalid for this operation
46 InvalidResult, //!< Operation cannot find result (for example, division by zero)
47 InvalidOperation, //!< Unknown operation
48 OperationsNull, //!< Internal operations pointer of parser is null
49 InvalidToken, //!< Invalid token (neither operation, nor parameter of value)
50 CloseExpected, //!< Closing bracket is expected
51 ExcessClose, //!< Extra closing bracket is found
52 BracketsNotMatch, //!< Opening and closing brackets are of different type, e.g. [)
53 StackUnderflow, //!< There are no arguments in the stack for the operation
54 ExcessData //!< The parsing is finished, but there are more then one value in the stack
58 QtxEvalExpr( const QString& = QString() );
59 QtxEvalExpr( const bool, const QString& = QString() );
62 QVariant calculate( const QString& = QString() );
64 QString expression() const;
65 void setExpression( const QString& );
68 QtxEvalParser* parser() const;
70 bool autoDeleteOperationSets() const;
71 void setAutoDeleteOperationSets( const bool );
73 QList<QtxEvalSet*> operationSets() const;
74 QtxEvalSet* operationSet( const QString& ) const;
75 void removeOperationSet( QtxEvalSet* );
76 void insertOperationSet( QtxEvalSet*, const int = -1 );
79 void intialize( const bool, const QString& );
83 QtxEvalParser* myParser;
86 class QTX_EXPORT QtxEvalParser
90 virtual ~QtxEvalParser();
93 QVariant calculate( const QString& );
94 bool setExpression( const QString& );
96 QList<QtxEvalSet*> operationSets() const;
97 QtxEvalSet* operationSet( const QString& ) const;
98 void removeOperationSet( QtxEvalSet* );
99 void insertOperationSet( QtxEvalSet*, const int = -1 );
101 bool autoDeleteOperationSets() const;
102 void setAutoDeleteOperationSets( const bool );
104 virtual void clearParameters();
105 virtual bool removeParameter( const QString& name );
106 virtual QVariant parameter( const QString& name ) const;
107 virtual bool hasParameter( const QString& name ) const;
108 virtual void setParameter( const QString& name, const QVariant& value );
109 QStringList parameters() const;
111 QtxEvalExpr::Error error() const;
113 bool firstInvalid( QString& ) const;
114 void removeInvalids();
115 QString dump() const;
117 static QString toString( const QList<QVariant>& );
120 //! Types of postfix representation elements
123 Value, //!< Value (number, string, etc.)
124 Param, //!< Parameter
125 Open, //!< Open bracket
126 Close, //!< Close bracket
127 Pre, //!< Unary prefix operation
128 Post, //!< Unary postfix operation
129 Binary //!< Binary operation
132 //! Postfix representation element
136 PostfixItemType myType;
139 typedef QList<PostfixItem> Postfix; //!< postfix representation
140 typedef QList<QtxEvalSet*> SetList; //!< list of operations
141 typedef QMap<QString, QVariant> ParamMap; //!< parameter-to-value map
144 QString dump( const Postfix& ) const;
145 virtual bool prepare( const QString&, Postfix& );
146 virtual bool setOperationTypes( Postfix& );
147 virtual bool sort( const Postfix&, Postfix&, const QStringList&,
148 const QStringList&, int f = -1, int l = -1 );
150 virtual bool parse( const QString& );
151 virtual void setError( const QtxEvalExpr::Error );
153 bool calculate( const QString&, QVariant&, QVariant& );
155 static int search( const QStringList&, const QString&,
156 int offset, int& matchLen, int& listind );
157 static QString note( const QString& str, int pos, int len );
158 static int globalBrackets( const Postfix&, int, int );
161 void operationList( QStringList& ) const;
162 void bracketsList( QStringList&, bool ) const;
163 bool createValue( const QString&, QVariant& ) const;
164 int priority( const QString&, bool isBin ) const;
165 QtxEvalExpr::Error isValid( const QString&,
166 const QVariant::Type, const QVariant::Type ) const;
167 QtxEvalExpr::Error calculation( const QString&, QVariant&, QVariant& ) const;
169 bool checkOperations() const;
173 QtxEvalExpr::Error myError;
179 class QTX_EXPORT QtxEvalSet
183 virtual ~QtxEvalSet();
185 virtual QString name() const = 0;
187 virtual void operationList( QStringList& ) const = 0;
189 virtual void bracketsList( QStringList&, bool open ) const = 0;
191 virtual bool createValue( const QString&, QVariant& ) const;
193 virtual int priority( const QString&, bool isBin ) const = 0;
195 virtual QtxEvalExpr::Error isValid( const QString&, const QVariant::Type,
196 const QVariant::Type ) const = 0;
198 virtual QtxEvalExpr::Error calculate( const QString&, QVariant&, QVariant& ) const = 0;
201 class QTX_EXPORT QtxEvalSetBase : public QtxEvalSet
205 virtual ~QtxEvalSetBase();
207 virtual void operationList( QStringList& ) const;
208 virtual void bracketsList( QStringList&, bool open ) const;
210 virtual QtxEvalExpr::Error isValid( const QString&, const QVariant::Type,
211 const QVariant::Type ) const;
213 typedef QList<QVariant::Type> ListOfTypes;
215 void addTypes( const ListOfTypes& );
216 void addOperations( const QStringList& );
223 class QTX_EXPORT QtxEvalSetArithmetic : public QtxEvalSetBase
226 QtxEvalSetArithmetic();
227 virtual ~QtxEvalSetArithmetic();
229 virtual bool createValue( const QString&, QVariant& ) const;
230 virtual int priority( const QString&, bool isBin ) const;
231 virtual QtxEvalExpr::Error calculate( const QString&, QVariant&, QVariant& ) const;
233 static QString Name();
234 virtual QString name() const;
237 class QTX_EXPORT QtxEvalSetLogic : public QtxEvalSetBase
241 virtual ~QtxEvalSetLogic();
243 virtual bool createValue( const QString&, QVariant& ) const;
244 virtual int priority( const QString&, bool isBin ) const;
245 virtual QtxEvalExpr::Error calculate( const QString&, QVariant&, QVariant& ) const;
247 static QString Name();
248 virtual QString name() const;
251 int intValue( const QVariant& v ) const;
254 class QTX_EXPORT QtxEvalSetMath : public QtxEvalSetBase
258 virtual ~QtxEvalSetMath();
260 virtual bool createValue( const QString&, QVariant& ) const;
261 virtual int priority( const QString&, bool isBin ) const;
262 virtual QtxEvalExpr::Error calculate( const QString&, QVariant&, QVariant& ) const;
264 static QString Name();
265 virtual QString name() const;
268 class QTX_EXPORT QtxEvalSetString : public QtxEvalSetBase
272 virtual ~QtxEvalSetString();
274 virtual bool createValue( const QString&, QVariant& ) const;
275 virtual int priority( const QString&, bool isBin ) const;
276 virtual QtxEvalExpr::Error calculate( const QString&, QVariant&, QVariant& ) const;
278 static QString Name();
279 virtual QString name() const;
282 class QTX_EXPORT QtxEvalSetSets : public QtxEvalSetBase
285 typedef QList<QVariant> ValueSet;
289 virtual ~QtxEvalSetSets();
291 virtual void bracketsList( QStringList&, bool open ) const;
292 virtual int priority( const QString&, bool isBin ) const;
293 virtual QtxEvalExpr::Error isValid( const QString&, const QVariant::Type,
294 const QVariant::Type ) const;
295 virtual QtxEvalExpr::Error calculate( const QString&, QVariant&, QVariant& ) const;
297 static void add( ValueSet&, const QVariant& );
298 static void add( ValueSet&, const ValueSet& );
299 static void remove( ValueSet&, const QVariant& );
300 static void remove( ValueSet&, const ValueSet& );
302 static QString Name();
303 virtual QString name() const;
306 class QTX_EXPORT QtxEvalSetConst : public QtxEvalSet
310 virtual ~QtxEvalSetConst();
312 static QString Name();
313 virtual QString name() const;
315 virtual bool createValue( const QString&, QVariant& ) const;
317 virtual void operationList( QStringList& ) const;
318 virtual void bracketsList( QStringList&, bool open ) const;
319 virtual int priority( const QString&, bool isBin ) const;
320 virtual QtxEvalExpr::Error isValid( const QString&, const QVariant::Type,
321 const QVariant::Type ) const;
322 virtual QtxEvalExpr::Error calculate( const QString&, QVariant&, QVariant& ) const;
325 #endif // QTXEVALEXPR_H