首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 其他教程 > 其他相关 >

21.解析器形式(Interpreter Pattern)

2012-12-20 
21.解析器模式(Interpreter Pattern)1.定义给定一门语言,定义它的文法的一种表示,并定义一个解释器,该解释

21.解析器模式(Interpreter Pattern)

1.定义

给定一门语言,定义它的文法的一种表示,并定义一个解释器,该解释器使用该表示来解释语言中句子。
属于行为类模式。

?

2.解释器模式的使用场景

重复发生的问题可以使用解释器模式:比如根据用户输入的公式进行加减乘除四则运算,但是他们输入的公式每次都不同,有时是a+b-c*d,有时是a*b+c-d,等等等等个,公式千变万化,但是都是由加减乘除四个非终结符来连接的,这时我们就可以使用解释器模式。一个简单语法需要解释的场景:你看看下面给出的例子,非终结表达式,文法规则越多,复杂度越高,而且类间还要进行递归调用。因此解释器模式一般用来解析比较标准的字符集,例如sql语法分析,不过该部分逐渐被专用工具所取代。

在实际开发工作中经常会有客户要求计算公式他们自己制定,我们只要按照他们的公式和提供的数据进行运算就行了,那么这个业务逻辑也就不能写死了。
下面让我们工具加减乘除四则运算的例子来看看何谓解释器模式(四则比较麻烦,例子只写加减操作):

?

?

4.解释器模式的优点

解释器是一个简单的语法分析工具,它最显著的优点就是扩展性,修改语法规则只需要修改相应的非终结符就可以了,若扩展语法,只需要增加非终结符类就可以了。

?

5.解释器模式的缺点

解释器模式会引起类的膨胀:每个语法都需要产生一个非终结符表达式,语法规则比较复杂时,就可能产生大量的类文件,为维护带来非常多的麻烦。解释器模式采用递归调用方法:每个非终结符表达式只关心与自己相关的表达式,每个表达式需要知道最终的结果,必须通过一层一层的剥茧,无论是面向对象的语言还是面向过程的语言,递归都是一个不推荐的方式(只在必要条件下使用),它将导致调试非常复杂。想想看,如果要排查一个错误,我们是不是要一个个断点调试下去,直至最小的语法单元。解释器模式使用了大量的循环和递归:效率是一个不容忽视的问题。特别是用于解释一个解析复杂、冗长的语法时,效率是难以忍受的。

6.解释器模式的注意事项

尽量不要在重要模块中使用解释器模式,否则维护会是一个很大的问题。在项目中可以使用shell、JRuby、Groovy等脚本语言来代替解释器模式、弥补Java编译型语言的不足。我们在一个银行的分析型项目中就采用了JRuby进行运算处理,避免使用解释器模式的四则运算,效率和性能各方面表现良好。

解释器模式在实际的系统开发中使用的非常少,因为它会引起效率、性能以及维护等问题,一般在大中型的框架型项目中能找到它的身影,如一些数据分析工具、报表设计工具、科学计算工具等,如果你确实遇到“一种特定类型的问题发生的频率足够高”的情况,准备使用解释器模式时,可以考虑一下Expression4J、MESP、Jep等开源的解析工具包,功能都非常强大,而且非常容易使用,效率也不错,实现大多数的数学运算完全没有问题,自己没有必要重头开始编写解释器。

热点排行