libbbb  1.2.1
Groups common code used in some applications and libraries.
 All Classes Files Functions Variables Typedefs Enumerations Enumerator Macros
rexeval.h
1 /* ========================================================================= */
2 /* ------------------------------------------------------------------------- *//*
12 
13 
14  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
15  Please read COPYING and README files in root folder
16  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
17 */
18 /* ------------------------------------------------------------------------- */
19 /* ========================================================================= */
20 #ifndef __REXEVAL_INC__
21 #define __REXEVAL_INC__
22 //
23 //
24 //
25 //
26 /* INCLUDES ------------------------------------------------------------ */
27 
28 #include <libbbb/libbbb.h>
29 #include <libbbb/list2d.h>
30 
31 /* INCLUDES ============================================================ */
32 //
33 //
34 //
35 //
36 /* DEFINITIONS --------------------------------------------------------- */
37 
38 struct BaseTk;
39 struct OperatorTk;
40 struct OperandTk;
41 
42 namespace bbb {
43 
44 /* DEFINITIONS ========================================================= */
45 //
46 //
47 //
48 //
49 /* CLASS --------------------------------------------------------------- */
50 
56 class
57  BBBSHARED_EXPORT
58  RexEval {
59 
60  //
61  //
62  //
63  //
64  /* DEFINITIONS ----------------------------------------------------- */
65 
66 public:
67 
69  enum Operation {
70  OP_Invalid = -1,
71 
72  OP_Add,
73  OP_Sub,
74  OP_Mul,
75  OP_IDiv,
76  OP_Mod,
77  OP_Div,
78  OP_Pow,
79  OP_Equ,
80  OP_And,
81  OP_Or,
82  OP_Not,
83  OP_Great,
84  OP_Small,
85  OP_GreatEqu,
86  OP_SmallEqu,
87 
88  OP_OParantesis,
89  OP_CParantesis,
90 
91  OP_Max
92  };
93 
96  LeftAssoc,
97  RightAssoc
98  };
99 
101  typedef void (*kbOperand) ( RexEval * ev );
102 
104  struct OpData {
105  Associativity asoc_;
106  int precedence_;
107  int opcount_;
108  kbOperand kb_;
109  };
110 
111 
112 
113 
114  /* DEFINITIONS ===================================================== */
115  //
116  //
117  //
118  //
119  /* DATA ------------------------------------------------------------ */
120 
121 private:
122 
124  QString s_err_;
125 
127  List2Dh outq_;
128 
130  List2Dh stack_;
131 
133  static OpData opers_[OP_Max];
134 
135 
136  /* DATA ============================================================ */
137  //
138  //
139  //
140  //
141  /* FUNCTIONS ------------------------------------------------------- */
142 
143 public:
144 
145  RexEval( const QString & s );
146  ~RexEval();
147 
148  /* --------------------------------------------------------------------- */
149  void setError ( const QString & s ) {
150  s_err_.append( s );
151  s_err_.append( "\n" );
152  }
153  /* ===================================================================== */
154 
155  /* --------------------------------------------------------------------- */
156  bool isOperatorSymbol ( QChar c ) const {
157  static QString s_op = "+-*\\%/^()[]{}=&|!<>";
158  return ( s_op.contains( c ) );
159  }
160  /* ===================================================================== */
161 
162  /* --------------------------------------------------------------------- */
163  bool hasErrors ( void ) const {
164  return s_err_.isEmpty() == false;
165  }
166  /* ===================================================================== */
167 
168  /* --------------------------------------------------------------------- */
169  const QString & errorString ( void ) const {
170  return s_err_;
171  }
172  /* ===================================================================== */
173 
174  static int cmpPrecedence ( OperatorTk * op1, OperatorTk * op2 );
175  static bool isAssociative ( OperatorTk * op1, Associativity asoc );
176  static bool isOperator ( BaseTk * btk );
177 
178  void addOperator(const QString &s);
179  void addOperand(const QString &s);
180  void compute();
181  OperandTk *oneDouble(RexEval *ev, double &d1);
182  OperandTk *twoDoubles(RexEval *ev, double &d1, double &d2);
183 
184 
185  static void opKbAdd ( RexEval * ev );
186  static void opKbAnd ( RexEval * ev );
187  static void opKbDiv ( RexEval * ev );
188  static void opKbEqu ( RexEval * ev );
189  static void opKbGreatEqu ( RexEval * ev );
190  static void opKbGreat ( RexEval * ev );
191  static void opKbIDiv ( RexEval * ev );
192  static void opKbMod ( RexEval * ev );
193  static void opKbMul ( RexEval * ev );
194  static void opKbNot ( RexEval * ev );
195  static void opKbOr ( RexEval * ev );
196  static void opKbPow ( RexEval * ev );
197  static void opKbSmallEqu ( RexEval * ev );
198  static void opKbSmall ( RexEval * ev );
199  static void opKbSub ( RexEval * ev );
200 
201  double resultDouble ( void );
202  QString resultString ( void );
203  bool resultBool ( void );
204 
205  void dumpChain ( List2Dh * hdr );
206 
207  /* FUNCTIONS ======================================================= */
208  //
209  //
210  //
211  //
212 
213 }; /* class RexScript */
214 
215 /* CLASS =============================================================== */
216 //
217 //
218 //
219 //
220 
221 } // namespace bbb
222 
223 #endif // __REXEVAL_INC__
224 /* ------------------------------------------------------------------------- */
225 /* ========================================================================= */