终于搞定了ExpressionParser(表达式解析器)

经过一段时间的努力,终于完成了Expression Parser(表达式解析器)。Expression Parser定义了一套语法规则,只要用户按照该规则写程序(expression),那么解析器就会自动执行并计算出最终结果。用户可以在该表达式中定义变量,变量前使用符号$。也可以调用预定义的函数,函数前用符号@,具体见下面的例子。
示例1:
$v1 = 5*2;
$v2 = 4;
$v1 + $v2
其中$v1, $v2就是定义的变量,用户不需要为变量定义类型,ExpressionParser可以智能的根据等号右边的值确定变量的类型。解析器会计算出最终结果14。

示例2:
$v1 = "hello world!";
@substr($v1, 0, 5)
其中@substr就是预定义的函数。解析器会计算出最终结果 hello

用户也可以对该解析器的语法进行扩展。用户可以定义自己的关键字或语法规则,并且自己写程序来解析并处理自己定义的关键字或语法规则。例如假设用户定义了关键字 UNIT_PRICE 和 WEIGHT,那么用户就可以在表达式中使用这两个关键字。
例如下面的例子,对给定的单价打8折,然后乘以重量,得出总价,最后总价再优惠10元。
示例3:

$v1 = (UNIT_PRICE * 80/100) * WEIGHT;
$v1 - 10
当解析器遇到UNIT_PRICE与WEIGHT时,会自动调用用户的程序来处理这两个关键字,假设用户的程序计算出UNIT_PRICE为 20, WEIGHT为2,那么最终的结果就是 20 * 80/100 * 2 - 10 = 22.

示例4:

@get(PRICE_TABLE,  APPLE)

其中@get就是预定义的函数。PRICE_TABLE是一个集合对象,为一个Hash表,里面定义了各种水果的价格,KEY为各种水果的标识,VALUE为对应的价格。这个表达式就是查询苹果的价格。

 

示例5:

@contains(FruitList, Apple)?"Yes, apple is included": "No, apple isn't included"

其中@contains是预定义的函数。FruitList是一个集合对象(List),该表达式的含义就是判断苹果是否包含在水果列表中。

 

ExpressionParser还实现了很多其他的函数,就不一一举例说明。最重要的是,可以根据需求对函数库进行扩展。


用户可以基于ExpressionParser做二次开发,将各种复杂并且频繁变化的业务逻辑通过expression的形式定义在配置文件中,由ExpressionParser以及用户扩展的逻辑来自动计算配置文件中定义的expression。这样就非常灵活,大大提高项目的可维护性以及可扩展性。

 

我基于ExpressionParser做了一个DEMO,截图如下:

在左边的输入框中输入表达式,点击“Calculate”,就会在右边显示出结果。有感兴趣的朋友,可以邮件联系我。 benjamin_wang@yahoo.cn
  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值