zoukankan      html  css  js  c++  java
  • 访问者模式(学习笔记22)

    原文:http://c.biancheng.net/view/1402.html

    定义:给分析对象定义一个语言,并定义该语言的文法表示,再设计一个解析器来解释语言中的句子。

    什么时候用:

    1. 当语言的文法较为简单,且执行效率不是关键问题时。
    2. 当问题重复出现,且可以用一种简单的语言来进行表达时。
    3. 当一个语言需要解释执行,并且语言中的句子可以表示为一个抽象语法树的时候,如 XML 文档解释。

    主要优点:

    1. 扩展性好。由于在解释器模式中使用类来表示语言的文法规则,因此可以通过继承等机制来改变或扩展文法。
    2. 容易实现。在语法树中的每个表达式节点类都是相似的,所以实现其文法较为容易。

    主要缺点:
    1. 执行效率较低。解释器模式中通常使用大量的循环和递归调用,当要解释的句子较复杂时,其运行速度很慢,且代码的调试过程也比较麻烦。
    2. 会引起类膨胀。解释器模式中的每条规则至少需要定义一个类,当包含的文法规则很多时,类的个数将急剧增加,导致系统难以管理与维护。
    3. 可应用的场景比较少。在软件开发中,需要定义语言文法的应用实例非常少,所以这种模式很少被使用到

    结构图:

    image

    示例代码:

    package net.biancheng.c.interpreter;
    
    //抽象表达式类
    interface AbstractExpression {
        public void interpret(String info);    //解释方法
    }
    
    //终结符表达式类
    class TerminalExpression implements AbstractExpression {
        public void interpret(String info) {
            //对终结符表达式的处理
        }
    }
    
    //非终结符表达式类
    class NonterminalExpression implements AbstractExpression {
        private AbstractExpression exp1;
        private AbstractExpression exp2;
    
        public void interpret(String info) {
            //非对终结符表达式的处理
        }
    }
    
    //环境类
    class Context {
        private AbstractExpression exp;
    
        public Context() {
            //数据初始化
        }
    
        public void operation(String info) {
            //调用相关表达式类的解释方法
        }
    }
  • 相关阅读:
    审 讯 技巧
    带参数的多线程的方式
    通达信日线 数据格式
    visual studio 2012 update3
    单实例运行tz
    维特比算法
    Kooboo CMS的安装步骤
    年龄
    富文本编辑器---非常实用的
    printf 打印 unit32_t
  • 原文地址:https://www.cnblogs.com/huiy/p/15577126.html
Copyright © 2011-2022 走看看