expression-calculator
English | 中文A simple expression parser, using LL(1) syntax analyzer.
Useful to parse and calculate expression without using
eval()
, so as to avoid all the security risks caused by eval()
.Click here to open demo page
Installation
npm install --save expression-calculator
Import
ES6/Webpackimport Calc from 'expression-calculator';
Node.jsconst Calc=require('expression-calculator');
Script Tag<script type='text/javascript' src='./dist/exprcalc.js'></script>
Initialization
const calc = new Calc();
Initialize a new instance of Calc()
with empty RPN expression.const calc = new Calc(expression);
Initialize a new instance of Calc()
, then compile the given expression into RPN (compile()
method is called internally).
const calc = new Calc(RPN);
Initialize a new instance of Calc()
, then load the given RPN data (setRPN()
method is called internally).const calc = new Calc(calcInstance);
Get a copy of the given Calc()
instance.
Methods
compile(expr)
Compile an expression into an RPN expression.Parameters
expr
- The string to be compiled.
Returns
A reference to this instance for chaining.
Throws
SyntaxError
- If the given expression contains error.
calc(vars)
Calculate the previously compiled expression.The compiled expression may contain variables, use a key-value dict to specify values for variables in the expression. Variable names are case sensitive.
Parameters
vars
- A dict contains key-value pairs (Required when the RPN contains variables, and all the variables in the RPN expression must have a value here).
Returns
The calculation result, or
null
if no RPN is loaded or compiled from expression.Throws
TypeError
- When the value of a variable is not a number.ReferenceError
- When the value of a variable is not given in thevars
parameter.
Example
var calc = new Calc();
calc.compile('3+4').calc(); //Result: 7
calc.compile('3+4-a').calc({a:-10}); //Result: 17
getRPN()
Get the compiled RPN expression.Returns
Returns the compiled RPN which can be converted into JSON, or
null
for empty RPN.Example
var calc = new Calc();
calc.compile('3*(5+a)').getRPN();
The code above will generate the following JSON data:[
{type:1, value:3},
{type:1, value:5},
{type:2, value:"a"},
{type:3, value:"+"},
{type:3, value:"*"}
]
In the expression above, each token's type value has an alias, you may refer to Aliases section for detail.toJSON()
Alias of getRPN()
method, used for serialization via JSON.stringify()
.setRPN(expr)
Load previously compiled RPN from other source like database or memcache/redis.Parameters
expr
- The RPN expression, with the same format as data returned by methodgetRPN()
.
Returns
A reference to this instance for chaining.
Throws
TypeError
- If the given RPN contains tokens with invalid type or value.SyntaxError
- If the given RPN contains invalid tokens or errors.
compress()
Reduce the size of RPN by precalculating the numbers.Returns
A reference to this instance for chaining.
Aliases
Calc.TOKEN_NUM
- Value is1
, marks RPN tokens as number type.Calc.TOKEN_VAR
- Value is2
, marks RPN tokens as variable type.Calc.TOKEN_OPER
- Value is3
, marks RPN tokens as operand type.
expression-calculator
English | 中文一个简单的表达式解析器,使用LL(1)语法分析器。
可用于代替
eval()
函数来实现表达式的解析和计算,以避免eval()
带来的相关安全风险。单击此处打开演示页面
安装
npm install --save expression-calculator
引入
ES6/Webpackimport Calc from 'expression-calculator';
Node.jsconst Calc=require('expression-calculator');
Script标签<script type='text/javascript' src='path/to/exprcalc.js'></script>
初始化
const calc = new Calc();
初始化一个逆波兰式为空的Calc()
实例。const calc = new Calc(expression);
初始化一个新的Calc()
实例,然后将给定的算式编译成逆波兰式(初始化时会在内部调用compile()
方法)。
const calc = new Calc(RPN);
初始化一个新的Calc()
实例,然后加载给定的逆波兰式(初始化时会在内部调用setRPN()
方法)。const calc = new Calc(calcInstance);
复制参数中指定的Calc()
实例。方法说明
compile(expr)
将给定的算式编译成逆波兰式。参数
expr
- 待编译的表达式字符串。
返回
当前对象的引用,可供链式操作。
异常
SyntaxError
- 当给定的表达式有错误时。
calc(vars)
计算被编译的表达式。被编译的表达式中可能含有变量,可用含键值对的
Object
指定各个变量的值。变量名区分大小写,支持中文变量名。参数
vars
-Object
格式的键值对,用于给变量指定值(当表达式中有变量时,该参数为必要参数,且表达式中所有变量的值都必须在此指定)。
返回
计算结果,如果逆波兰式为空则返回
null
。异常
TypeError
- 存在值不为数字类型的变量。ReferenceError
- 表达式中有变量未指定值。
范例
var calc = new Calc();
calc.compile('3+4').calc(); //Result: 7
calc.compile('3+4-a').calc({a:-10}); //Result: 17
getRPN()
获取编译过的逆波兰式。返回
返回编译过的逆波兰式,可直接转换成JSON字符串。如果逆波兰式为空则返回
null
。范例
var calc = new Calc();
calc.compile('3*(5+a)').getRPN();
以上代码将返回以下数据:[
{type:1, value:3},
{type:1, value:5},
{type:2, value:"a"},
{type:3, value:"+"},
{type:3, value:"*"}
]
在以上逆波兰式中,所有项目的type
值都有对应的别名,可参考常用别名小节。toJSON()
getRPN()
方法的别名,在使用JSON.stringify()
序列化时用到。setRPN(expr)
从外部加载已编译的逆波兰式。参数
expr
- 待加载的逆波兰式数据,格式和getRPN()
方法返回的相同。
返回
当前对象的引用,可供链式操作。
异常
TypeError
- 给定的逆波兰式中存在含有错误数据格式的数据项。SyntaxError
- 给定的逆波兰式存在非法数据项或存在错误。
compress()
压缩逆波兰式,通过提前对数字进行运算的方式。返回
当前对象的引用,可供链式操作。
常用别名
Calc.TOKEN_NUM
- 值为1
,将当前逆波兰式项目标记为数字类型。Calc.TOKEN_VAR
- 值为2
,将当前逆波兰式项目标记为变量类型。Calc.TOKEN_OPER
- 值为3
,将当前逆波兰式项目标记为运算符类型。