A parser for basic mathematical expressions, in JavaScript.

Motivation: to have a simple DSL of mathematical expressions, sandboxed from page context. And an exercise in parsing.

Download: source code

Try it here:

Supported operators, ordered by precedence:

  • ( )
  • func(x) (call)
  • - (unary)
  • ^ (power, right associative)
  • * / %
  • + -
  • =
  • , (tuple constructor)

Numbers: 42.3, 1e-7

Built-in functions include everything from Math (exp, cos, etc.). Also aliased in lower case: pi, e, inf.

Using MathCalc object

var calc = new MathCalc();
var expr = calc.parse("2 + 2");
expr.eval();

Handling parse errors:

var expr = calc.parse("-8)");
if (expr.error) {
  alert('Parsing error at ' + expr.error.pos + ': ' + expr.error.text);
}

Using variables

var expr = calc.parse("x^2");
expr.eval(3);

Or pass named parameters:

var expr = calc.parse("x^y");
expr.eval({x:3, y:2});

expr.args provides a list of unbound variables, with their positional index:

{"x":0, "y":1}

Variables can be preserved between calls in a scope object:

var expr = calc.parse("x*2");
expr.scope = {x:3};
expr.eval();

Defining functions

Custom functions can be defined in the scope object. Note that this will override any built-in function/variable with the same name (case sensitive).

var expr = calc.parse("foo(4)");
expr.scope.foo = function(x) { return x * 2; };
expr.eval();

Handling runtime errors

eval could produce runtime errors in expr.scope.runtimeError:

var expr = calc.parse("boo(42)");
expr.eval();  // call to undefined function
if (expr.scope.runtimeError) {
  alert('Error: ' + expr.error.text);
}

Implementation details

Download: source code

Expression parser is a shift-reduce parser. The code has no external dependencies.

Similar projects