##安装
npm install --save exp-parser
##问题
- 为啥要山寨一个表达式解析器?
- 表达式解析器能做神马事情?
- 怎么自制表达式解析器?
##回答
- 因为好玩,因为市面上好像还没有一款独立的表达式解析器,如果有的话,体积估计也不小,我打算做一个较为轻量级,同时扩展性较强的表达式解析器,功能与angular1.x的指令表达式解析器一致,最重要是的可扩展,提供内核级别的扩展性
- 类似于angular的指令表达式,你可以集成在模板引擎中,主要用于解析组件的属性,组件于组件间传值计算,过滤,话说。。。。这其实就是将视图逻辑从后端中释放出来。
- 本人其实就是个初学者,原来一直想搞个表达式解析器,苦于无从下手,后来找到了jsep这个表达式AST生成器,它能自动解析表达式,生成一个json结构的抽象语法树,所以,后面我仅仅只需要深度遍历这棵树就行了,然后边遍历边计算,注意是后序遍历,就这样一层一层的剥开计算结果的心。其实真心没啥技术含量,我做这个仅仅只是为了好玩,又或者说后面自己需要的时候也不需要各种找东西,麻烦。。。。
##API文档
###解析
import ExpressionParser form 'expression-parser'
let parser = new ExpressionParser({//注入一个全局上下文,比如将window注入进去,不过不建议这样做,如果方法被拦截,可能会发生危险,尽量是将闭包内受保护的对象注入其中
})
parser.parse('2 * 2') // 4
parser.parse('a * b',{ //变量求值
a:4,
b:5
}) // 20
parser.parse('fuck(a,b)',{//函数求值
fuck(x,y){
return x * y;
},
a:5,
b:6
}) // 30
parser.parse('a * b|fuck:34:cc',{//作用域注入
a:5,
b:6,
cc:7
},{//过滤器注入
fuck(x,y){
return (input)=>{
return (input - x) / y;
}
}
})
###扩展
const {BINARY_EXP} = ExpressionParser.expressionTypes;
ExpressionParser.injectExpHandler(BINARY_EXP,(tree)=>{
})
//添加一个优先级为10的二进制操作符^
ExpressionParser.addBinaryOp("^", 10);
//添加一个一元操作符@
ExpressionParser.addUnaryOp('@');
//移除一个二进制操作符
ExpressionParser.removeBinaryOp(">>>");
//移除一个一元操作符
ExpressionParser.removeUnaryOp("~");