电子文档交易市场
安卓APP | ios版本
电子文档交易市场
安卓APP | ios版本

Interpreter(解释器)模式--精选文档

6页
  • 卖家[上传人]:M****1
  • 文档编号:513851351
  • 上传时间:2023-12-10
  • 文档格式:DOC
  • 文档大小:24KB
  • / 6 举报 版权申诉 马上下载
  • 文本预览
  • 下载提示
  • 常见问题
    • 1、设计模式-Interpreter(解释器)模式GOF:给定一个语言,定义它的文法的一种表示,并定义一个解释器,这个解释器使用该表示来解释语言中的句子。现在的大大小小(以应用面的宽广来说)编程语言不下几百种。Interpreter模式描述了一个语言解释器是如何构成的,在实际应用中我们可能很少去构造一个语言的文法。因为现有的也学不好啊。考虑再三,我觉定不深入研究了。以后有时间再补上,有机会了再深入研究。为了设计模式学习的完整,还是写了这片文章。一、引子其实没有什么好的例子引入解释器模式,因为它描述了如何构成一个简单的语言解释器,主要应用在使用面向对象语言开发编译器中;在实际应用中,我们可能很少碰到去构造一个语言的文法的情况。虽然你几乎用不到这个模式,但是看一看还是能受到一定的启发的。二、定义与结构解释器模式的定义如下:定义语言的文法,并且建立一个解释器来解释该语言中的句子。它属于类的行为模式。这里的语言意思是使用规定格式和语法的代码。在GOF的书中指出:如果一种特定类型的问题发生的频率足够高,那么可能就值得将该问题的各个实例表述为一个简单语言中的句子。这样就可以构建一个解释器,该解释器通过

      2、解释这些句子来解决该问题。而且当文法简单、效率不是关键问题的时候效果最好。呵呵,这也就是解释器模式应用的环境了。让我们来看看神秘的解释器模式是由什么来组成的吧。1) 抽象表达式角色:声明一个抽象的解释操作,这个接口为所有具体表达式角色(抽象语法树中的节点)都要实现的。什么叫做抽象语法树呢?java与模式中给的解释为:抽象语法树的每一个节点都代表一个语句,而在每个节点上都可以执行解释方法。这个解释方法的执行就代表这个语句被解释。由于每一个语句都代表这个语句被解释。由于每一个语句都代表一个常见的问题的实例,因此每一个节点上的解释操作都代表对一个问题实例的解答。2) 终结符表达式角色:具体表达式。a) 实现与文法中的终结符相关联的解释操作b) 而且句子中的每个终结符需要该类的一个实例与之对应3) 非终结符表达式角色:具体表达式。a) 文法中的每条规则R:=R1R2Rn都需要一个非终结符表带式角色b) 对于从R1到Rn的每个符号都维护一个抽象表达式角色的实例变量c) 实现解释操作,解释一般要递归地调用表示从R1到Rn的那些对象的解释操作4) 上下文(环境)角色:包含解释器之外的一些全局信息。5

      3、) 客户角色:a) 构建(或者被给定)表示该文法定义的语言中的一个特定的句子的抽象语法树b) 调用解释操作放上张解释器结构类图吧,这也是来自于GOF的书中。呵呵,对每一个角色都给出了详细的职责,而且在类图中给出五个角色之间的关系。这样实现起来也不是很困难了,下面举了一个简单的例子,希望能加深你对解释器模式的理解。三、举例来举一个加减乘除的例子吧,实现思路来自于java与模式中的例子。每个角色的功能按照上面提到的规范来实现。/上下文(环境)角色,使用HashMap来存储变量对应的数值class Context private Map valueMap = new HashMap();public void addValue(Variable x , int y)Integer yi = new Integer(y);valueMap.put(x , yi);public int LookupValue(Variable x)int i = (Integer)valueMap.get(x).intValue();return i ;/抽象表达式角色,也可以用接口来实现abstract cl

      4、ass Expressionpublic abstract int interpret(Context con);/终结符表达式角色class Constant extends Expressionprivate int i ;public Constant(int i)this.i = i;public int interpret(Context con)return i ;class Variable extends Expressionpublic int interpret(Context con)/this为调用interpret方法的Variable对象return con.LookupValue(this);/非终结符表达式角色class Add extends Expressionprivate Expression left ,right ;public Add(Expression left , Expression right)this.left = left ;this.right= right ;public int interpret(Context con

      5、)return left.interpret(con) + right.interpret(con);class Subtract extends Expressionprivate Expression left , right ;public Subtract(Expression left , Expression right)this.left = left ;this.right= right ;public int interpret(Context con)return left.interpret(con) - right.interpret(con);class Multiply extends Expressionprivate Expression left , right ;public Multiply(Expression left , Expression right)this.left = left ;this.right= right ;public int interpret(Context con)return left.interpret(con

      6、) * right.interpret(con);class Division extends Expressionprivate Expression left , right ;public Division(Expression left , Expression right)this.left = left ;this.right= right ;public int interpret(Context con)tryreturn left.interpret(con) / right.interpret(con);catch(ArithmeticException ae)System.out.println(被除数为0!);return -11111;/测试程序,计算 (a*b)/(a-b+2)public class Testprivate static Expression ex ;private static Context con ;public static void main(String args)con = new Context();/设置变量、常量Vari

      7、able a = new Variable();Variable b = new Variable();Constant c = new Constant(2);/为变量赋值con.addValue(a , 5);con.addValue(b , 7);/运算,对句子的结构由我们自己来分析,构造ex = new Division(new Multiply(a , b), new Add(new Subtract(a , b) , c);System.out.println(运算结果为:+ex.interpret(con);解释器模式并没有说明如何创建一个抽象语法树,因此它的实现可以多种多样,在上面我们是直接在Test中提供的,当然还有更好、更专业的实现方式。对于终结符,GOF建议采用享元模式来共享它们的拷贝,因为它们要多次重复出现。但是考虑到享元模式的使用局限性,我建议还是当你的系统中终结符重复的足够多的时候再考虑享元模式(关于享元模式,请参考我的深入浅出享元模式)。四、优缺点解释器模式提供了一个简单的方式来执行语法,而且容易修改或者扩展语法。一般系统中很多类使用相似的语法,可以使用一个解释器来代替为每一个规则实现一个解释器。而且在解释器中不同的规则是由不同的类来实现的,这样使得添加一个新的语法规则变得简单。但是解释器模式对于复杂文法难以维护。可以想象一下,每一个规则要对应一个处理类,而且这些类还要递归调用抽象表达式角色,多如乱麻的类交织在一起是多么恐怖的一件事啊!五、总结这样对解释器模式应该有了些大体的认识了吧,由于这个模式使用的案例匮乏,所以本文大部分观点直接来自于GOF的原著。只是实例代码是亲自实现并调试通过的。

      《Interpreter(解释器)模式--精选文档》由会员M****1分享,可在线阅读,更多相关《Interpreter(解释器)模式--精选文档》请在金锄头文库上搜索。

      点击阅读更多内容
    最新标签
    监控施工 信息化课堂中的合作学习结业作业七年级语文 发车时刻表 长途客运 入党志愿书填写模板精品 庆祝建党101周年多体裁诗歌朗诵素材汇编10篇唯一微庆祝 智能家居系统本科论文 心得感悟 雁楠中学 20230513224122 2022 公安主题党日 部编版四年级第三单元综合性学习课件 机关事务中心2022年全面依法治区工作总结及来年工作安排 入党积极分子自我推荐 世界水日ppt 关于构建更高水平的全民健身公共服务体系的意见 空气单元分析 哈里德课件 2022年乡村振兴驻村工作计划 空气教材分析 五年级下册科学教材分析 退役军人事务局季度工作总结 集装箱房合同 2021年财务报表 2022年继续教育公需课 2022年公需课 2022年日历每月一张 名词性从句在写作中的应用 局域网技术与局域网组建 施工网格 薪资体系 运维实施方案 硫酸安全技术 柔韧训练 既有居住建筑节能改造技术规程 建筑工地疫情防控 大型工程技术风险 磷酸二氢钾 2022年小学三年级语文下册教学总结例文 少儿美术-小花 2022年环保倡议书模板六篇 2022年监理辞职报告精选 2022年畅想未来记叙文精品 企业信息化建设与管理课程实验指导书范本 草房子读后感-第1篇 小数乘整数教学PPT课件人教版五年级数学上册 2022年教师个人工作计划范本-工作计划 国学小名士经典诵读电视大赛观后感诵读经典传承美德 医疗质量管理制度 2
    关于金锄头网 - 版权申诉 - 免责声明 - 诚邀英才 - 联系我们
    手机版 | 川公网安备 51140202000112号 | 经营许可证(蜀ICP备13022795号)
    ©2008-2016 by Sichuan Goldhoe Inc. All Rights Reserved.