Math::Expression::Evaluator - parses and evaluates mathematic expressions
use Math::Expression::Evaluator;
my $m = new Math::Expression::Evaluator;
print $m->parse("a = 12; a*3")->val(), "\n";
# prints 36
print $m->parse("2^(a/3)")->val(), "\n";
# prints 8 (ie 2**3)
print $m->parse("a / b")->val({ b => 6 }), "\n";
# prints 36
print $m->parse("log2(16)")->val(), "\n";
# prints 4
Math::Expression::Evaluator is a simple, recursive descending parser for
mathematical expressions. It can handle normal arithmetics
(includings powers ^), builtin functions like sin() and variables.
Multiple exressions can be seperated by whitespaces or by semicolons ';'. In case of multiple expressions the value of the last expression is returned.
Variables can be assigned with a single '=' sign, their name has to start
with a alphabetic character or underscore [a-zA-Z_], and may contain
alphabetic characters, digits and underscores.
Values for variables can also be provided as a hash ref as a parameter
to val(). In case of collision the explicitly provided value is used:
$m->parse("a = 2; a")->val({a => 1});
will return 1, not 2.
The following builtin functions are supported atm:
trignometric functions: sin, cos, tan
inverse trigonomic functions: asin, acos, atan
Square root: sqrt
exponentials: exp, sinh, cosh
logarithms: log, log2, log10
constants: pi() (you need the parenthesis to distinguish it from the
variable pi)
other: theta (theta(x) = 1 for x > 0, theta(x) = 0 for x < 0)
generates a new MathExpr object. accepts an optional argument, a hash ref that contains configurations. If this hash sets force_semicolon to true, expressions have to be separated by a semicolon ';'.
Takes a string as argument, and generates an Abstract Syntax Tree(AST) that is stored internally.
Returns a reference to the object, so that method calls can be chained:
print MathExpr->new->parse("1+2")->val;
Parse failures cause this method to die with a stack trace.
Executes the AST generated by parse(), and returns the number that the
expression is evaluated to. It accepts an optional hash reference that
contain values for variables:
my $m = new MathExpr;
$m->parse("(x - 1) / (x + 1)");
foreach (0 .. 10) {
print $_, "\t", $m->val({x => $_}), "\n";
}
Optimizes the internal AST, so that subsequent calls to val() will be
a bit faster. See Math::Expression::Evaluator::Optimizer for performance
considerations and informations on the implemented optimizations.
But note that a call to optimize() only pays off if you call val()
multiple times.
variables() returns a list of variables that are used in the expression.
The AST can be accessed as $obj-{ast}>. Its structure is described in
the Math::Expression::Evaluator::Parser manpage (or you can use the Data::Dumper manpage
to figure it out for yourself).
This module is free software. You may use, redistribute and modify it under the same terms as perl itself.
Moritz Lenz, http://moritz.faui2k3.org/, moritz@faui2k3.org
You can obtain the latest development version via subversion:
svn co https://casella.verplant.org/svn/moritz/cpan/Math-Expression-Evaluator/