解释器模式是平时工作当中相对冷门的一个设计模式,也非常的难于理解,百度百科上的解释也非常之少,只是简单的介绍了一下,并且说了一句,可以参考正则表达式为一个实际的应用例子。
不过资料的匮乏并不能阻止我们对真理的探索,下面LZ先将百度百科上的定义以及解决的问题拔到这里,方便各位观看。
定义:给定一个语言,定义它的文法的一种表示,并定义一个解释器,这个解释器使用该表示来解释语言中的句子。
使用场景:解释器模式需要解决的是,如果一种特定类型的问题发生的频率足够高,那么可能就得将该问题的各个实例表述为一个简单语言中的句子。这样就可以构建一个解释器,该解释器通过解释这些句子来解决该问题。
LZ先给各位解释一下定义当中所提到的文法。文法也称为语法,指的是语言的结构方式。包括词的构成和变化,词组和句子的组织。对于文法来说,我们可以简单的理解为一种语言的规则,那么从解释器模式的定义可以看出,首先我们要先设计一种语言,然后给出语言的文法的表示,而在此基础上,我们采用解释器模式去解释语言中的句子。
要想彻底的理解解释器模式,LZ必须要先普及一下文法的定义,请各位暂且忍受住枯燥的理论知识,后面LZ会将这些理论用各位熟悉的代码诠释一遍。
首先我们来讨论一下上下文无关文法的组成,有四种组成部分。
1,非终结符号集(LZ标注:像JA语言中的表达式,程序语句,标识符等)
2,终结符号集(LZ标注:类JA语言中的,-,*,\,=等)
3,产生式集合,也可以称为规则集合(LZ标注:假设我们记JA中的标识符为id,那么下面这句话可以被成视为一条规则 id->a|b...|z|0..|9|_,其中|是或者的意思)
4,一个起始符号,这个符号是非终结符号集的一个元素(LZ标注:JA语言使用CompilationUnit(编译单元)作为起始符号。)
上面所说的定义有些抽象,所以LZ在后面加了一些标注,那么上下文无关文法的作用是什么呢?
它可以生成一组由文法导出的语句,这些语句可以根据文法的产生式进行分析,下面LZ给一个《编译原理》一书中的简单例子,为了方便理解,LZ将符号稍微更改了一下。
假设有一上下文无关文法如下:
arithmetic->arithmetic number | arithmetic- number | number
number -> 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9
我们根据这个文法可以得到所有个位数的加减表达式,比如对于 9 2 - 1 ,我们可以通过以下步骤推导出来。
arithmetic- >arithmetic- number ->arithmetic number - number -> number number - number -> 9 number -number -> 9 2 - number -> 9 2 - 1
对于文法来说,一个语句如果能够按照产生式推导出该语句,就称该语句是符合文法的,所以9 2 - 1是符合上述文法的一个语句。
在这个文法当中,其中非终结者符号是 arithmetic和 number, 而终结者符号是 0 - 9 、-、 。
我们从文法中可以得知由该文法组成的语句有以下规则。
1、operator的右边必须是一个number。解释器模式的优点
2、operator的左边必须是一个arithmetic。
本文来自电脑杂谈,转载请注明本文网址:
https://www.pc-fly.com/a/jisuanjixue/article-34001-1.html
如果美国敢“误撞”
]
请拿出当年“保卫珍宝岛