解析器模式详解

1.简介

在软件开发中,会遇到有些问题多次重复出现,而且有一定的相似性和规律性。如果将它们归纳成一种简单的语言,那么这些问题实例将是该语言的一些句子,这样就可以用“编译原理”中的解释器模式来实现了。
虽然使用解释器模式的实例不是很多,但对于满足以上特点,且对运行效率不是很高的应用实例,如果用解释器模式来实现,其效果是非常好的。

2.定义

解释器(Interpreter)模式的定义:给分析对象定义一个语言,并定义该语言的文法表示,再设计一个解释器来解释语言中的句子。也就是说,用编译语言的方式来分析应用中的实例。这种模式实现了文法表达式处理的接口,该接口解释一个特定的上下文。
这里提到的文法和句子的概念同编译原理中的描述相同,“文法”指语言的语法规则,而“句子”是语言集中的元素。例如,汉语中的句子有很多,“我是中国人”是其中的一个句子,可以用一颗语法树来直观描述语句中的句子。

3.优点

  1. 扩展性好。由于在解释器模式中使用类来表示语言的文法规则,因此可以通过继承等机制来改变或扩展文法。
  2. 容易实现。在语法树的每个表达节点类都是相似的,所以实现其文法较为容易。

4.缺点

  1. 执行效率低。解释器模式中通常适用大量的循环和递归调用,当要解释的句子较复杂时,其运行速度很慢,且代码的调用过程也比较麻烦。
  2. 会引起类膨胀。解释器模式中的每条规则至少需要定义一个类,当包含的文法规则很多时,类的个数将急剧增加,导致系统难以管理与维护。
  3. 可应用的场景比较少。在软件开发中,需要定义语言文法的应用实例非常少,所以这种模式很少被使用到。

5.结构

解释器模式常用于对简单语言的编译或分析实例中,为了掌握好它的结构与实现,必须先了解编译原理中的“文法、句子、语法树”等相关概念。

1.文法

文法是用于描述语言的语法结构的形式规则。没有规矩不成方圆,例如,有些人认为完美爱情的准则是“相互吸引、感情专一”,语言也一样,不管它是极其语言还是自然语言,都有它自己的文法规则。
例如,中文中的“句子”的文法如下:

〈句子〉::=〈主语〉〈谓语〉〈宾语〉
〈主语〉::=〈代词〉|〈名词〉
〈谓语〉::=〈动词〉
〈宾语〉::=〈代词〉|〈名词〉
〈代词〉你|我|他
〈名词〉大学生I筱霞I英语
〈动词〉是|学习

其中,“::=”表示为“定义为的意思”,用“〈”和“〉”括住的是非终结符,没有括住的是终结符。

2.句子

句子是语言的基本单位,是语言集中的一个元素,它由终结符构成,能由“文法”推导出。例如,上述文法可以推出“我是大学生”,所以它是句子。

3.语法树

语法树是句子结构的一种树形表示,它代表了句子的推导结果,它有利于理解句子语法结构的层次。
下图是“我是大学生”的语法树。
解析器模式详解_第1张图片

4.解释器模式结构

解释器模式的结构与组合模式相似,不过其包含的组

你可能感兴趣的:(设计模式,设计模式)