欢迎来到天天文库
浏览记录
ID:36432705
大小:2.31 MB
页数:25页
时间:2019-05-09
《C#设计模式-解释器模式》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库。
1、DesignPatterns解释器模式刘伟(Sunny)weiliu_china@126.com大纲解释器模式概述文法规则和抽象语法树解释器模式的结构与实现解释器模式的应用实例解释器模式的优缺点与适用环境要不要弄个新的编程语言玩玩?解释器模式概述加法/减法解释器示意图解释器模式概述分析C#语言无法直接解释类似“1+2+3–4+1”这样的字符串定义一套文法规则来实现对这些语句的解释,即设计一个自定义语言基于现有的编程语言面向对象编程语言解释器模式解释器模式概述解释器模式的定义类行为型模式解释器模式:给定一个语言,定义它的文法的一种表示,并定义一个解释器,这个解释器使用该表示
2、来解释语言中的句子。InterpreterPattern:Givenalanguage,definearepresentationforitsgrammaralongwithaninterpreterthatusestherepresentationtointerpretsentencesinthelanguage.解释器模式概述解释器模式的定义在解释器模式的定义中所指的“语言”是使用规定格式和语法的代码是一种使用频率相对较低但学习难度相对较大的设计模式,用于描述如何使用面向对象语言构成一个简单的语言解释器能够加深对面向对象思想的理解,并且理解编程语言中文法规则的解释过程文法
3、规则和抽象语法树文法规则1+2+3–4+1“::=”表示“定义为”“
4、”表示“或”“{”和“}”表示“组合”“*”表示“出现0次或多次”expression::=value
5、operationoperation::=expression'+'expression
6、expression'-'expressionvalue::=aninteger//一个整数值文法规则和抽象语法树抽象语法树抽象语法树(AbstractSyntaxTree,AST)描述了如何构成一个复杂的句子,通过对抽象语法树的分析,可以识别出语言中的终结符类和非终结符类非终结符表达式终结符表达式解释器模式的结构与
7、实现解释器模式的结构解释器模式的结构与实现解释器模式的结构解释器模式包含以下4个角色:AbstractExpression(抽象表达式)TerminalExpression(终结符表达式)NonterminalExpression(非终结符表达式)Context(环境类)解释器模式的结构与实现解释器模式的实现典型的抽象表达式类代码:abstractclassAbstractExpression{publicabstractvoidInterpret(Contextctx);}解释器模式的结构与实现解释器模式的实现典型的终结符表达式类代码:classTerminalExpres
8、sion:AbstractExpression{publicoverridevoidInterpret(Contextctx){//终结符表达式的解释操作}}解释器模式的结构与实现解释器模式的实现典型的非终结符表达式类代码:classNonterminalExpression:AbstractExpression{privateAbstractExpressionleft;privateAbstractExpressionright;publicNonterminalExpression(AbstractExpressionleft,AbstractExpressionrig
9、ht){this.left=left;this.right=right;}publicoverridevoidInterpret(Contextctx){//递归调用每一个组成部分的interpret()方法//在递归调用时指定组成部分的连接方式,即非终结符的功能}}解释器模式的结构与实现解释器模式的实现环境类Context:用于存储一些全局信息,一般包含一个Hashtable或List等类型的集合对象(也可以直接由Hashtable等集合类充当环境类),存储一系列公共信息,例如变量名与值的映射关系(key/value)等,用于在执行具体的解释操作时从中获取相关信息可以在环境
10、类中增加一些所有表达式解释器都共有的功能,以减轻解释器的职责当系统无须提供全局公共信息时可以省略环境类,根据实际情况决定是否需要环境类解释器模式的结构与实现解释器模式的实现典型的环境类代码:usingSystem.Collections;classContext{privateHashtableht=newHashtable();//往集合对象中设值publicvoidAssign(stringkey,stringvalue){ht.Add(key,value);}//获取存储在集合对象中的值publi
此文档下载收益归作者所有