解释器模式
希望通过一些简单的语言实现一些特定的操作,向计算机输入一个句子或文件,他就能够按照预先定义的文法规定对句子或文件进行解释,从而实现相应的功能。
解释器模式描叙了如何为简单语言定义一个文法,如何在该语言中表达一个句子,以及如何去解释这些句子,这就涉及到如何表达一个语言的文法以及如何构造一棵抽象语法树。
以具体下面的表达式为例,1+2+3+4-1,
可以使用如下的文法规则去表达:
expression ::= value | operation
operation ::= expression + expression | expression - expression
value ::= integer
::= 表示定义为,由左右两个语言单位的定义而成,语言单位由终结符(语言组成的元素不能再分解)与非终结符组成。
抽象语法树则通过图形方式来直观表达语言的组成,每一棵抽象语法树对应一个语言实例,
终结符表达式类的实例表示为叶子结点,而非终结符表达类的实例表示为非叶子结点,可以将终结符表达式类的实例以及包含终结符与非终结符实例的子表达式作为其子节点。
代码可以去我的资源中下载。
解释器模式结构图
Context: 环境类,主要用于存储解释器之外的一些全局信息,通常临时存储需要解释的句子。
抽象表达式: 抽象表达式中声明了抽象的解释操作,是所有非终结符表达式与终结符表达式的父类。
终结符表达式: 抽象表达式子类,实现了与文法中终结符相关的解释操作,在句子中的每一个终结符都是该类的一个实例。一般解释器模式中只有几个少数的终结符表达式子类,它们的实例可以通过非终结符表达式组成较为复杂的句子。
非终结符表达式: 抽象表达式子类,实现了文法中非终结符的解释操作,由于非终结符表达式中可以包含终结符表达式,也可以继续包含非终极符表达式,因此解释操作一般通过递归方式操作。
优缺点
优点:
- 易于扩展与改变文法,实现文法容易。
- 每一条文法规则都可以表示为一个类,可以实现简单的语言。
缺点:
- 对于复杂的文法难以维护,需要类对象管理偏多,造成系统难以维护与管理。
- 执行效率低, 可能会包含有大量的循环与递归调用,因此在解释复杂的句子中速度很慢。