解释器
来源:互联网 发布:股指期货分析软件 编辑:程序博客网 时间:2024/04/30 00:58
解释器是一种类行为型模式。
解释器其实有些类似与组合模式,都可以不断的利用递归去做一些工作。
1.目的
给定一个语言,定义文法的一种表示,并定义一个解释器,这个解释器使用该表示来解释语言中的句子。
如示例中用于求布尔值的表达式,可以利用解释器来逐层分析求值结果,从而最后得到表达式的值。
2.适用性
当有一个语言需要解释执行,并且你可以将该语言的句子表示为一个语法树时,可使用解释器模式。
3.优点
(1)易于改变和扩展文法,如果扩展文法,可以改变继承来扩展解释类型,如在示例中在扩展一个异或操作,只需要再次声明一个异或类并继承自基类BoolExp即可。不会影响其他操作的实现。
(2)易于实现文法并增加了新的解释表达式的方式。
4.示例代码
//// Interpreter.h// Interpreter//// Created by CHM on 14-6-17.// Copyright (c) 2014年 CHM. All rights reserved.// 解释器设计模式可以很方便得用于语法分析,而不用建立语法分析树。#ifndef Interpreter_Interpreter_h#define Interpreter_Interpreter_h#include <iostream>#include <string>#include <map>using namespace std;//变量到bool类型到一个映射class VariableExp;class Contex{public: Contex(){} bool Lookup(const string& s) { map<string,bool>::iterator index=_map.find(s); if(index!=_map.end()) return index->second; return false; } void Assign(VariableExp*,bool);private: map<string,bool> _map;};//抽象类,声明一些接口class BoolExp{public: virtual ~BoolExp(){} virtual bool Evaluate(Contex&)=0; virtual BoolExp* Replace(const string&,BoolExp&)=0; virtual BoolExp* Copy() const=0;};//变量类class VariableExp:public BoolExp{public: VariableExp(const string& name):_name(name){} bool Evaluate(Contex& contex) { return contex.Lookup(_name); } BoolExp* Replace(const string& s,BoolExp& exp) { if(_name==s) return exp.Copy(); else return new VariableExp(s); } BoolExp* Copy() const { return new VariableExp(_name); } string Name() const { return _name; }private: string _name;};//与操作class AndExp:public BoolExp{public: AndExp(BoolExp* op1,BoolExp* op2):_op1(op1),_op2(op2){} bool Evaluate(Contex& contex) { return _op1->Evaluate(contex)&&_op2->Evaluate(contex); } BoolExp* Replace(const string& s,BoolExp& exp) { return new AndExp(_op1->Replace(s,exp),_op2->Replace(s,exp)); } BoolExp* Copy() const { return new AndExp(_op1,_op2); }private: BoolExp* _op1; BoolExp* _op2;};//或操作class OrExp:public BoolExp{public: OrExp(BoolExp* op1,BoolExp* op2):_op1(op1),_op2(op2){} bool Evaluate(Contex& contex) { return _op1->Evaluate(contex)||_op2->Evaluate(contex); } BoolExp* Replace(const string& s,BoolExp& exp) { return new OrExp(_op1->Replace(s,exp),_op2->Replace(s,exp)); } BoolExp* Copy() const { return new OrExp(_op2,_op2); }private: BoolExp* _op1; BoolExp* _op2;};//非操作class NotExp:public BoolExp{public: NotExp(BoolExp* op):_op(op){} bool Evaluate(Contex& contex) { return !_op->Evaluate(contex); } BoolExp* Replace(const string& s,BoolExp& exp) { return new NotExp(_op->Replace(s,exp)); } BoolExp* Copy() const { return new NotExp(_op); }private: BoolExp* _op;};void Contex::Assign(VariableExp* vexp,bool boolean){ _map.insert(map<string,bool>::value_type(vexp->Name(),boolean));}#endif
5.测试用例#include "Interpreter.h"int main(int argc, const char * argv[]){ Contex contex; //建立变量 VariableExp* x=new VariableExp("x"); VariableExp* y=new VariableExp("y"); //变量赋值 contex.Assign(x,false); contex.Assign(y,true); //声明表达式,这里是(!x)&&(x||y) BoolExp* expression=new AndExp(new NotExp(x),new OrExp(x,y)); //求值 bool value=expression->Evaluate(contex); //输出结果 if(value) cout<<"the result is true"<<endl; else cout<<"The result is false"<<endl; return 0;}
0 0
- 解释器
- 解释器
- 解释器
- 解释器及其解释器文件
- Java解释器的运行过程解释
- 命令行解释器概述
- 深入浅出解释器模式
- Linux解释器原理
- 解释器(Interpreter )模式
- Interpreter解释器模式
- 解释器的代码....
- 操作系统 编译器 解释器
- 配置Python解释器
- Linux 解释器
- Lua 解释器
- Linux解释器原理
- 编译器与解释器
- Interperter 解释器模式
- 前端Nginx,后端Apache获取用户真实IP地址
- java-String中的 intern()
- Strut传递List<Map<String,String>>
- android学习笔记--零碎知识点2
- myok
- 解释器
- POJ 1236 Network of Schools(强连通分量)
- 数据结构实验之栈四:括号匹配
- SQLite 函数大全
- DB2 特殊寄存器(Special Registers)
- Mysql基础篇之表的操作
- 写给自己的几点编程建议
- 初学者如何开发出高质量J2EE系统
- T-SQL 游标(收藏)