C++ Mathematical Expression Library (ExprTk)  https://www.partow.net/programming/exprtk/index.html
diff --git a/Makefile b/Makefile
index 77422fd..e55105a 100644
--- a/Makefile
+++ b/Makefile
@@ -21,6 +21,9 @@
 BASE_OPTIONS     = -pedantic-errors -Wall -Wextra -Werror -Wno-long-long
 OPTIONS          = $(BASE_OPTIONS) $(OPTIMIZATION_OPT)
 LINKER_OPT       = -L/usr/lib -lstdc++ -lm
+ASAN_OPT         = -g -fsanitize=address -fno-omit-frame-pointer
+MSAN_OPT         = -g -fsanitize=memory  -fno-omit-frame-pointer
+LSAN_OPT         = -g -fsanitize=leak    -fno-omit-frame-pointer
 
 BUILD_LIST+=exprtk_test
 BUILD_LIST+=exprtk_benchmark
diff --git a/readme.txt b/readme.txt
index c3ea903..1a5d67a 100644
--- a/readme.txt
+++ b/readme.txt
@@ -24,11 +24,12 @@
   Section 21 - Compilation Errors
   Section 22 - Runtime Library Packages
   Section 23 - Helpers & Utils
-  Section 24 - Exprtk Notes
-  Section 25 - Simple Exprtk Example
-  Section 26 - Build Options
-  Section 27 - Files
-  Section 28 - Language Structure
+  Section 24 - Benchmarking
+  Section 25 - Exprtk Notes
+  Section 26 - Simple Exprtk Example
+  Section 27 - Build Options
+  Section 28 - Files
+  Section 29 - Language Structure
 
 
 [00 - INTRODUCTION]
@@ -2489,7 +2490,7 @@
 solution to this  problem is for  one to implement  their own specific
 USR that will perform a user defined business logic in determining  if
 an encountered unknown symbol should be treated as a variable or if it
-should raise a compilation error. The following example demonstrated a
+should raise a compilation error. The following example demonstrates a
 simple user defined USR:
 
    typedef exprtk::symbol_table<T> symbol_table_t;
@@ -3438,7 +3439,132 @@
 
      ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 
-[24 - EXPRTK NOTES]
+[24 - BENCHMARKING]
+As part of the ExprTk package there is an expression benchmark utility
+named 'exprtk_benchmark'. The utility attempts to determine expression
+evaluation  speed (or  rate of  evaluations -  evals  per  second), by
+evaluating each expression numerous times and mutating the  underlying
+variables  of  the  expression between  each  evaluation.  The utility
+assumes any  valid ExprTk  expression (containing  conditionals, loops
+etc), however  it will  only make  use of  a predefined  set of scalar
+variables, namely: a, b,  c, x, y, z,  w. That being said  expressions
+themselves  can  contain any  number  of local  variables,  vectors or
+strings. There are two modes of operation:
+
+   (1) Default
+   (2) User Specified Expressions
+
+
+(1) Default
+The default mode is  enabled simply by executing  the exprtk_benchmark
+binary with no command line parameters. In this mode a predefined  set
+of expressions will be evaluated in three phases:
+
+   (a) ExprTk evaluation
+   (b) Native evaluation
+   (c) ExprTk parse
+
+
+In the first two  phases (a and b)  a list of predefined  (hard-coded)
+expressions  will  be  evaluated using  both  ExprTk  and native  mode
+implementations.  This  is  done so  as  to  compare evaluation  times
+between ExprTk and native implementations. The set of expressions used
+are as follows:
+
+   (01) (y + x)
+   (02) 2 * (y + x)
+   (03) (2 * y + 2 * x)
+   (04) ((1.23 * x^2) / y) - 123.123
+   (05) (y + x / y) * (x - y / x)
+   (06) x / ((x + y) + (x - y)) / y
+   (07) 1 - ((x * y) + (y / x)) - 3
+   (08) (5.5 + x) + (2 * x - 2 / 3 * y) * (x / 3 + y / 4) + (y + 7.7)
+   (09) 1.1x^1 + 2.2y^2 - 3.3x^3 + 4.4y^15 - 5.5x^23 + 6.6y^55
+   (10) sin(2 * x) + cos(pi / y)
+   (11) 1 - sin(2 * x) + cos(pi / y)
+   (12) sqrt(111.111 - sin(2 * x) + cos(pi / y) / 333.333)
+   (13) (x^2 / sin(2 * pi / y)) - x / 2
+   (14) x + (cos(y - sin(2 / x * pi)) - sin(x - cos(2 * y / pi))) - y
+   (15) clamp(-1.0, sin(2 * pi * x) + cos(y / 2 * pi), +1.0)
+   (16) max(3.33, min(sqrt(1 - sin(2 * x) + cos(pi / y) / 3), 1.11))
+   (17) if((y + (x * 2.2)) <= (x + y + 1.1), x - y, x*y) + 2 * pi / x
+
+
+The  third  and  final  phase  (c),  is  used  to  determine   average
+compilation rates  (compiles per  second) for  expressions of  varying
+complexity. Each expression is compiled 100K times and the average for
+each expression is output.
+
+
+(2) User Specified Expressions
+In this mode two parameters are passed to the utility via the  command
+line:
+
+   (a) A name of a text file containing one expression per line
+   (b) An integer representing the number of evaluations per expression
+
+
+An  example execution  of the  benchmark utility  in this  mode is  as
+follows:
+
+   ./exprtk_benchmark my_expressions.txt 1000000
+
+
+The  above  invocation  will  load  the  expressions  from  the   file
+'my_expressions.txt' and will then proceed to evaluate each expression
+one million  times, varying  the above  mentioned variables  (x, y,  z
+etc.) between each evaluation, and at the end of each expression round
+a print out of  running times, result of a single evaluation and total
+sum of results is provided as demonstrated below:
+
+   Expression 1 of 7 4.770 ns 47700 ns  ( 9370368.0) '((((x+y)+z)))'
+   Expression 2 of 7 4.750 ns 47500 ns  ( 1123455.9) '((((x+y)-z)))'
+   Expression 3 of 7 4.766 ns 47659 ns  (21635410.7) '((((x+y)*z)))'
+   Expression 4 of 7 5.662 ns 56619 ns  ( 1272454.9) '((((x+y)/z)))'
+   Expression 5 of 7 4.950 ns 49500 ns  ( 4123455.9) '((((x-y)+z)))'
+   Expression 6 of 7 7.581 ns 75810 ns  (-4123455.9) '((((x-y)-z)))'
+   Expression 7 of 7 4.801 ns 48010 ns  (       0.0) '((((x-y)*z)))'
+
+
+The benchmark utility can be very useful when investigating evaluation
+efficiency  issues with  ExprTk or  simply during  the prototyping  of
+expressions. As an example, lets take the following expression:
+
+   1 / sqrt(2x) * e^(3y)
+
+
+Let's say we would like to determine which sub-part of the  expression
+takes the  most time  to evaluate  and perhaps  attempt to  rework the
+expression based on the results. In order to do this we will create  a
+text file  called 'test.txt'  and then  proceed to  make some educated
+guesses  about  how  to  break   the  expression  up  into  its   more
+'interesting' sub-parts which we will  then add as one expression  per
+line to the file. An example breakdown may be as follows:
+
+   1 / sqrt(2x) * e^(3y)
+   1 / sqrt(2x)
+   e^(3y)
+
+
+The  benchmark with  the given  file, where  each expression  will be
+evaluated 100K times can be executed as follows:
+
+   ./exprtk_benchmark test.txt 100000
+   Expr 1 of 3 90.340 ns 9034000 ns (296417859.3) '1/sqrt(2x)*e^(3y)'
+   Expr 2 of 3 11.100 ns 1109999 ns (    44267.3) '1/sqrt(2x)'
+   Expr 3 of 3 77.830 ns 7783000 ns (615985286.6) 'e^(3y)'
+   [*] Number Of Evals:         300000
+   [*] Total Time:              0.018sec
+   [*] Total Single Eval Time:  0.000ms
+
+
+From the results above we  can see that the third  expression (e^(3y))
+consumes the  largest amount  of time  and should  perhaps be replaced
+with the 'exp' function for more efficient evaluation.
+
+     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+[25 - EXPRTK NOTES]
 The following is a list of facts and suggestions one may want to take
 into account when using ExprTk:
 
@@ -3639,7 +3765,7 @@
 
      ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 
-[25 - SIMPLE EXPRTK EXAMPLE]
+[26 - SIMPLE EXPRTK EXAMPLE]
 The following is a  simple yet complete example  demonstrating typical
 usage of the ExprTk Library.  The example instantiates a symbol  table
 object, adding to it  three variables named x,  y and z, and  a custom
@@ -3744,7 +3870,7 @@
 
      ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 
-[26 - BUILD OPTIONS]
+[27 - BUILD OPTIONS]
 When building ExprTk there are a number of defines that will enable or
 disable certain features and  capabilities. The defines can  either be
 part of a compiler command line switch or scoped around the include to
@@ -3811,7 +3937,7 @@
 
      ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 
-[27 - FILES]
+[28 - FILES]
 The source distribution of ExprTk is comprised of the following set of
 files:
 
@@ -3842,7 +3968,7 @@
 
      ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 
-[28 - LANGUAGE STRUCTURE]
+[29 - LANGUAGE STRUCTURE]
 +-------------------------------------------------------------+
 |00 - If Statement                                            |
 |                                                             |