设计模式实现(二十三)--- 解释器模式(interpreter)
2014-08-14 11:10
441 查看
解释器模式(interpreter),给定一个语言,定义它的问法的一种表示,并定义一个解释器,这个解释器使用该表示来解释语言中的句子。
解释器模式需要解决的是,如果一种特定类型的问题发生的频率足够高,那么可能就值得该问题的各个势力表达为一个简单语句中的句子。这样就可以构建一个解释器,该解释器通过解释这些句子来解决该问题。
比如对一个及机器人说“哥们儿,向前走10步,然后向左转90度,再向前走5步”,如果要让机器人知道你在说什么,解释器就必须对“哥们儿” ,“向前走” “10步” ”然后“ ”向左转“等语句作出解释。
解释器模式也有不足,解释器模式为文法中的每一条规则至少定义了一个类,因此包含许多规则的文法可能难以管理和维护。建议当文法非常复杂时,使用其他的技术如语法分析程序或编译器生成器来处理。
解释器模式需要解决的是,如果一种特定类型的问题发生的频率足够高,那么可能就值得该问题的各个势力表达为一个简单语句中的句子。这样就可以构建一个解释器,该解释器通过解释这些句子来解决该问题。
#include <iostream> #include <string> #include <list> using namespace std; //Context,包含解释器之外的一些全局信息 class Context { private: string input; string output; public: string getInput() { return input; } string getOutput() { return output; } void setInput(string input) { this->input = input; } void setOutput(string output) { this->output = output; } }; //AbstractExpression(抽象表达式),声明一个抽象的解释操作,这个接口为抽象语法树中所有的节点所共享。 class AbstractExpression { public: virtual void Interpret(Context &context) = 0; }; //TerminalExpression(终结符表达式),实现与文法中的终结符相关联的解释操作。实现抽象表达式中所要求的接口,主要是一个interpret()方法。文法中每一个终结符都有一个具体终结表达式与之相对应 class TerminalExpression : public AbstractExpression { public: void Interpret(Context &context) { cout << "终端解释器" << endl; } }; //NonTerminalExpression(非终结符表达式),为文法中的非终端符实现解释操作, //对文中每一条规则R1,R2……Rn都需要一个具体的非终结符表达式类。通过实现抽象表达式的 //interpret()方法实现解释操作。解释操作以递归方式调用上面所提到的代表R1,R2……Rn中各个符号的实例变量 // class NonTerminalExpression : public AbstractExpression { public: void Interpret(Context &context) { cout << "非终端解释器" << endl; } }; //客户端代码,构建表示该文法定义的语言中一个特定的句子的抽象语法树。 int main() { Context context; list<AbstractExpression *> Expressionlist; TerminalExpression t1,t2,t3; NonTerminalExpression nt1; Expressionlist.push_back(&t1); Expressionlist.push_back(&t2); Expressionlist.push_back(&nt1); Expressionlist.push_back(&t3); list<AbstractExpression *>::iterator iter = Expressionlist.begin(); while(iter!=Expressionlist.end()) { (*iter)->Interpret(context); iter++; } return 1; }当有一个语言需要解释执行,并且你可将该语言中的句子作为一个抽象语法树时,可使用解释器模式。用了解释器模式,就意味着可以很容易地改变和扩展文法,因为该模式使用类来表示文法规则,你可使用继承来改变或扩展该文法。也比较容易实现文法,因为定义抽象语法树中各节点的类的实现大体类似,这些类都易于直接编写。
比如对一个及机器人说“哥们儿,向前走10步,然后向左转90度,再向前走5步”,如果要让机器人知道你在说什么,解释器就必须对“哥们儿” ,“向前走” “10步” ”然后“ ”向左转“等语句作出解释。
解释器模式也有不足,解释器模式为文法中的每一条规则至少定义了一个类,因此包含许多规则的文法可能难以管理和维护。建议当文法非常复杂时,使用其他的技术如语法分析程序或编译器生成器来处理。
相关文章推荐
- 步步为营 .NET 设计模式学习笔记 二十三、Interpreter(解释器模式)
- JAVA--解释器模式(Interpreter)--设计模式二十三
- Java开发中的23种设计模式之二十三:解释器模式(Interpreter)
- 设计模式(Design Pattern) - 行为型模式(Behavioral Pattern) - 解释器模式(Interpreter) - Java实现
- 浅谈Java设计模式(二十三)解释器模式(Interpreter)
- 步步为营 .NET 设计模式学习笔记 二十三、Interpreter(解释器模式)
- 步步为营 .NET 设计模式学习笔记 二十三、Interpreter(解释器模式)
- Interpreter 设计模式 实现代码
- 设计模式之Interpreter(解释器)
- 设计模式学习—Interpreter(解释器)
- 设计模式之(二十)解释器模式Interpreter
- C#面向对象模式设计第十六讲:Interpreter 解释器模式(行为型模式)
- 设计模式----Interpreter(解释器)模式
- 设计模式之Interpreter(解释器)
- 设计模式之(二十)解释器模式Interpreter
- 23种设计模式之解释器模式(Interpreter)
- [导入]C#面向对象设计模式纵横谈(16):(行为型模式) Interpreter 解释器模式.zip(9.14 MB)
- 设计模式--解释器模式(Interpreter)
- 设计模式笔记(二十三) —— 解释器模式
- 设计模式之解释器模式(interpreter)