概述
解释器这个名词想必大家都不会陌生,比如编译原理中,一个算术表达式通过词法分析器形成词法单元,而后这些词法单元再通过语法分析器构建语法分析树,最终形成一颗抽象的语法分析树。诸如此类的例子也有很多,比如编译器、正则表达式等等。
如果一种特定类型的问题发生的频率足够高,那么可能就值得将该问题的各个实例表述为一个简单语言中的句子,这样就可以构建一个解释器,该解释器通过解释这些句子来解决该问题。
定义
给定一种语言,该模式定义了其语法的表示形式,以及使用该表示形式来解释该语言中的句子的解释器。解释器模式具有行为目的,并且适用于类。
角色
Context:
环境类AbstractExpression:
抽象表达式类TerminalExpression:
终结符表达式NonterminalExpression:
非终结符表达式Client:
客户端
场景
- 当语法简单时(对于复杂语法,有更好的选择)
- 效率不是关键问题
实现
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
//环境类 class Context { public: void set(const std::string& var,const bool value) { vars.insert(std::pair<std::string,bool>(var,value)); } bool get(const std::string& exp) { return vars[exp]; } //... private: std::map<std::string,bool> vars; //... }; |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 |
//抽象表达式类 class AbstractExpression { public: virtual ~AbstractExpression() {} virtual bool interpret(Context * const) { return false; } //... }; //终结符表达式类 class TerminalExpression : public AbstractExpression { public: TerminalExprssion(const std::string& val) : value(val) { } ~TerminalExpression() {} bool interpret(Context * const context) { return context->get(value); } //... private: std::string value; //... }; //非终结符表达式 class NonterminalExpression : public AbstractExpression { public: NoterminalExpression(AbstractExpression * left,AbstractExpression * right) :lop(left),rop(right) { } ~NonterminalExpression() { delete lop; delete rop; } bool interpret(Context * const context) { return lop->interpret(context)&&rop->interpret(context); } //... private: AbstractExpression * lop; AbstractExpression * rop; //... }; |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
auto main()->int { AbstractExpression * a = new TerminalExpression("a"); AbstractExpression * b = new TermianlExpression("b"); AbstractExpression * exp = new NonterminalExpression(a,b); Context context; context.set("a",true); context.set("b",false); std::cout << context.get("a") << "and" << context.get("b"); std::cout << "=" << exp->interpret(&context) << std::endl; delete exp; return 0; } |
本文为原创文章,版权归Aet所有,欢迎分享本文,转载请保留出处!
你可能也喜欢
- ♥ 结构型:适配器模式09/19
- ♥ 行为型:访问者模式09/25
- ♥ 行为型:状态模式09/24
- ♥ 结构型:代理模式09/23
- ♥ 行为型:模板方法模式09/25
- ♥ 设计模式:六大原则04/18