给定一个语言,定义它的文法的一种表示,并定义一个解释器,这个解释器使用该表示来解释语言中的句子。
2. 动机
如果一种特定类型的问题发生的频率足够高, 那么可能就值得将该问题的各个实例表述为一个简单语言中的句子。这样就可以构建一个解释器, 该解释器通过解释这些句子来解决该问题。
3.结构
①AbstractExpression:定义解释器的接口,约定解释器的解释操作。其中的Interpret接口,正如其名字那样,它是专门用来解释该解释器所要实现的功能。(如加法解释器中的Interpret接口就是完成两个操作数的相加功能)。
②TerminalExpression:终结符解释器,用来实现语法规则中和终结符相关的操作,不再包含其他的解释器,如果用组合模式来构建抽象语法树的话,就相当于组合模式中的叶子对象,可以有多种终结符解释器。
③NonterminalExpression:非终结符解释器,用来实现语法规则中非终结符相关的操作,通常一个解释器对应一个语法规则,可以包含其他解释器,如果用组合模式构建抽象语法树的话,就相当于组合模式中的组合对象。可以有多种非终结符解释器。
④Context:上下文,通常包含各个解释器需要的数据或是公共的功能。这个Context在解释器模式中起着非常重要的作用。一般用来传递被所有解释器共享的数据,后面的解释器可以从这里获取这些值。
⑤Client:客户端,指的是使用解释器的客户端,通常在这里将按照语言的语法做的表达式转换成使用解释器对象描述的抽象语法树,然后调用解释操作。
4.举例
#ifndef INTERPRETER_H
#define INTERPRETER_H
#include <string>
#include <map>
using std::map;
using std::string;
class CContext{
private:
map<string,int > pool;
public:
void add(string data1,int data2){
pool.insert(make_pair(data1,data2));
}
int get(string data){
return pool[data];
}
};
class CAbstractExpression{
public:
virtual int Interpreter(CContext context)=0;
};
class CTerminationExpression : public CAbstractExpression{
private:
int value;
public:
CTerminationExpression(int temp){
value=temp;
}
virtual int Interpreter(CContext context){
return value;
}
};
class CNonTerminationExpression : public CAbstractExpression{
protected:
CAbstractExpression* left;
CAbstractExpression* right;
public:
CNonTerminationExpression(CAbstractExpression* data1,CAbstractExpression* data2){
left=data1;
right=data2;
}
virtual int Interpreter(CContext context){return 0;}
};
class CAdd : public CNonTerminationExpression{
public:
CAdd(CAbstractExpression* data1,CAbstractExpression* data2):CNonTerminationExpression(data1,data2){}
virtual int Interpreter(CContext context){
return left->Interpreter(context)+right->Interpreter(context);
}
};
class CSub : public CNonTerminationExpression{
public:
CSub(CAbstractExpression* data1,CAbstractExpression* data2):CNonTerminationExpression(data1,data2){}
virtual int Interpreter(CContext context){
return left->Interpreter(context)-right->Interpreter(context);
}
};
#endif
#include "interpreter.h"
#include <iostream>
using std::cout;
using std::endl;
int main(){
CContext room;
room.add("a",3);
room.add("b",4);
room.add("c",5);
CAbstractExpression* pSub=new CSub(new CTerminationExpression(room.get("a")),new CTerminationExpression(room.get("b")));
CAbstractExpression* pAdd=new CAdd(pSub,new CTerminationExpression(room.get("c")));
cout<<pAdd->Interpreter(room)<<endl;
return 0;
}