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 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";
}