欢迎来到天天文库
浏览记录
ID:52850434
大小:1.70 MB
页数:38页
时间:2020-03-26
《设计模式.解释器模式(Interpreter).pptx》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库。
1、设计模式(DesignPattern)张凯副教授计算机学院软件工程系问题(Problem)设计与实现一个四则算术运算解释器可以分析任意+、-、*、/表达式,并计算其数值输入表达式为一个字符串表达式输出结果为双精度浮点数(Double)问题(Problem)输入是一个用字符串表达的四则运算,比如1+2*3。目的是试图去理解这个字符串表达的运算指令,然后计算出结果7。之所以是一个解释器Interpreter,而不是一个编译器Compiler,是因为程序是去理解指令并且执行指令,而不是把指令编译成机器代码来运行;后者是编译器的目标。问题(Problem)第一个
2、部分,是截取输入字符串,然后返回单元指令。比如,对于指令1+2*3–4/5,就需要被分解成如下所示的单元指令集:问题(Problem)第二个部分,把单元指令集组成一个树结构,称之为AbstractSyntaxTree。按照将来需要解释的顺序,优先执行的指令放在树的叶的位置,最后执行的指令是树根Root。后缀式(逆波兰式)的求值问题(Problem)程序只有2种单元指令:操作数NumExpression和运算符OpExpression。定义了一个抽象类,叫做Expression,然后NumExpression和OpExpression继承了该抽象类。问题(
3、Problem)abstractclassExpression{abstractpublicdoubleInterpreter(Syntaxroot);}classNumExpression:Expression{privatedouble_value;publicNumExpression(doublevalue){this._value=value;}publicdoubleValue{get{returnthis._value;}}publicoverridedoubleInterpreter(Syntaxroot){return((NumExpr
4、ession)(root.Expression)).Value;}}classOpExpression:Expression{privateOp_value;……publicoverridedoubleInterpreter(Syntaxroot){doublelvalue,rvalue;if(root.LeftChild==null)lvalue=0;elselvalue=((Expression)root.LeftChild.Expression).Interpreter(root.LeftChild);if(root.RightChild==nul
5、l)rvalue=0;elservalue=((Expression)root.RightChild.Expression).Interpreter(root.RightChild);switch(((OpExpression)root.Expression).Value){caseOp.Plus:returnlvalue+rvalue;caseOp.Minus:returnlvalue-rvalue;caseOp.Multiply:returnlvalue*rvalue;caseOp.Divide:returnlvalue/rvalue;default
6、:return0;}}}问题(Problem)enumOp:int{Plus='+',Minus='-',Multiply='*',Divide='/'}enumPrioirty{Lv2=2,Lv1=1,Lv0=0}问题(Problem)classSyntax{privateExpression_Expression;privateSyntax_left;privateSyntax_right;publicSyntax(ExpressionExpression){this._Expression=Expression;this._left=null;th
7、is._right=null;}publicExpressionExpression{get{returnthis._Expression;}}publicSyntaxLeftChild{get{returnthis._left;}set{this._left=value;}}publicSyntaxRightChild{get{returnthis._right;}set{this._right=value;}}}classSyntaxTree{privateSyntax_root;privateint_count;publicSyntaxTree()
8、{this._root=null;this._count=0;}publicSy
此文档下载收益归作者所有