Interpreter模式
1. 意图
给定一个语言,定义它的文法的一种表示,并定义一个解释器,这个解释器使用该表示来解释语言中的句子。
2. 适用性
当有一个语言需要解释执行,并且你可将该语言中的句子表示为一个抽象语法树时,可使用解释器模式。而当存在以下情况时该模式效果最好。
该文法简单对于复杂的文法,文法的类层次变得庞大而无法管理。此时语法分析生成器这样的工具是更好的选择。它们无需构建抽象语法树即可解释表达式,这样可以节省空间而且还可能节省时间。
效率不是一个关键问题最高效的解释器通常不是通过直接解释语法分析实现的,而是首先将它们转换成另一种形式。例如,正则表达式同城被转换成状态机。但即使在这种情况下,转换器仍可用解释器模式实现,该模式仍是有用的。
3. 结构
4. 代码
#include<iostream>
#include<stdio.h>
#include<stdlib.h>
#include<vector>
#include<math.h>
usingnamespacestd;
//interpretermode
//解释器模式
classCContext
{
public:
CContext(stringcontext)
{
strContext=context;
value=atoi(strContext.c_str());
}
intGetValue()
{
returnvalue;
}
voidSetValue(intnvalue)
{
value=nvalue;
}
private:
stringstrContext;
intvalue;
};
classCAbstractExpression
{
public:
virtualvoidInterpret(CContext*context)
{}
};
classCTerminalExpression:publicCAbstractExpression
{
public:
virtualvoidInterpret(CContext*context){}
};
classCPlusExpression:publicCAbstractExpression
{
public:
virtualvoidInterpret(CContext*context)
{
intvalue=context->GetValue();
context->SetValue(++value);
}
};
classCSbutractExpression:publicCAbstractExpression
{
public:
virtualvoidInterpret(CContext*context)
{
intvalue=context->GetValue();
context->SetValue(--value);
}
};
classCMultiExpression:publicCAbstractExpression
{
public:
virtualvoidInterpret(CContext*context)
{
intvalue=context->GetValue();
context->SetValue(value*value);
}
};
intmain()
{
cout<<"HelloWorld!中国!"<<endl;
CContext*context=newCContext("32");
vector<CAbstractExpression*>m_pContext;
m_pContext.push_back(newCMultiExpression);
m_pContext.push_back(newCPlusExpression);
m_pContext.push_back(newCPlusExpression);
m_pContext.push_back(newCSbutractExpression);
vector<CAbstractExpression*>::iteratorit;
for(it=m_pContext.begin();it!=m_pContext.end();it++)
{
(*it)->Interpret(context);
}
cout<<"value="<<context->GetValue()<<endl;
return0;
}