NAME
Math::Expression::Evaluator - parses and evaluates mathematic
expressions
SYNOPSIS
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
DESCRIPTION
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)
METHODS
new
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 ';'.
parse
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.
val
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";
}
optimize
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
"variables()" returns a list of variables that are used in the
expression.
INTERNALS
The AST can be accessed as "$obj-"{ast}>. Its structure is described in
Math::Expression::Evaluator::Parser (or you can use Data::Dumper to
figure it out for yourself).
LICENSE
This module is free software. You may use, redistribute and modify it
under the same terms as perl itself.
AUTHOR
Moritz Lenz, , moritz@faui2k3.org
DEVELOPMENT
You can obtain the latest development version via subversion:
svn co https://casella.verplant.org/svn/moritz/cpan/Math-Expression-Evaluator/