设计模式.解释器模式(Interpreter.pptx

上传人:小飞机 文档编号:6607371 上传时间:2023-11-17 格式:PPTX 页数:38 大小:1.46MB
返回 下载 相关 举报
设计模式.解释器模式(Interpreter.pptx_第1页
第1页 / 共38页
设计模式.解释器模式(Interpreter.pptx_第2页
第2页 / 共38页
设计模式.解释器模式(Interpreter.pptx_第3页
第3页 / 共38页
设计模式.解释器模式(Interpreter.pptx_第4页
第4页 / 共38页
设计模式.解释器模式(Interpreter.pptx_第5页
第5页 / 共38页
点击查看更多>>
资源描述

《设计模式.解释器模式(Interpreter.pptx》由会员分享,可在线阅读,更多相关《设计模式.解释器模式(Interpreter.pptx(38页珍藏版)》请在三一办公上搜索。

1、设计模式(Design Pattern),张凯 副教授计算机学院 软件工程系,问题(Problem),设计与实现一个四则算术运算解释器可以分析任意+、-、*、/表达式,并计算其数值输入表达式为一个字符串表达式输出结果为双精度浮点数(Double),问题(Problem),输入是一个用字符串表达的四则运算,比如 1+2*3。目的是试图去理解这个字符串表达的运算指令,然后计算出结果 7。之所以是一个解释器 Interpreter,而不是一个编译器 Compiler,是因为程序是去理解指令并且执行指令,而不是把指令编译成机器代码来运行;后者是编译器的目标。,问题(Problem),第一个部分,是截取

2、输入字符串,然后返回单元指令。比如,对于指令 1+2*3 4/5,就需要被分解成如下所示的单元指令集:,问题(Problem),第二个部分,把单元指令集组成一个树结构,称之为Abstract Syntax Tree。按照将来需要解释的顺序,优先执行的指令放在树的叶的位置,最后执行的指令是树根Root。,后缀式(逆波兰式)的求值,问题(Problem),程序只有 2 种单元指令:操作数 NumExpression 和 运算符 OpExpression。定义了一个抽象类,叫做 Expression,然后NumExpression和 OpExpression 继承了该抽象类。,问题(Problem)

3、,abstract class Expression abstract public double Interpreter(Syntax root);class NumExpression:Expression private double _value;public NumExpression(double value)this._value=value;public double Value get return this._value;public override double Interpreter(Syntax root)return(NumExpression)(root.Exp

4、ression).Value;,class OpExpression:Expression private Op _value;public override double Interpreter(Syntax root)double lvalue,rvalue;if(root.LeftChild=null)lvalue=0;else lvalue=(Expression)root.LeftChild.Expression).Interpreter(root.LeftChild);if(root.RightChild=null)rvalue=0;else rvalue=(Expression)

5、root.RightChild.Expression).Interpreter(root.RightChild);switch(OpExpression)root.Expression).Value)case Op.Plus:return lvalue+rvalue;case Op.Minus:return lvalue-rvalue;case Op.Multiply:return lvalue*rvalue;case Op.Divide:return lvalue/rvalue;default:return 0;,问题(Problem),enum Op:int Plus=+,Minus=-,

6、Multiply=*,Divide=/enum Prioirty Lv2=2,Lv1=1,Lv0=0,问题(Problem),class Syntax private Expression _Expression;private Syntax _left;private Syntax _right;public Syntax(Expression Expression)this._Expression=Expression;this._left=null;this._right=null;public Expression Expression get return this._Express

7、ion;public Syntax LeftChild get return this._left;set this._left=value;public Syntax RightChild get return this._right;set this._right=value;,class SyntaxTree private Syntax _root;private int _count;public SyntaxTree()this._root=null;this._count=0;public Syntax Root get return this._root;public void

8、 Append(Expression Expression)this._root=this.Append(this._root,Expression);this._count+;private Syntax Append(Syntax root,Expression Expression),问题(Problem),问题(Problem),class Interpreter private Expressionizer Expressionizer=new Expressionizer();public SyntaxTree Eval(String expr)Expression Express

9、ions=Expressionizer.Parse(expr);SyntaxTree astree=new SyntaxTree();foreach(Expression Expression in Expressions)astree.Append(Expression);return astree;,问题(Problem),从最简单的情况开始考虑:分析 1+2+3+4首先,AST 树是空的,Root=NULL。当把 NumExpression 1 插入树的时候,设置该 Expression 为根。当把 OpExpression+插入树的时候,需要挪动把+设置成根:,问题(Problem),

10、当把 NumExpression 2 插入树的时候,就把数字 2 插入树的右侧:,问题(Problem),当把 OpExpression+插入树的时候(同级别的操作符,顺序是左到右),我们就需要把最新的 OpExpression 设置成根,当前树设置成新根的左侧:,我们可以得出一个很重要的法则:插入一个新的操作符进入 AST 树的时候,若是树的根是一个操作符,并且和此新操作符同级,运算顺序是由左至右的话,那么新的操作符会成为新的树的根,现有的树会成为新树的左子树。,问题(Problem),假设要插入的操作符不是+,而是一个优先权比较高的*呢?也就是,若是 1+2*3 的话,AST 会是什么样子

11、?,这种情况下,乘法运算符必须移动到树的右子树上,并且成为右子树的根。原右子树会成为新的右子树的左子树。,主要内容,解释器模式(Interpreter),模式动机模式名称:解释器模式(Interpreter Pattern)如果在系统中某一特定类型的问题发生的频率很高,此时可以考虑将这些问题的实例表述为一个语言中的句子,因此可以构建一个解释器,该解释器通过解释这些句子来解决这些问题。解释器模式描述了如何构成一个简单的语言解释器,主要应用在使用面向对象语言开发的编译器中。,解释器模式(Interpreter),模式动机,解释器模式(Interpreter),模式定义 解释器模式(Interpre

12、ter Pattern):定义语言的文法,并且建立一个解释器来解释该语言中的句子,这里的“语言”意思是使用规定格式和语法的代码,它是一种类行为型模式。,解释器模式(Interpreter),模式结构,解释器模式(Interpreter),参与者 AbstractExpression:抽象表达式TerminalExpression:终结符表达式NonterminalExpression:非终结符表达式Context:环境类Client:客户类,解释器模式(Interpreter),static void Main(string args)Console.WriteLine(请输入表达式);Str

13、ing exp=Console.ReadLine();Interpreter interpreter=new Interpreter();SyntaxTree Context=interpreter.Eval(exp);Expression EXP=new OpExpression();double result=EXP.Interpreter(Context.Root);Console.WriteLine(result);Console.ReadKey();,构建语法树,开始解释,SyntaxTree 由 Syntax 组成,类似树形结构的结点,Expressionizer 在 Interp

14、reter 中使用,用来生成 Expression 数组,解释器模式(Interpreter),模式分析解释器模式描述了如何为简单的语言定义一个文法,如何在该语言中表示一个句子,以及如何解释这些句子。,解释器模式(Interpreter),模式分析文法规则实例:expression:=value|symbolsymbol:=expression+expression|expression-value:=an integer/一个整数值在文法规则定义中可以使用一些符号来表示不同的含义,如使用“|”表示或,使用“”和“”表示组合,使用“*”表示出现0次或多次等。,解释器模式(Interpreter

15、),模式分析抽象语法树:除了使用文法规则来定义一个语言,在解释器模式中还可以通过一种称之为抽象语法树(Abstract Syntax Tree,AST)的图形方式来直观地表示语言的构成,每一棵抽象语法树对应一个语言实例。,解释器模式(Interpreter),模式分析抽象语法树描述了如何构成一个复杂的句子,通过对抽象语法树的分析,可以识别出语言中的终结符和非终结符类。在解释器模式中,每一种终结符和非终结符都有一个具体类与之对应,正因为使用类来表示每一个语法规则,使得系统具有较好的扩展性和灵活性。,解释器模式(Interpreter),解释器模式的优点如下易于改变和扩展文法。易于实现文法。增加了

16、新的解释表达式的方式。,解释器模式(Interpreter),解释器模式的缺点如下对于复杂文法难以维护。执行效率较低。应用场景很有限。,解释器模式(Interpreter),模式使用在以下情况下可以使用解释器模式:可以将一个需要解释执行的语言中的句子表示为一个抽象语法树。一些重复出现的问题可以用一种简单的语言来进行表达。文法较为简单。效率不是关键问题。,解释器模式(Interpreter),模式应用解释器模式在使用面向对象语言实现的编译器中得到了广泛的应用,如Smalltalk语言的编译器。目前有一些基于Java抽象语法树的源代码处理工具,如在Eclipse中就提供了Eclipse AST,它

17、是Eclipse JDT的一个重要组成部分,用来表示Java语言的语法结构,用户可以通过扩展其功能,创建自己的文法规则。,解释器模式(Interpreter),模式应用可以使用解释器模式,通过C+、Java、C#等面向对象语言开发简单的编译器,如数学表达式解析器、正则表达式解析器等,用于增强这些语言的功能,使之增加一些新的文法规则,用于解释一些特定类型的语句。,解释器模式(Interpreter),模式应用在实际项目开发中如果需要解析数学公式,无须再运用解释器模式进行设计,可以直接使用一些第三方解析工具包,它们可以统称为数学表达式解析器(Math Expression Parser,MEP),

18、如Expression4J、Jep、JbcParser、Symja、Math Expression String Parser(MESP)等来取代解释器模式,它们可以方便地解释一些较为复杂的文法,功能强大,且使用简单,效率较好。,解释器模式(Interpreter),模式应用Expression4J:Expression4J是一个基于Java的开源框架,它用于对数学表达式进行操作,是一个数学公式解析器,在Expression4J中可以将数学表达式存储在字符串对象中。Expression4J是高度定制的,用户可以自定义文法,其主要功能包括实数和复数的基本数学运算,支持基本数学函数、复杂函数以及用

19、户使用Java语言自定义的函数和文法,还可以定义函数目录(函数集)、支持XML配置文件等。,解释器模式(Interpreter),模式总结解释器模式定义语言的文法,并且建立一个解释器来解释该语言中的句子,这里的“语言”意思是使用规定格式和语法的代码,它是一种类行为型模式。解释器模式描述了如何为简单的语言定义一个文法,如何在该语言中表示一个句子,以及如何解释这些句子。,解释器模式(Interpreter),模式总结解释器模式主要包含如下四个角色:在抽象表达式中声明了抽象的解释操作,它是所有的终结符表达式和非终结符表达式的公共父类;终结符表达式是抽象表达式的子类,它实现了与文法中的终结符相关联的解

20、释操作;非终结符表达式也是抽象表达式的子类,它实现了文法中非终结符的解释操作;环境类又称为上下文类,它用于存储解释器之外的一些全局信息。,解释器模式(Interpreter),模式总结对于一个简单的语言可以使用一些文法规则来进行定义,还可以通过抽象语法树的图形方式来直观地表示语言的构成,每一棵抽象语法树对应一个语言实例。解释器模式的主要优点包括易于改变和扩展文法,易于实现文法并增加了新的解释表达式的方式;其主要缺点是对于复杂文法难以维护,执行效率较低且应用场景很有限。,解释器模式(Interpreter),模式总结解释器模式适用情况包括:可以将一个需要解释执行的语言中的句子表示为一个抽象语法树;一些重复出现的问题可以用一种简单的语言来进行表达;文法较为简单且效率不是关键问题。,Thank You!,

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 生活休闲 > 在线阅读


备案号:宁ICP备20000045号-2

经营许可证:宁B2-20210002

宁公网安备 64010402000987号