解释器模式(python)

解释器模式: 给定一个语言,定义它文法的一种表示,并定义一个解释器。这个解释器使用该‘表示’来解释语言中的句子。

应用场景:如果一种特定类型的问题发生的频率足够高,那么可能就值得将该问题的各个实例表述为一个简单语言中的句子。这样就可以构建一个解释器,该解释器通过解释这些句子来解决该问题。比如“正常表达式”。

#encoding=utf-8
#
#by panda
#解释器模式

def printInfo(info):
    print unicode(info, 'utf-8').encode('gbk'),

#上下文类:演奏内容
class PlayContext():
    text = None
    PlayText = None

#抽象表达式类
class Expression():
    def Interpret(self, context):
        if len(context.PlayText) == 0:
            return
        else:
            playKey = context.PlayText[0:1]
            context.PlayText = context.PlayText[2:]
            tmp = context.PlayText.index(' ') #找出第一个空格出现的位置
            playValue = context.PlayText[0:tmp]
            context.PlayText = context.PlayText[tmp+1:]
            self.Excute(playKey,playValue)
    
    def Excute(self,playKey,playValue):
        pass

#音高
class Pitch(Expression):
    pitch = None
    def Excute(self, key, value):
        value = int(value)
        if value == 1:
            self.pitch = '低音'
        elif value == 2:
            self.pitch = '中音'
        elif value == 3:
            self.pitch = '高音'
        printInfo(self.pitch)
        
#音符
class Note(Expression):
    Notes = {
    'C':1,    
    'D':2,
    'E':3,    
    'F':4,    
    'G':5,    
    'A':6,    
    'B':7,    
    }
    note = None
    def Excute(self, key, value):     
        self.note = self.Notes[key]
        printInfo('%d' % self.note)


def clientUI():
    context = PlayContext()
    context.PlayText = "O 2 E 0.5 G 0.5 A 3 E 0.5 G 0.5 D 3 E 0.5 G 0.5 A 0.5 O 3 C 1 O 2 A 0.5 G 1 C 0.5 E 0.5 D 3 "
    expression = None;
    while(len(context.PlayText) > 0):
        str = context.PlayText[0:1];
        if(str == 'O'):
            expression = Pitch()
        elif(str == 'C' or str == 'D' or str == 'E' or str == 'F' or str == 'G' or str == 'A' or str == 'B' or str == 'P'):
            expression = Note()
        expression.Interpret(context)
            
    return

if __name__ == '__main__':
    clientUI();



类图


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值