mozjexl
Version:
Javascript Expression Language: Powerful context-based expression parser and evaluator
67 lines (65 loc) • 2.38 kB
JavaScript
/*
* Jexl
* Copyright (c) 2015 TechnologyAdvice
*/
/**
* A map of all expression elements to their properties. Note that changes
* here may require changes in the Lexer or Parser.
* @type {{}}
*/
exports.elements = {
'.': {type: 'dot'},
'[': {type: 'openBracket'},
']': {type: 'closeBracket'},
'|': {type: 'pipe'},
'{': {type: 'openCurl'},
'}': {type: 'closeCurl'},
':': {type: 'colon'},
',': {type: 'comma'},
'(': {type: 'openParen'},
')': {type: 'closeParen'},
'?': {type: 'question'},
'+': {type: 'binaryOp', precedence: 30,
eval: function(left, right) { return left + right; }},
'-': {type: 'binaryOp', precedence: 30,
eval: function(left, right) { return left - right; }},
'*': {type: 'binaryOp', precedence: 40,
eval: function(left, right) { return left * right; }},
'/': {type: 'binaryOp', precedence: 40,
eval: function(left, right) { return left / right; }},
'//': {type: 'binaryOp', precedence: 40,
eval: function(left, right) { return Math.floor(left / right); }},
'%': {type: 'binaryOp', precedence: 50,
eval: function(left, right) { return left % right; }},
'^': {type: 'binaryOp', precedence: 50,
eval: function(left, right) { return Math.pow(left, right); }},
'==': {type: 'binaryOp', precedence: 20,
eval: function(left, right) { return left == right; }},
'!=': {type: 'binaryOp', precedence: 20,
eval: function(left, right) { return left != right; }},
'>': {type: 'binaryOp', precedence: 20,
eval: function(left, right) { return left > right; }},
'>=': {type: 'binaryOp', precedence: 20,
eval: function(left, right) { return left >= right; }},
'<': {type: 'binaryOp', precedence: 20,
eval: function(left, right) { return left < right; }},
'<=': {type: 'binaryOp', precedence: 20,
eval: function(left, right) { return left <= right; }},
'&&': {type: 'binaryOp', precedence: 10,
eval: function(left, right) { return left && right; }},
'||': {type: 'binaryOp', precedence: 10,
eval: function(left, right) { return left || right; }},
'in': {type: 'binaryOp', precedence: 20,
eval: function(left, right) {
if (typeof right === 'string')
return right.indexOf(left) !== -1;
if (Array.isArray(right)) {
return right.some(function(elem) {
return elem == left;
});
}
return false;
}},
'!': {type: 'unaryOp', precedence: Infinity,
eval: function(right) { return !right; }}
};