3 _____ __ _____________ _______ ______ ___________
4 / \| | \____ \__ \\_ __ \/ ___// __ \_ __ \
5 | Y Y \ | / |_> > __ \| | \/\___ \\ ___/| | \/
6 |__|_| /____/| __(____ /__| /____ >\___ >__|
8 Copyright (C) 2004 - 2020 Ingo Berg
10 Redistribution and use in source and binary forms, with or without modification, are permitted
11 provided that the following conditions are met:
13 * Redistributions of source code must retain the above copyright notice, this list of
14 conditions and the following disclaimer.
15 * Redistributions in binary form must reproduce the above copyright notice, this list of
16 conditions and the following disclaimer in the documentation and/or other materials provided
17 with the distribution.
19 THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR
20 IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
21 FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR
22 CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
23 DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
24 DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER
25 IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
26 OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
29 #include "muParserCallback.h"
33 #pragma warning(disable : 26812)
37 \brief Implementation of the parser callback class.
43 ParserCallback::ParserCallback(fun_type0 a_pFun, bool a_bAllowOpti)
44 :m_pFun((void*)a_pFun)
50 , m_bAllowOpti(a_bAllowOpti)
54 ParserCallback::ParserCallback(fun_type1 a_pFun, bool a_bAllowOpti, int a_iPrec, ECmdCode a_iCode)
55 :m_pFun((void*)a_pFun)
61 , m_bAllowOpti(a_bAllowOpti)
66 /** \brief Constructor for constructing function callbacks taking two arguments.
69 ParserCallback::ParserCallback(fun_type2 a_pFun, bool a_bAllowOpti)
70 :m_pFun((void*)a_pFun)
76 , m_bAllowOpti(a_bAllowOpti)
80 /** \brief Constructor for constructing binary operator callbacks.
81 \param a_pFun Pointer to a static function taking two arguments
82 \param a_bAllowOpti A flag indicating this function can be optimized
83 \param a_iPrec The operator precedence
84 \param a_eOprtAsct The operators associativity
87 ParserCallback::ParserCallback(fun_type2 a_pFun,
90 EOprtAssociativity a_eOprtAsct)
91 :m_pFun((void*)a_pFun)
94 , m_eOprtAsct(a_eOprtAsct)
97 , m_bAllowOpti(a_bAllowOpti)
101 ParserCallback::ParserCallback(fun_type3 a_pFun, bool a_bAllowOpti)
102 :m_pFun((void*)a_pFun)
105 , m_eOprtAsct(oaNONE)
108 , m_bAllowOpti(a_bAllowOpti)
112 ParserCallback::ParserCallback(fun_type4 a_pFun, bool a_bAllowOpti)
113 :m_pFun((void*)a_pFun)
116 , m_eOprtAsct(oaNONE)
119 , m_bAllowOpti(a_bAllowOpti)
123 ParserCallback::ParserCallback(fun_type5 a_pFun, bool a_bAllowOpti)
124 :m_pFun((void*)a_pFun)
127 , m_eOprtAsct(oaNONE)
130 , m_bAllowOpti(a_bAllowOpti)
134 ParserCallback::ParserCallback(fun_type6 a_pFun, bool a_bAllowOpti)
135 :m_pFun((void*)a_pFun)
138 , m_eOprtAsct(oaNONE)
141 , m_bAllowOpti(a_bAllowOpti)
145 ParserCallback::ParserCallback(fun_type7 a_pFun, bool a_bAllowOpti)
146 :m_pFun((void*)a_pFun)
149 , m_eOprtAsct(oaNONE)
152 , m_bAllowOpti(a_bAllowOpti)
156 ParserCallback::ParserCallback(fun_type8 a_pFun, bool a_bAllowOpti)
157 :m_pFun((void*)a_pFun)
160 , m_eOprtAsct(oaNONE)
163 , m_bAllowOpti(a_bAllowOpti)
167 ParserCallback::ParserCallback(fun_type9 a_pFun, bool a_bAllowOpti)
168 :m_pFun((void*)a_pFun)
171 , m_eOprtAsct(oaNONE)
174 , m_bAllowOpti(a_bAllowOpti)
178 ParserCallback::ParserCallback(fun_type10 a_pFun, bool a_bAllowOpti)
179 :m_pFun((void*)a_pFun)
182 , m_eOprtAsct(oaNONE)
185 , m_bAllowOpti(a_bAllowOpti)
189 ParserCallback::ParserCallback(bulkfun_type0 a_pFun, bool a_bAllowOpti)
190 :m_pFun((void*)a_pFun)
193 , m_eOprtAsct(oaNONE)
194 , m_iCode(cmFUNC_BULK)
196 , m_bAllowOpti(a_bAllowOpti)
200 ParserCallback::ParserCallback(bulkfun_type1 a_pFun, bool a_bAllowOpti)
201 :m_pFun((void*)a_pFun)
204 , m_eOprtAsct(oaNONE)
205 , m_iCode(cmFUNC_BULK)
207 , m_bAllowOpti(a_bAllowOpti)
211 /** \brief Constructor for constructing function callbacks taking two arguments.
214 ParserCallback::ParserCallback(bulkfun_type2 a_pFun, bool a_bAllowOpti)
215 :m_pFun((void*)a_pFun)
218 , m_eOprtAsct(oaNONE)
219 , m_iCode(cmFUNC_BULK)
221 , m_bAllowOpti(a_bAllowOpti)
225 ParserCallback::ParserCallback(bulkfun_type3 a_pFun, bool a_bAllowOpti)
226 :m_pFun((void*)a_pFun)
229 , m_eOprtAsct(oaNONE)
230 , m_iCode(cmFUNC_BULK)
232 , m_bAllowOpti(a_bAllowOpti)
236 ParserCallback::ParserCallback(bulkfun_type4 a_pFun, bool a_bAllowOpti)
237 :m_pFun((void*)a_pFun)
240 , m_eOprtAsct(oaNONE)
241 , m_iCode(cmFUNC_BULK)
243 , m_bAllowOpti(a_bAllowOpti)
247 ParserCallback::ParserCallback(bulkfun_type5 a_pFun, bool a_bAllowOpti)
248 :m_pFun((void*)a_pFun)
251 , m_eOprtAsct(oaNONE)
252 , m_iCode(cmFUNC_BULK)
254 , m_bAllowOpti(a_bAllowOpti)
258 ParserCallback::ParserCallback(bulkfun_type6 a_pFun, bool a_bAllowOpti)
259 :m_pFun((void*)a_pFun)
262 , m_eOprtAsct(oaNONE)
263 , m_iCode(cmFUNC_BULK)
265 , m_bAllowOpti(a_bAllowOpti)
269 ParserCallback::ParserCallback(bulkfun_type7 a_pFun, bool a_bAllowOpti)
270 :m_pFun((void*)a_pFun)
273 , m_eOprtAsct(oaNONE)
274 , m_iCode(cmFUNC_BULK)
276 , m_bAllowOpti(a_bAllowOpti)
280 ParserCallback::ParserCallback(bulkfun_type8 a_pFun, bool a_bAllowOpti)
281 :m_pFun((void*)a_pFun)
284 , m_eOprtAsct(oaNONE)
285 , m_iCode(cmFUNC_BULK)
287 , m_bAllowOpti(a_bAllowOpti)
291 ParserCallback::ParserCallback(bulkfun_type9 a_pFun, bool a_bAllowOpti)
292 :m_pFun((void*)a_pFun)
295 , m_eOprtAsct(oaNONE)
296 , m_iCode(cmFUNC_BULK)
298 , m_bAllowOpti(a_bAllowOpti)
302 ParserCallback::ParserCallback(bulkfun_type10 a_pFun, bool a_bAllowOpti)
303 :m_pFun((void*)a_pFun)
306 , m_eOprtAsct(oaNONE)
307 , m_iCode(cmFUNC_BULK)
309 , m_bAllowOpti(a_bAllowOpti)
313 ParserCallback::ParserCallback(multfun_type a_pFun, bool a_bAllowOpti)
314 :m_pFun((void*)a_pFun)
317 , m_eOprtAsct(oaNONE)
320 , m_bAllowOpti(a_bAllowOpti)
324 ParserCallback::ParserCallback(strfun_type1 a_pFun, bool a_bAllowOpti)
325 :m_pFun((void*)a_pFun)
328 , m_eOprtAsct(oaNONE)
329 , m_iCode(cmFUNC_STR)
331 , m_bAllowOpti(a_bAllowOpti)
335 ParserCallback::ParserCallback(strfun_type2 a_pFun, bool a_bAllowOpti)
336 :m_pFun((void*)a_pFun)
339 , m_eOprtAsct(oaNONE)
340 , m_iCode(cmFUNC_STR)
342 , m_bAllowOpti(a_bAllowOpti)
346 ParserCallback::ParserCallback(strfun_type3 a_pFun, bool a_bAllowOpti)
347 :m_pFun((void*)a_pFun)
350 , m_eOprtAsct(oaNONE)
351 , m_iCode(cmFUNC_STR)
353 , m_bAllowOpti(a_bAllowOpti)
357 ParserCallback::ParserCallback(strfun_type4 a_pFun, bool a_bAllowOpti)
358 :m_pFun((void*)a_pFun)
361 , m_eOprtAsct(oaNONE)
362 , m_iCode(cmFUNC_STR)
364 , m_bAllowOpti(a_bAllowOpti)
368 ParserCallback::ParserCallback(strfun_type5 a_pFun, bool a_bAllowOpti)
369 :m_pFun((void*)a_pFun)
372 , m_eOprtAsct(oaNONE)
373 , m_iCode(cmFUNC_STR)
375 , m_bAllowOpti(a_bAllowOpti)
379 /** \brief Default constructor.
382 ParserCallback::ParserCallback()
386 , m_eOprtAsct(oaNONE)
393 /** \brief Copy constructor.
396 ParserCallback::ParserCallback(const ParserCallback& ref)
399 m_iArgc = ref.m_iArgc;
400 m_bAllowOpti = ref.m_bAllowOpti;
401 m_iCode = ref.m_iCode;
402 m_iType = ref.m_iType;
404 m_eOprtAsct = ref.m_eOprtAsct;
407 ParserCallback & ParserCallback::operator=(const ParserCallback & ref)
412 m_iArgc = ref.m_iArgc;
413 m_bAllowOpti = ref.m_bAllowOpti;
414 m_iCode = ref.m_iCode;
415 m_iType = ref.m_iType;
417 m_eOprtAsct = ref.m_eOprtAsct;
422 /** \brief Clone this instance and return a pointer to the new instance. */
423 ParserCallback* ParserCallback::Clone() const
425 return new ParserCallback(*this);
429 /** \brief Return tru if the function is conservative.
431 Conservative functions return always the same result for the same argument.
434 bool ParserCallback::IsOptimizable() const
440 /** \brief Get the callback address for the parser function.
442 The type of the address is void. It needs to be recasted according to the
443 argument number to the right type.
448 void* ParserCallback::GetAddr() const
454 /** \brief Return the callback code. */
455 ECmdCode ParserCallback::GetCode() const
461 ETypeCode ParserCallback::GetType() const
467 /** \brief Return the operator precedence.
470 Only valid if the callback token is an operator token (binary or infix).
472 int ParserCallback::GetPri() const
478 /** \brief Return the operators associativity.
481 Only valid if the callback token is a binary operator token.
483 EOprtAssociativity ParserCallback::GetAssociativity() const
489 /** \brief Returns the number of function Arguments. */
490 int ParserCallback::GetArgc() const
496 #if defined(_MSC_VER)