zoukankan      html  css  js  c++  java
  • python-解释器模式

    源码地址:https://github.com/weilanhanf/PythonDesignPatterns

    说明:

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

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

    解释器模式的结构

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

    实例:

    #要开发一个自动识别谱子的吉他模拟器,达到录入谱即可按照谱发声的效果。
    # 除了发声设备外(假设已完成),最重要的就是读谱和译谱能力了。
    # 分析其需求,整个过程大致上分可以分为两部分:
    # 根据规则翻译谱的内容;根据翻译的内容演奏。
    # 我们用一个解释器模型来完成这个功能。
    class PlayContext():
        play_text = None
    
    class Expression():
        def interpret(self, context):
            if len(context.play_text) == 0:
                return
            else:
                play_segs=context.play_text.split(" ")
                for play_seg in play_segs:
                    pos=0
                    for ele in play_seg:
                        if ele.isalpha():#检验字符串是否只由字母组成
                            pos+=1
                            continue
                        break
                    play_chord = play_seg[0:pos]
                    play_value = play_seg[pos:]
                    self.execute(play_chord,play_value)
        def execute(self,play_key,play_value):
            pass
    
    class NormGuitar(Expression):
        def execute(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

    模式优点

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

    模式缺点

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

    模式适用环境

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

  • 相关阅读:
    Sharding-JDBC(三)3.1.0版本实践
    Sharding-JDBC(二)2.0.3版本实践
    Sharding-JDBC(一)简介
    Java并发(六)线程池监控
    Java并发(五)线程池使用番外-分析RejectedExecutionException异常
    Java并发(四)线程池使用
    Java并发(三)线程池原理
    Java并发(二)异步转同步
    tarjan+概率
    线段树(种树)
  • 原文地址:https://www.cnblogs.com/welan/p/9129884.html
Copyright © 2011-2022 走看看