ALib C++ Library
Library Version: 2402 R1
Documentation generated by doxygen
Loading...
Searching...
No Matches
compiler.hpp
Go to the documentation of this file.
1/** ************************************************************************************************
2 * \file
3 * This header file is part of module \alib_expressions of the \aliblong.
4 *
5 * \emoji :copyright: 2013-2024 A-Worx GmbH, Germany.
6 * Published under \ref mainpage_license "Boost Software License".
7 **************************************************************************************************/
8#ifndef HPP_ALIB_EXPRESSIONS_COMPILER
9#define HPP_ALIB_EXPRESSIONS_COMPILER
10
11#ifndef HPP_ALIB_EXPRESSIONS_EXPRESSION
13#endif
14
15#ifndef HPP_ALIB_LANG_PLUGINS
16# include "alib/lang/plugins.hpp"
17#endif
18
19#if !defined(HPP_ALIB_COMPATIBILITY_STD_TYPEINFO)
21#endif
22
23#if !defined(HPP_ALIB_STRINGS_UTIL_TOKEN)
25#endif
26
27#if !defined(HPP_ALIB_LANG_FORMAT_FWDS)
29#endif
30
31#if !defined(HPP_ALIB_CAMP_MESSAGE_REPORT)
33#endif
34
35#if !defined (HPP_ALIB_MONOMEM_HASHMAP)
37#endif
38
39#if !defined (HPP_ALIB_MONOMEM_LIST)
40# include "alib/monomem/list.hpp"
41#endif
42
43namespace alib { namespace expressions {
44
45// forwards
46namespace detail { struct Parser; }
47struct CompilerPlugin;
48
49/** ************************************************************************************************
50 * An implementation of this abstract interface class may be attached to field
51 * \alib{expressions;Compiler::Repository} to enable an \e automated the definition and retrieval
52 * of expression strings of nested expressions.
53 *
54 * A default implementation, which uses typical \alib mechanics to define expression
55 * strings, is given with class \alib{expressions;StandardRepository}.
56 *
57 * More information about automated nested expressions and the use of this interface class is
58 * provided with manual chapter \ref alib_expressions_nested_config.
59 **************************************************************************************************/
61{
62 public:
63 /** Virtual destructor. */
65
66 /** ****************************************************************************************
67 * This method is called during compilation of expressions in the case a named expression
68 * is not found by method \alib{expressions;Compiler::GetNamed}.
69 *
70 * @param identifier The name of the required expression.
71 * @param[out] target The target to write the requested expression string to.
72 * @return \c true, if the expression string could be retrieved, \c false otherwise.
73 * If \c true is returned and \p{target} is still empty, then the string is defined
74 * to be empty, which throws an exception on compilation.
75 ******************************************************************************************/
76 virtual bool Get( const String& identifier, AString& target ) = 0;
77};
78
79/** ************************************************************************************************
80 * This is a central class of library module \alib_expressions_nl used to compile
81 * expression strings.
82 *
83 * For information about general use and features of this class consult the
84 * \ref alib::expressions "ALib Expressions User Manual".
85 *
86 * ## Friends ##
87 * class \alib{expressions;Expression}
88 **************************************************************************************************/
89class Compiler : public lang::PluginContainer<CompilerPlugin, CompilePriorities>
90{
91 #if !defined(ALIB_DOX)
92 friend class Expression;
93 friend struct detail::Parser;
94 friend class detail::Program;
95 #endif
96
97 public:
98 /** Alias shortcut to the type of the plug-in vector inherited from \b %PluginContainer. */
99 using Plugins= std::vector<lang::PluginContainer<CompilerPlugin, CompilePriorities>::Slot>;
100
101 // #############################################################################################
102 // internal fields
103 // #############################################################################################
104 protected:
105 /** Memory for used for permanent allocations during the set-up phase.
106 * Later it is also used for temporary allocations during compilation and reset to its
107 * state after setup. */
109
110 /** The expression parser. */
112
113 /** The map of Type names and bit flag values. */
117
118 /** The map of 'named' expressions. */
120 std::hash <String>,
121 std::equal_to<String> > namedExpressions;
122
123
124 // #############################################################################################
125 // Public fields
126 // #############################################################################################
127 public:
128
129 /**
130 * The list of unary operators.
131 * To define a new unary operator, method #AddUnaryOperator should be used.
132 * In debug-builds, the methods asserts that no double insertions are performed.
133 *
134 * Custom insertions may be performed before or after invoking #SetupDefaults,
135 * but before a first expression is compiled.
136 *
137 *
138 * Flag \alib{expressions;Compilation::DefaultUnaryOperators} controls if method
139 * \b %SetupDefaults adds operators resourced with enumeration
140 * \alib{expressions;DefaultUnaryOperators}.
141 */
143
144 /**
145 * This public map allows to define alias names for unary operators. Such names
146 * must consist only of alphabetic characters.
147 *
148 * Flag \alib{expressions;Compilation::DefaultAlphabeticOperatorAliases} controls if method
149 * #SetupDefaults adds the aliases defined with resourced data records of enumeration
150 * \alib{expressions;DefaultAlphabeticUnaryOperatorAliases} to this map.
151 */
153 alib::hash_string_ignore_case<character>,
154 alib::equal_to_string_ignore_case<character> > AlphabeticUnaryOperatorAliases;
155
156 /**
157 * This public map allows to define alias names for binary operators. Such names
158 * must consist only of alphabetic characters.
159 *
160 * Flag \alib{expressions;Compilation::DefaultAlphabeticOperatorAliases} controls if method
161 * #SetupDefaults adds the aliases defined with resourced data records of enumeration
162 * \alib{expressions;DefaultAlphabeticBinaryOperatorAliases} to this map.
163 */
165 alib::hash_string_ignore_case<character>,
166 alib::equal_to_string_ignore_case<character> > AlphabeticBinaryOperatorAliases;
167
168 /**
169 * Adds an unary operator to this expression compiler.
170 * This method should be invoked prior to prior to invoking #SetupDefaults.
171 *
172 * Operator symbols must be added only once.
173 *
174 * @param symbol The operator symbol.
175 */
176 void AddUnaryOperator( const String& symbol )
177 {
178 #if ALIB_DEBUG
179 for( auto& op : UnaryOperators )
180 if( op.Equals<false>( symbol ) )
181 ALIB_ASSERT_ERROR( false, "EXPR", "Unary operator {!Q'} already defined.", symbol )
182 #endif
183 UnaryOperators.EmplaceBack(symbol);
184 }
185
186
187 /**
188 * The list of binary operators. The map stores the precedences.
189 *
190 * To define a new binary operator, entry may be added prior to invoking #SetupDefaults
191 * using method #AddBinaryOperator.
192 *
193 * Flag \alib{expressions;Compilation::DefaultUnaryOperators} controls if method
194 * \b %SetupDefaults adds operators resourced with enumeration
195 * \alib{expressions;DefaultBinaryOperators}.
196 */
198
199 /**
200 * Adds a binary operator to this expression compiler.
201 * This method should be invoked prior to prior to invoking #SetupDefaults.
202 *
203 * Operator symbols must be added only once.
204 *
205 * @param symbol The operator symbol.
206 * @param precedence The precedence of the operator.
207 */
208 void AddBinaryOperator( const String& symbol, int precedence )
209 {
210 ALIB_DBG( auto result= )
211 BinaryOperators.EmplaceOrAssign(symbol, precedence);
212 ALIB_ASSERT_ERROR( result.second == true, "EXPR", // was inserted
213 "Binary operator {!Q'} already defined.", symbol )
214 }
215
216 /**
217 * Returns the precedence of given operator \b symbol.
218 *
219 * @param symbol The operator symbol.
220 * @return The precedence of the operator as defined with #AddBinaryOperator.
221 */
223 {
224 // search in operator table first
225 auto it= BinaryOperators.Find( symbol );
226 if( it != BinaryOperators.end() )
227 return it.Mapped();
228
229 // have an alias?
230 auto aliasOp= AlphabeticBinaryOperatorAliases.Find( symbol );
231 ALIB_ASSERT_ERROR( aliasOp != AlphabeticBinaryOperatorAliases.end(), "EXPR",
232 "Unknown binary operator {!Q'}.", symbol )
233
234 it= BinaryOperators.Find( aliasOp.Mapped() );
235 ALIB_ASSERT_ERROR( it != BinaryOperators.end(), "EXPR",
236 "Unknown binary operator {!Q'} which was aliased by {!Q'}.",
237 aliasOp->second, symbol )
238 return it.Mapped();
239 }
240
241
242 /**
243 * \alib{enums;T_EnumIsBitwise;Bitwise enum class} that lists the plug-ins built-into
244 * \alib expression library. This bitfield is used with method #SetupDefaults, which
245 * reads the flags set in #CfgBuiltInPlugins and installs the plug-ins accordingly.
246 */
247 enum class BuiltInPlugins
248 {
249 NONE = 0, ///< Installs no plug-in.
250 ALL = -1, ///< Installs all plug-ins.
251 ElvisOperator = (1 << 1), ///< Installs \alib{expressions;plugins::ElvisOperator}.
252 AutoCast = (1 << 2), ///< Installs \alib{expressions;plugins::AutoCast}.
253 Arithmetics = (1 << 3), ///< Installs \alib{expressions;plugins::Arithmetics}.
254 Math = (1 << 4), ///< Installs \alib{expressions;plugins::Math}.
255 Strings = (1 << 5), ///< Installs \alib{expressions;plugins::Strings}.
257 DateAndTime = (1 << 6), ) ///< Installs \alib{expressions;plugins::DateAndTime}. )
258 };
259
260
261 /**
262 * Bitfield that defines the built-in compiler plug-ins that are created and inserted
263 * by method #SetupDefaults.
264 *
265 * Defaults to \alib{expressions::Compiler;BuiltInPlugins::ALL}
266 *
267 * \note
268 * The built-in plug-ins are allowed to be shared by different compiler instances.
269 * To reach that, they must not be disabled here (or method #SetupDefaults must be
270 * omitted) and instead created once and registered with the compiler using
271 * inherited method \alib{lang::PluginContainer::InsertPlugin}. In that case, parameter
272 * \p{responsibility} of that method has to be provided as
273 * \c Responsibility::KeepWithSender.
274 */
276
277 /**
278 * The operator defined in this public field is used to address nested expressions.
279 * The operator used can be customized to any defined (!) unary operator.
280 *
281 * To disable nested expression parsing, change to empty or \e nulled string.
282 *
283 * \note
284 * If changed, the change hast to be made \b prior to invoking #SetupDefaults. Otherwise,
285 * the default configuration for
286 * \ref alib_expressions_operators_verbal "verbal operator aliases" would be set in
287 * effect to a wrong (or disabled) target operator.
288 *
289 * Defaults to \c "*".
290 *
291 * \see Manual chapter \ref alib_expressions_nested "10. Nested Expressions".
292 *
293 */
295
296 /**
297 * Name descriptor for nested expression function.
298 * Defaults to "Expression" with minimum abbreviation of \c 4 characters, ignoring letter
299 * case.<br>
300 * Resourced with key \c "EF"
301 *
302 * \see Manual chapter \ref alib_expressions_nested "10. Nested Expressions".
303 */
305
306 /**
307 * Keyword used with optional third parameter of expression function.
308 * Defaults to \c "throw". Resourced with key \c "EF"
309 *
310 * \see Manual chapter \ref alib_expressions_nested "10. Nested Expressions".
311 */
313
314 /**
315 * Compilation flags.
316 */
318
319 /**
320 * Flags that allow to tweak the result of the normalization of the originally parsed
321 * expression string.
322 */
324
325 /**
326 * This list is used with the normalization of the expression string. It contains
327 * strings, which are not allowed to appear in normalized expression strings.
328 *
329 * In the current library version, such strings might occur only if flags
330 * \alib{expressions;Normalization::UnaryOpSpace},
331 * \alib{expressions;Normalization::UnaryOpSpaceIfUnaryFollows} or
332 * \alib{expressions;Normalization::BinaryOpSpaces} are not set.
333 * As a sample see expression:
334 *
335 * 1 - -2
336 *
337 * If no space is written after binary operators, this expression would be normalized
338 * to:
339 * 1--2
340 *
341 * While this just looks irritating to a homo sapiens, it would be even illegal if
342 * well known C++ operator <c>--</c> was supported. Therefore, string <c>"--"</c> is added
343 * to this map in method #SetupDefaults, which forces the normalization logic to insert
344 * a space, even if spaces are otherwise configured to be omitted.
345 */
346 std::vector<AString> CfgNormalizationDisallowed;
347
348 /**
349 * Formatter used throughout all phases of the life-cycle of an expression:
350 * - Used for parsing expression strings (Using the encapsulated
351 * \alib{strings;TNumberFormat;NumberFormat} object. This is also the reason, why the type
352 * of formatter is \b %Formatter and not its more abstract base % \b %Formatter.)
353 * - Used for the generation of the normalized expression strings.
354 * - Used for the generation of constant string objects during compilation.
355 * - Used for the generation of string objects during evaluation.
356 *
357 * For the latter two, a copy of the pointer is provided through field
358 * \doxlinkproblem{structalib_1_1expressions_1_1Scope.html;aebf2cd4ff8a2611de06368fccfd3ef5b;Scope::Formatter;expressions::Scope::Formatter}.
359 * It is important not to change the formatting parameters in between the creation of the
360 * compile-time scope and the creation of the evaluation-time scope. If done,
361 * the expression results could differ when optimizations during compilation are performed.
362 *
363 * In the constructor of this class, a \alib{lang::format;Formatter::Clone;clone} of the
364 * \alib \alib{lang::format::Formatter;GetDefault;default formatter} is set here.
365 */
367
368 /**
369 * Optional pointer to a default or custom implementation of a repository that provides
370 * expression strings for named nested expressions.
371 *
372 * \see Manual chapter \ref alib_expressions_nested_config.
373 */
375
376 // #############################################################################################
377 // Public Interface
378 // #############################################################################################
379 public:
380 /** ****************************************************************************************
381 * Constructor. Construction usually is three steps:
382 * 1. Create class instance
383 * 2. Set the various configuration options (fields prefixed <c>Cfg</c>).
384 * 3. Invoke #SetupDefaults.
385 ******************************************************************************************/
387
388 /** ****************************************************************************************
389 * Destructor
390 ******************************************************************************************/
392 virtual ~Compiler();
393
394 /** ****************************************************************************************
395 * Registers a (custom) type name with this compiler. The name will be used to
396 * display a type name to end-users, for example, when malformed expressions throw an
397 * exception.
398 *
399 * The built-in types get registered in the constructor of the compiler, where the
400 * type names are read from the \alib{lang::resources;ResourcePool} of static library object
401 * \alib{EXPRESSIONS}.
402 *
403 * It is recommended that custom plug-ins invoke this method in their constructor.
404 *
405 * \note
406 * There is no general need to register types for using them
407 * with \alib_expressions_nl. Parameter \p{name} of this method is exclusively
408 * used to generate textual, human readable output!
409 *
410 * @param sample A \ref alib_expressions_prereq_sb "sample value"
411 * of the type, which is implicitly boxed when passed.
412 * @param name The name of the type.
413 ******************************************************************************************/
415 void AddType(Type sample, const NString& name);
416
417 /** ****************************************************************************************
418 * Returns the name of the type of the boxed value.
419 * Note that custom types need to be registered with method #AddType.
420 *
421 * If given argument \p{box} is \ref alib_boxing_more_void_void "a void box", the returned
422 * string is <b>"NONE"</b>.
423 *
424 * @param box The box to receive the type name for.
425 * @return The type name as string.
426 ******************************************************************************************/
428 NString TypeName(Type box);
429
430 /** ****************************************************************************************
431 * Writes the signature of a function (as for example found in
432 * \alib{expressions::plugins;Calculus::FunctionEntry}) to a string buffer.
433 *
434 * @param boxArray The start of the array of pointers.
435 * @param qty The array's length.
436 * @param target The string to write into.
437 ******************************************************************************************/
439 void WriteFunctionSignature( Box** boxArray, size_t qty, AString& target );
440
441 /** ****************************************************************************************
442 * Writes the signature of an argument list to a string buffer.
443 *
444 * @param begin Iterator to the first argument.
445 * @param end End-iterator.
446 * @param target The string to write into.
447 ******************************************************************************************/
450 ArgIterator end,
451 AString& target );
452
453 /** ****************************************************************************************
454 * Completes construction according to configuration options provided with fields
455 * prefixed <c>Cfg</c>.
456 * In detail, the following actions are performed:
457 * - If flag \alib{expressions;Compilation::DefaultUnaryOperators} is set in field
458 * #CfgCompilation, then
459 * - the unary operators listed in the \ref alib_enums_records "enum records" of
460 * \alib{expressions;DefaultUnaryOperators} are added using #AddUnaryOperator.
461 * - If flag \alib{expressions;Compilation::DefaultAlphabeticOperatorAliases} is set in
462 * field #CfgCompilation, then the alphabetic alias names found in
463 * the data records of enumeration
464 * \alib{expressions;DefaultAlphabeticUnaryOperatorAliases}
465 * are set in field #AlphabeticUnaryOperatorAliases. (As of the current version this
466 * is only the token \b NOT aliasing operator <b>"!"</b>.
467 * - If flag \alib{expressions;Compilation::DefaultBinaryOperators} is set in field
468 * #CfgCompilation, then
469 * - the binary operators listed in the data records of enumeration
470 * \alib{expressions;DefaultBinaryOperators} are added using #AddBinaryOperator.
471 * - If flag \alib{expressions;Compilation::AllowSubscriptOperator} is not set, the
472 * subscript operator is omitted.
473 * - If flag \alib{expressions;Compilation::DefaultAlphabeticOperatorAliases} is set in
474 * field #CfgCompilation, then the alphabetic alias names found in
475 * the data records of enumeration
476 * \alib{expressions;DefaultAlphabeticBinaryOperatorAliases}
477 * are set in field #AlphabeticBinaryOperatorAliases. (As of the current version this
478 * is only the token \b NOT aliasing operator <b>"!"</b>.
479 * - Strings <b>"++"</b> and <b>"--"</b> are added to field #CfgNormalizationDisallowed
480 * to prevent the unintentional creation of these potential operators in normalizations.
481 * (This way, a space character will be added between binary <b>"+"</b> and unary
482 * <b>"+"</b>, respectively binary <b>"-"</b> and unary <b>"-"</b> operators,
483 * even if the normalization options do not suggest to do this.
484 * - Depending on the flags set in #CfgBuiltInPlugins, the plug-ins listed in
485 * enumeration #BuiltInPlugins are created and added.
486 ******************************************************************************************/
488 void SetupDefaults();
489
490 /** ****************************************************************************************
491 * Firstly, this method parses the given expression string thereby builds an intermediate
492 * internal \alib{expressions;detail::AST;abstract syntax tree}.
493 * This tree is then translated into a \alib{expressions;detail::Program} which evaluates
494 * the expression in respect to a \alib{expressions;Scope} when executed.
495 *
496 * For building the program, attached \alib{expressions;CompilerPlugin} instances
497 * are queried.
498 *
499 * During this process, a \alib{expressions;Normalization;normalized} version of the input
500 * string is always created. While the original input string can
501 * be accessed with \alib{expressions;Expression::GetOriginalString}, the normalized version
502 * can be retrieved after the compilation with method
503 * \alib{expressions;Expression::GetNormalizedString}. During compilation, the normalization
504 * rules (flags) stored in field #CfgNormalization are applied.
505 *
506 * For compilation, a compile-time scope object is created by calling virtual method
507 * #getCompileTimeScope. If not overwritten, a standard scope object is used.
508 * If custom callbacks exists that are invokable at compile-time
509 * (to perform program optimization) and that at the same time rely on custom mechanics
510 * provided with a custom scope class, then a custom, derived version of this class
511 * has to be used that overrides method #getCompileTimeScope accordingly.
512 *
513 * @param expressionString The string to parse.
514 * @return A shared pointer to the compiled expression. Contains \c nullptr on failure.
515 ******************************************************************************************/
516 virtual ALIB_API
517 SPExpression Compile( const String& expressionString );
518
519 /** ****************************************************************************************
520 * Compiles the given \p{expressionString} and adds a compiled expression to the map of
521 * named expressions.
522 *
523 * @param name The name used to map the expression.
524 * @param expressionString The string to parse.
525 * If nulled, entry \p{name} is removed (if existing).
526 * @return \c true if an expression with the same named existed and was replaced.
527 * Otherwise returns \c false.
528 ******************************************************************************************/
529 virtual ALIB_API
530 bool AddNamed( const String& name, const String& expressionString );
531
532 /** ****************************************************************************************
533 * Removes a named expression. This is just a shortcut to #AddNamed, providing
534 * a nulled string for parameter \p{expressionString}.
535 *
536 * @param name The name of the expression to be removed.
537 * @return \c true if an expression with the given name existed and was removed.
538 * Otherwise returns \c false.
539 ******************************************************************************************/
540 bool RemoveNamed( const String& name )
541 {
542 return AddNamed( name, NullString() );
543 }
544
545 /** ****************************************************************************************
546 * Returns a named expression previously defined using #AddNamed.
547 * In the case that no expression with the given named was defined and optional interface
548 * #Repository is set, then this interface is used to retrieve a corresponding expression
549 * string and compile the named expression 'on the fly'.
550 *
551 * \see
552 * Manual chapter \ref alib_expressions_nested_config.
553 *
554 * @param name The name of the expression.
555 * @return In case of success a shared pointer to the expression.
556 ******************************************************************************************/
557 virtual ALIB_API
558 SPExpression GetNamed( const String& name );
559
560 // #############################################################################################
561 // Protected Interface
562 // #############################################################################################
563 protected:
564 /** ****************************************************************************************
565 * This virtual method is called by #Compile to create the scope object used
566 * for allocations that are made for intermediate results at compile-time.
567 *
568 * Compile-time allocations occur when expression terms that use purely constant arguments
569 * are evaluated at compile-time. Such optimization consequently leads to the invocation
570 * of callback functions at compile-time.
571 *
572 * If now, custom callback functions rely on custom allocation mechanics, provided with
573 * custom scope types, then this method has to be overridden to return such custom
574 * scope object.
575 *
576 * @return The default implementation returns the standard scope object.
577 * For its construction, field #CfgFormatter is provided.<br>
578 * Derived compilers may need to return a scope object of a derived type.
579 ******************************************************************************************/
580 virtual ALIB_API
582
583 /** ****************************************************************************************
584 * Implements \alib{expressions;Expression::GetOptimizedString}.
585 *
586 * @param expression the expression to generate an optimized string for.
587 ******************************************************************************************/
589 void getOptimizedExpressionString( Expression* expression );
590};
591
592
593} // namespace alib[::expressions]
594
595/// Type alias in namespace \b alib.
597
598} // namespace [alib]
599
601
602
603#endif // HPP_ALIB_EXPRESSIONS_COMPILER
void AddBinaryOperator(const String &symbol, int precedence)
Definition compiler.hpp:208
HashMap< String, String, alib::hash_string_ignore_case< character >, alib::equal_to_string_ignore_case< character > > AlphabeticUnaryOperatorAliases
Definition compiler.hpp:154
HashMap< TypeFunctors::Key, NAString, TypeFunctors::Hash, TypeFunctors::EqualTo > typeMap
Definition compiler.hpp:116
List< String > UnaryOperators
Definition compiler.hpp:142
virtual ALIB_API SPExpression Compile(const String &expressionString)
Definition compiler.cpp:251
HashMap< String, int > BinaryOperators
Definition compiler.hpp:197
std::vector< lang::PluginContainer< CompilerPlugin, CompilePriorities >::Slot > Plugins
Definition compiler.hpp:99
virtual ALIB_API SPExpression GetNamed(const String &name)
Definition compiler.cpp:389
ALIB_API NString TypeName(Type box)
Definition compiler.cpp:432
ExpressionRepository * Repository
Definition compiler.hpp:374
int GetBinaryOperatorPrecedence(const String &symbol)
Definition compiler.hpp:222
ALIB_API void getOptimizedExpressionString(Expression *expression)
Definition compiler.cpp:332
ALIB_API void AddType(Type sample, const NString &name)
Definition compiler.cpp:424
virtual ALIB_API Scope * getCompileTimeScope()
Definition compiler.cpp:151
bool RemoveNamed(const String &name)
Definition compiler.hpp:540
strings::util::Token CfgNestedExpressionFunction
Definition compiler.hpp:304
detail::Parser * parser
Definition compiler.hpp:111
virtual ALIB_API bool AddNamed(const String &name, const String &expressionString)
Definition compiler.cpp:357
Normalization CfgNormalization
Definition compiler.hpp:323
ALIB_API void WriteFunctionSignature(Box **boxArray, size_t qty, AString &target)
Definition compiler.cpp:448
ALIB_API void SetupDefaults()
Definition compiler.cpp:160
virtual ALIB_API ~Compiler()
Definition compiler.cpp:143
HashMap< String, String, alib::hash_string_ignore_case< character >, alib::equal_to_string_ignore_case< character > > AlphabeticBinaryOperatorAliases
Definition compiler.hpp:166
@ AutoCast
Installs plugins::AutoCast .
@ Arithmetics
Installs plugins::Arithmetics .
@ Strings
Installs plugins::Strings .
@ ALIB_IF_CAMP
Installs plugins::DateAndTime . )
@ ElvisOperator
Installs plugins::ElvisOperator .
HashMap< AString, SPExpression, std::hash< String >, std::equal_to< String > > namedExpressions
Definition compiler.hpp:121
std::vector< AString > CfgNormalizationDisallowed
Definition compiler.hpp:346
BuiltInPlugins CfgBuiltInPlugins
Definition compiler.hpp:275
void AddUnaryOperator(const String &symbol)
Definition compiler.hpp:176
virtual bool Get(const String &identifier, AString &target)=0
#define ALIB_ENUMS_MAKE_BITWISE(TEnum)
Definition bitwise.hpp:120
#define A_CHAR(STR)
#define ALIB_API
Definition alib.hpp:538
#define ALIB_ASSERT_ERROR(cond,...)
Definition alib.hpp:984
#define ALIB_DBG(...)
Definition alib.hpp:457
std::vector< Box >::iterator ArgIterator
std::shared_ptr< Expression > SPExpression
Definition alib.cpp:57
strings::TAString< nchar > NAString
Type alias in namespace alib.
constexpr String NullString()
Definition string.hpp:2498
std::shared_ptr< lang::format::Formatter > SPFormatter
strings::TAString< character > AString
Type alias in namespace alib.
strings::TString< character > String
Type alias in namespace alib.