python语言解释器模式_python-解释器模式

说明:

解释器模式在面向对象语言实现的编译器中得到了广泛的应用。但是此模式进适用于建大的文法解释,弊端又多,所以很少有其他方面使用。例如:将“1+2+3-4”等字符串输入到python的console,但是本身python不认识这些字符串,就需要定义的一套文法规则来解释这些字符串,也就是设计一个自定义语言。

解释器模式:给定一个语言,定义它的文法的一种表示,并定义一个解释器,这个解释器使用该表示来解释语言中的句子。在解释器模式的定义中所指的“语言”是使用规定格式和语法的代码。

解释器模式的结构

解释器模式包含以下4个角色: AbstractExpression(抽象表达式) TerminalExpression(终结符表达式) NonterminalExpression(非终结符表达式) Context(环境类)

实例:

#要开发一个自动识别谱子的吉他模拟器,达到录入谱即可按照谱发声的效果。#除了发声设备外(假设已完成),最重要的就是读谱和译谱能力了。#分析其需求,整个过程大致上分可以分为两部分:#根据规则翻译谱的内容;根据翻译的内容演奏。#我们用一个解释器模型来完成这个功能。

classPlayContext():

play_text=NoneclassExpression():definterpret(self, context):if len(context.play_text) ==0:return

else:

play_segs=context.play_text.split(" ")for play_seg inplay_segs:

pos=0for ele inplay_seg:if ele.isalpha():#检验字符串是否只由字母组成

pos+=1

continue

breakplay_chord=play_seg[0:pos]

play_value=play_seg[pos:]

self.execute(play_chord,play_value)defexecute(self,play_key,play_value):pass

classNormGuitar(Expression):defexecute(self, key, value):print("Normal Guitar Playing--Chord:%s Play Tune:%s"%(key,value))#PlayContext类为谱的内容,这里仅含一个字段,没有方法。#Expression即表达式,里面仅含两个方法,interpret负责转译谱,execute则负责演奏;NormGuitar类覆写execute,以吉他 的方式演奏。#业务场景如下:

if __name__=="__main__":

context=PlayContext()

context.play_text= "C53231323 Em43231323 F43231323 G63231323"guitar=NormGuitar()

guitar.interpret(context)

打印结果:

Normal Guitar Playing--Chord:C Play Tune:53231323

Normal Guitar Playing--Chord:Em Play Tune:43231323

Normal Guitar Playing--Chord:F Play Tune:43231323

Normal Guitar Playing--Chord:G Play Tune:63231323

模式优点

易于改变和扩展文法 可以方便地实现一个简单的语言 实现文法较为容易(有自动生成工具) 增加新的解释表达式较为方便

模式缺点

对于复杂文法难以维护 执行效率较低

模式适用环境

可以将一个需要解释执行的语言中的句子表示为一棵抽象语法树 一些重复出现的问题可以用一种简单的语言来进行表达 一个语言的文法较为简单 执行效率不是关键问题

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值