设计模式的理解:解释器模式 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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
解释器模式Interpreter Pattern)是一种行为型设计模式,它定义了一种语言文法的表示,并定义了一个解释器,用于解释语言中的句子。它将一个问题分成两个部分:一部分是语言的文法规则,另一部分是解释器,用来解释规则中的句子。解释器模式可以用于处理一些简单的语言,如数学表达式、正则表达式等。 实现方式: 1. 定义抽象表达式类(AbstractExpression),它是所有表达式类的父类,声明了抽象的解释方法。 2. 定义终结符表达式类(TerminalExpression),它实现了抽象表达式类中的解释方法,用于解释语言中的终结符。 3. 定义非终结符表达式类(NonterminalExpression),它也实现了抽象表达式类中的解释方法,用于解释语言中的非终结符。 4. 定义上下文类(Context),它包含了解释器需要的一些全局信息。 5. 客户端使用时,先创建一个上下文对象,然后将需要解释的语言句子作为参数传入解释器对象中,解释器对象将句子解释成相应的结果。 优点: 1. 可扩展性好,增加新的文法规则只需要添加相应的非终结符表达式类即可。 2. 易于实现语法分析。 缺点: 1. 对于复杂的文法规则,解释器模式的类数量可能会很大,增加程序的复杂性。 2. 执行效率较低,因为需要递归调用解释器对象。 适用场景: 1. 可以用于处理一些简单的语言,如数学表达式、正则表达式等。 2. 当语言的文法规则比较复杂时,可以使用解释器模式进行语法分析。 3. 当需要对语言进行增强时,可以使用解释器模式添加新的文法规则。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值