当前位置:编程学习 > 网站相关 >>

解释器模式(python)

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

view plain
#encoding=utf-8 

#by pora 
#解释器模式 
 
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(); 


类图:

 

\

 

摘自

ponder008的专栏

补充:Web开发 , Python ,
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,