省级精品课程网站,廊坊seo公司,长沙网络营销整合收费,网页制作视频教程下载1.定义 给定一个语言#xff0c;定义它的文法的一种表示#xff0c;并定义一个解释器。比如加减乘除在代码里是一种表示#xff0c;我们需要翻译成可以阅读的数学公式#xff0c;并且可以供用户输入数字得到输出结果。
2.组成结构
抽象表达式#xff08;Abstract Expres…1.定义 给定一个语言定义它的文法的一种表示并定义一个解释器。比如加减乘除在代码里是一种表示我们需要翻译成可以阅读的数学公式并且可以供用户输入数字得到输出结果。
2.组成结构
抽象表达式Abstract Expression定义解释器的接口约定解释器的解释操作主要包含解释方法 interpret()。终结符表达式Terminal Expression是抽象表达式的子类用来实现文法中与终结符相关的操作文法中的每一个终结符都有一个具体终结表达式与之相对应。非终结符表达式Nonterminal Expression也是抽象表达式的子类用来实现文法中与非终结符相关的操作文法中的每条规则都对应于一个非终结符表达式。上下文Context通常包含各个解释器需要的数据或是公共的功能一般用来传递被所有解释器共享的数据后面的解释器可以从这里获取这些值。
我们将用示例代码来解释各个组成部分的意义。
3.示例代码
#include iostream
#include mapusing namespace std;#define DELETE(pointer) delete pointer; pointernullptr
const string key1 string(s1);
const string key2 string(s2);
const string key3 string(s3);
const string key4 string(s4);class Context
{
public:Context() {datas[key1] 1;datas[key2] 2;datas[key3] 3;datas[key4] 4;}int getValue(string key) {if (!datas.count(key)){return 0;}return datas[key];}private:std::mapstring, int datas;
};class Expression
{
public:Expression(Expression* left, Expression* right) :left(left), right(right) { }virtual ~Expression() {if (left ! nullptr){DELETE(left);}if (right ! nullptr){DELETE(right);}}virtual int interpreter(Context* context) 0;protected:Expression* left;Expression* right;
};class MultiExpression : public Expression
{
public:MultiExpression(Expression* left, Expression* right) : Expression(left, right) { }int interpreter(Context* context) override {if ((left nullptr) || (right nullptr)){return 0;}return left-interpreter(context) * right-interpreter(context);}
};class DivisionExpression : public Expression
{
public:DivisionExpression(Expression* left, Expression* right) : Expression(left, right) { }int interpreter(Context* context) override {if ((left nullptr) || (right nullptr)){return 0;}return left-interpreter(context) / right-interpreter(context);}
};class TerminalExpression : public Expression
{
public:TerminalExpression(int value) : value(value), Expression(nullptr, nullptr) { }int interpreter(Context* context) {return value;}private:int value;
};void doInterpreter() // 客户端client
{/* 3*4/26 对应语法树如下/ 除法/ \* 2/ \3 4*/Context context;MultiExpression* multiExpression new MultiExpression(new TerminalExpression(context.getValue(key3)), new TerminalExpression(context.getValue(key4))); // 终止节点作为叶子结点非终止节点作为非叶子节点int mutil multiExpression-interpreter(context);cout mutil mutil endl;DivisionExpression* divisionExpression new DivisionExpression(multiExpression, new TerminalExpression(context.getValue(key2))); // 乘法表达式作为左子树 / 右子树int division divisionExpression-interpreter(context); // 运行解释器cout division division endl;DELETE(divisionExpression);// 这里注意不能第二次释放divisionExpression因为此时它是divisionExpression的左子树//divisionExpression释放的时候会自动释放左右子树也就是递归释放最终只需要释放最后一次嵌套调用的就行
}int main()
{doInterpreter();system(pause);return 1;
}
引用
C设计模式——解释器模式interpreter pattern_cinterpreter模式-CSDN博客