Xpresion
Xpresion: simple and flexible Expression Parser Engine with variables support for PHP, Python, JavaScript
Install / Use
/learn @foo123/XpresionREADME
Xpr3s10n
A simple, fast and flexible eXpression Parser Engine (with custom functions and variables support) for PHP, Python, Node.js and Browser

light-weight (~29kB minified, ~10kB zipped)
version 1.0.1 Xpresion.js, Xpresion.min.js
Contents
- Features
- Examples
- Live Examples
- API
- Platform Support
- Performance
- Todo
- Etymology of "expression" a latinised form of "έκφραση" (etymology), compare etymology of "phrase" (for an example of phonetic / linguistic equivalent transformations during historic evolution see Grimm's law)
Features
(v. 1.0.0+)
Xpresion is not an expression parser, it does not parse expressions. It is a parser engine.
It builds parsers, which parse (custom) expressions. Effectively it is a small rewrite system
This is accomplished by configuring the Xpresion engine to fit the needed expression syntax.
Configuration is intutive, easy and flexible (see examples).
However, since Xpresion is a parser engine, adding a default configuration, it can itself be a parser as well (out-of-the-box).
NOTE: Xpresion (v.1.0.0+) uses Grammar Templates for operator output. This is more flexible than simply using String Templates as previously, since it supports blocks of optional code, default values, optional placeholders and many other things. Only make sure to escape (with \ character) all "<",">","[","]" literal characters inside the output you define for operators and functions (see default configuration example below)
Features:
- simple, intuitive, flexible, fast
- support an adequate expression syntax out of the box (i.e numbers, strings, regexes, reserved tokens, arithmetical/logical operators, ternary operators, some advanced functions, variables)
- highly flexible and configurable (regexes, outputs, functions, operators, aliases, runtime functions, etc..)
- support (user-defined) variables, (user-defined) functions
- define custom operators (prefix, infix, postfix, left/right association, etc..) seamlessly
- define polymorphic operators / operator overloading seamlessly (e.g subtraction and unary negation)
- define n-ary operators seamlessly (e.g ternary if-then-else, etc..)
- define aliases of operators/functions seamlessly
- define new custom expression syntaxes easily (e.g via another
configurationor by extendingdefaultConfiguration) - implementations for
Node.jsandBrowser,PHP,Python(only one class per implementation)
If you use Xpresion in your application and you want to share it, feel free to submit an example link
Live Examples
Examples
(see test/test.js)
javascript
var echo = console.log,
Xpresion = require(__dirname+'/../src/js/Xpresion.js')
;
function test_expr(expr, evaluate)
{
evaluate = evaluate || false;
echo('==========================================');
var xpr = null;
try {
// uses defaultConfiguration by default
xpr = Xpresion(expr);
} catch (err ) {
xpr = null;
echo(err.toString());
}
if ( xpr )
{
var debug = evaluate ? xpr.debug(evaluate instanceof Object ? evaluate : {}) : xpr.debug();
echo(debug);
}
}
echo( 'Xpresion.VERSION ' + Xpresion.VERSION + "\n" );
test_expr('13');
test_expr('1.32');
test_expr('-0.12');
test_expr('-3');
test_expr('("1,2,3")+3',true);
test_expr('"1,2,3"+3',true);
test_expr('"1,2,3"+3+4',true);
test_expr('[1,2,3]+3',true);
test_expr('-3+2',true);
test_expr('1-3+2',true);
test_expr('1+-3',true);
test_expr('+1+3',true);
test_expr('2*-1');
test_expr('2*(-1)');
test_expr('2^-1');
test_expr('2^(-1)');
test_expr('2^-1^3');
test_expr('-2^-1^3');
test_expr('2^(-1)^3');
test_expr('sqrt(2)', true);
test_expr('$v');
test_expr('$v.key.0.key', {'v':{'key':[{'key':'correct'},'foo']}});
test_expr('True');
test_expr('"string"');
test_expr('["a","rra","y"]');
test_expr('`^regex?`i');
test_expr('0 == 1');
test_expr('TRUE == False');
test_expr('TRUE is False');
test_expr('1+2');
test_expr('1+2+3');
test_expr('1+2*3');
test_expr('1*2+3');
test_expr('1*2*3');
test_expr('1+2/3');
test_expr('1*2/3');
test_expr('1^2');
test_expr('1^2^3');
test_expr('1^(2^3)');
test_expr('(1^2)^3');
test_expr('((1^2))^3');
test_expr('`^regex?`i matches "string"');
test_expr('`^regex?`i matches "string" and `^regex?`i matches "string2"');
test_expr('$v in ["a","b","c"]');
test_expr('1 ? : (1+2) (3+4)');
test_expr('1 ? sum(1,2) : (3+4)');
test_expr('1 ? 1+2 : (3+4)');
test_expr('1 ? (2+3) : 2 ? (3+4) : (4+5)');
test_expr('date("Y-m-d H:i:s")', true);
test_expr('time()', true);
test_expr('date("Y-m-d H:i:s", time())');
test_expr('pow(1,pow(2,3))');
test_expr('pow(pow(2,3),4)');
test_expr('pow(pow(1,2),pow(2,3))');
output
Xpresion.VERSION 1.0.0
==========================================
Expression: 13
Variables : []
Evaluator : 13
==========================================
Expression: 1.32
Variables : []
Evaluator : 1.32
==========================================
Expression: -0.12
Variables : []
Evaluator : (-0.12)
==========================================
Expression: -3
Variables : []
Evaluator : (-3)
==========================================
Expression: ("1,2,3")+3
Variables : []
Evaluator : ("1,2,3"+String(3))
Data : {}
Result : "1,2,33"
==========================================
Expression: "1,2,3"+3
Variables : []
Evaluator : ("1,2,3"+String(3))
Data : {}
Result : "1,2,33"
==========================================
Expression: "1,2,3"+3+4
Variables : []
Evaluator : (("1,2,3"+String(3))+String(4))
Data : {}
Result : "1,2,334"
==========================================
Expression: [1,2,3]+3
Variables : []
Evaluator : Fn.ary_merge([1,2,3],3)
Data : {}
Result : [1,2,3,3]
==========================================
Expression: -3+2
Variables : []
Evaluator : ((-3)+2)
Data : {}
Result : -1
==========================================
Expression: 1-3+2
Variables : []
Evaluator : ((1-3)+2)
Data : {}
Result : 0
==========================================
Expression: 1+-3
Variables : []
Evaluator : (1+(-3))
Data : {}
Result : -2
==========================================
Expression: +1+3
Variables : []
Evaluator : (1+3)
Data : {}
Result : 4
==========================================
Expression: 2*-1
Variables : []
Evaluator : (2*(-1))
==========================================
Expression: 2*(-1)
Variables : []
Evaluator : (2*(-1))
==========================================
Expression: 2^-1
Variables : []
Evaluator : Math.pow(2,(-1))
==========================================
Expression: 2^(-1)
Variables : []
Evaluator : Math.pow(2,(-1))
==========================================
Expression: 2^-1^3
Variables : []
Evaluator : Math.pow(2,Math.pow((-1),3))
==========================================
Expression: -2^-1^3
Variables : []
Evaluator : Math.pow((-2),Math.pow((-1),3))
==========================================
Expression: 2^(-1)^3
Variables : []
Evaluator : Math.pow(2,Math.pow((-1),3))
==========================================
Expression: sqrt(2)
Variables : []
Evaluator : Math.sqrt(2)
Data : {}
Result : 1.4142135623730951
==========================================
Expression: $v
Variables : [v]
Evaluator : Var["v"]
==========================================
Expression: $v.key.0.key
Variables : [v]
Evaluator : Xpresion.GET(Var["v"],["key","0","key"])
Data : {
"v": {
"key": [
{
"key": "correct"
},
"foo"
]
}
}
Result : "correct"
==========================================
Expression: True
Variables : []
Evaluator : true
==========================================
Expression: "string"
Variables : []
Evaluator : "string"
==========================================
Expression: ["a","rra","y"]
Variables : []
Evaluator : ["a","rra","y"]
==========================================
Expression: `^regex?`i
Variables : []
Evaluator : Cache.re_1
==========================================
Expression: 0 == 1
Variables : []
Evaluator : (0==1)
==========================================
Expression: TRUE == False
Variables : []
Evaluator : (true==false)
==========================================
Expression: TRUE is False
Variables : []
Evaluator : (true===false)
==========================================
Expression: 1+2
Variables : []
Evaluator : (1+2)
==========================================
Expression: 1+2+3
Variables : []
Evaluator : ((1+2)+3)
==========================================
Expression: 1+2*3
Variables : []
Evaluator : (1+(2*3))
==========================================
Expression: 1*2+3
Variables : []
Evaluator : ((1*2)+3)
==========================================
Expression: 1*2*3
Variables : []
Evaluator : ((1*2)*3)
==========================================
Expression: 1+2/3
Variables : []
Evaluator : (1+(2/3))
==========================================
Expression: 1*2/3
Variables : []
Evaluator : ((1*2)/3)
==========================================
Expression: 1^2
Variables : []
Evaluator : Math.pow(1,2)
============

