[设计模式笔记]三. 行为型模式--17. Interpreter模式(解释器模式)(二)
来源:互联网 发布:papi酱人气下滑 知乎 编辑:程序博客网 时间:2024/06/05 06:50
场景:
我定义一个加减法则
// 表达式
expression ::= literal | PlusSign | MinusSign | '(' expression ')'
// 加号(执行加法)
PlusSign ::= '+'
// 减号(执行减法)
MinusSign ::= '-'
// 终结符(终结符有数字字符组成)
literal ::= '0' | '1' | '2' | ... {'0' | '1' | '2' | ... }
例如: 这样子构造语法树.
表达式1 + (3 - 1)的语法树就是:
Expression >>>>>literal PlusSign (Expression)>>>>literal PlusSign (literal MinusSign literal )
表达式1 + 2 - (3 - 1)的语法树有两棵分别是:
Expression >>>>>Expression MinusSign (Expression)>>>>literal PlusSign literal MinusSign (literal MinusSign literal )
Expression >>>>>literal PlusSign Expression>>>>literal PlusSign literal - (Expression)>>>literal PlusSign literal MinusSign (literal MinusSign literal )很明显: 完全展开后, 它们是一样的(殊途同归而已)
角色:
CASExpression 表达式的抽象类
CPlusSign 加号规则类
CMinusSign 减号规则类
CNumber 终结符类
这里没有上下文类
如图:
图1
代码:
class CASExpression{public:CASExpression();virtual ~CASExpression();virtual double Interpret() = 0;}///////////////////////////////////////////////////////////////////////////////class CPlusSign : public CASExpression{public:CPlusSign(CASExpression* pCASExpression1, CASExpression* pCASExpression2);virtual ~CPlusSign();virtual double Interpret();private:CASExpression* m_pCASExpression1;CASExpression* m_pCASExpression2;}...double CPlusSign::Interpret(){// 加法(存在递归)return m_pCASExpression1->Interpret() + m_pCASExpression2->Interpret();}///////////////////////////////////////////////////////////////////////////////class CMinusSign : public CASExpression{public:CMinusSign(CASExpression* pCASExpression1, CASExpression* pCASExpression2);virtual ~CMinusSign();virtual double Interpret();private:CASExpression* m_pCASExpression1;CASExpression* m_pCASExpression2;}...double CMinusSign ::Interpret(){// 减法(存在递归)return m_pCASExpression1->Interpret() - m_pCASExpression2->Interpret();}///////////////////////////////////////////////////////////////////////////////class CNumber : public CASExpression{public:CNumber(char* pChNumber);virtual ~CNumber();virtual double Interpret();private:char* m_pChNumber;}double CNumber::Interpret(){// 终结递归return attf(m_pChNumber);}///////////////////////////////////////////////////////////////////////////////// 调用// 求值表达式10 + (3 - 1.9)// 1. 语法分析, 提取出语法树上的每一个节点...// 2. 构建语法树(个人理解在语法分析过程中就会构造出语法树了)// Expression >>>>>literal PlusSign (Expression)>>>>literal PlusSign (literal MinusSign literal )n1 = new CNumber("10");n2= new CNumber("3");n3 = new CNumber("1.9");pCMinusSign = new CMinusSign(n2, n3 );pCPlusSign = new CPlusSign(n1 , pCMinusSign );// 3. 求值pCPlusSign0>Interpret();///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
表达式1 + (3 - 1)的语法树就是:
Expression >>>>>literal PlusSign (Expression)>>>>literal PlusSign (literal MinusSign literal )
表达式1 + 2 - (3 - 1)的语法树有两棵分别是:
Expression >>>>>Expression MinusSign (Expression)>>>>literal PlusSign literal MinusSign (literal MinusSign literal )
Expression >>>>>literal PlusSign Expression>>>>literal PlusSign literal - (Expression)>>>literal PlusSign literal MinusSign (literal MinusSign literal )很明显: 完全展开后, 它们是一样的(殊途同归而已)
(语法树的构建需要看你的语法分析的算法)
我的理解:
这种模式工作中没怎么使用过. 例如分析一些矢量文件格式, 好像也不怎么需要使用该模式. 个人理解该模式主要对表达式进行求值(不一定是数字, 总之就是求出某表达式的结果), 而适合使用该模式的比较适合表达式中有终结符表达式, 可以嵌套表达式等情况.
- [设计模式笔记]三. 行为型模式--17. Interpreter模式(解释器模式)(二)
- [设计模式笔记]三. 行为型模式--17. Interpreter模式(解释器模式)(一)
- 行为设计模式---解释器模式(Interpreter)
- 行为型模式-Interpreter ( 解释器模式 )
- 设计模式(15)-行为型-解释器模式(Interpreter)
- 设计模式--解释器模式Interpreter(行为型)
- [设计模式-行为型]解释器模式(Interpreter)
- 设计模式(行为型)之解释器模式(Interpreter Pattern)
- 设计模式-行为型- 解释器模式(Interpreter)
- 设计模式(15)--Interpreter(解释器模式)--行为型
- 设计模式-行为设计模式:解释器模式 Interpreter
- 设计模式笔记--行为型模式-之三 解释器
- 设计模式 笔记 解释器模式 Interpreter
- 设计模式笔记-Interpreter解释器模式
- 设计模式(二十)解释器模式(Interpreter)-行为型
- 【设计模式学习笔记十六】【行为模式】【解释器模式(Interpreter)】
- 【设计模式】行为模式之解释器Interpreter
- 行为模式之解释器模式-INTERPRETER
- Android实现ListView的A-Z字母排序和过滤搜索功能,实现汉字转成拼音
- readme
- Android应用截图和SurfaceView截图问题总结
- DECLARE CONTINUE HANDLER FOR NOT FOUND 解释
- oracle 索引失效原因及解决方法
- [设计模式笔记]三. 行为型模式--17. Interpreter模式(解释器模式)(二)
- 逆波兰式(中缀表达式转成后缀表达式)
- 文件操作函数小结
- UIGestureRecognizer学习笔记
- 【重点】什么时候用静态方法
- Mongodb的生僻问题分析
- Lucene 快速入门
- 求已知二叉树的面积
- Eclipse开发Android程序如何在手机上运行