设计模式的理解:解释器模式 Interpreter

解释器模式(Interpreter Pattern)提供了评估语言的语法或表达式的方式,它属于行为型模式。这种模式实现了一个表达式接口,该接口解释一个特定的上下文。这种模式被用在 SQL 解析、符号处理引擎等。

这种模式的难点主要是文法解析算法的设计,需要了解些编译原理的知识。

所谓终结符,就是文法中不可再细分的字符,例如关键字,变量,运算符,结束符,常量等。  非终结符就是还可以再划分的东西,例如 条件表达式,算术表达式,代码块等

编译的步骤分为四大步骤:

1)词法分析 : 把输入的字符串拆分成单词,判断出哪些单词是 运算符,介词(关键字),数字,变量名。创建单词对象

2)语法分析 : 语法分析有自上而下和自下而上两种分析方法,用来判断语法是否规范。

3)语义分析 :用来判断在语法正确的情况下是否符合语义,将输入的表达式变成一种规范的格式。

4)目标代码生成:将这些包含语义,格式规范化的对象进行操作,生成出目标代码;

 

 

例如这样的一个文法:

while 布尔表达式 then 代码块 end;

其中 while ,then,end 就是终结符  ,  布尔表达式 和代码块就是非终结符。非终结符可以再划分,例如

//B代表布尔表达式,C代表代码块则,i代表常量和变量
C->%C%        //最开始的文法表达式
C->B          //代码块可以是一个 布尔表达式
C->B ;C       //代码块可以是一个 布尔表达式 ; 代码块
B-> i         //布尔表达式可以是单个变量或常量
B-> i >i      //布尔表达式可以是 单个常/变量 >  单个常/变量
B-> i < i     //布尔表达式可以是 单个常/变量 <  单个常/变量
B-> i == i    //布尔表达式可以是 单个常/变量 ==  单个常/变量
B-> B && B    //布尔表达式可以是 布尔表达式 &&  布尔表达式
B-> B || B    //布尔表达式可以是 布尔表达式 ||  布尔表达式
B-> !B        //布尔表达式可以是 !布尔表达式

例如我输入   mynum >8 && mynum < 20 ;

首先第一步,给输入的表达式的加上开始符,"%mynum >8 && mynum < 20%";之后将要拆分单词,判断出 mynum 是变量 , “>” 是一个终结符, “8”是一个常量 ,“&&”是一个非终结符,mynum 是变量, “<” 是一个终结符, “20”是一个常量

第二步就是到了代码”稳定”的部分: 根据输入的单词对象,判断能不能反推回最开始的文法:

"%mynum >8 && mynum < 20%"  将变量和常量替换成i “% i >i && i<I%”,之后反推回 “%B && B%”;在反推回 “%B%”,再反推回 “%C%”,再反推成最开始的表达式“C” 。能推出开始表达式说明语法分析通过

第三步也是代码”稳定”的部分,语义分析:要对每个终结符进行相应的判断操作 例如  <   ,> ,==,&&的操作逻辑,将操作的逻辑,结果用对象进行封装。通常采用三元式表示或者四元式表示的方法。

第四步目标代码生成:就是解析三元式或者四元式,生成出代码。

当然第四步在编译原理中是为了代码生成,而在解析器场景中一般是为了得出一个结果。

 

 

具体的案例可以参考(没用模式,写的很烂)

词法分析:https://blog.csdn.net/superSmart_Dong/article/details/79164260

语法/语义分析 :https://blog.csdn.net/superSmart_Dong/article/details/79169332

目标代码生成 :https://blog.csdn.net/superSmart_Dong/article/details/79187150

Guess you like

Origin blog.csdn.net/superSmart_Dong/article/details/115586726