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/