定义:给定一个语言,定义它的文法的一种表示,并定义一个解释器,这个解释器使用该表示来解释语言中的句子。

看定义感觉就不像个程序模式,相关资料不多,靠谱的更少,csdn找到了个例子,还是错误的,我整理修改下作为参考,看代码还是很容易理解这模式是什么。

#include <iostream>

using namespace std;

class Expression
{
public:
	Expression() {};

public:
	virtual bool Interpret(string context) = 0;
};

class TerminalExpression :public Expression
{
public:
	TerminalExpression(string context) :m_strData(context){ };

public:
	bool Interpret(string context)
	{
		if (m_strData.find(context) == string::npos)
		{
			return false;
		}
		return true;
	}

private:
	string m_strData;
};

class OrExpression :public Expression
{
public:
	OrExpression(Expression* pExpression1, Expression* pExpression2) :m_pExpression1(pExpression1), m_pExpression2(pExpression2) {}

public:
	bool Interpret(string context)
	{
		return m_pExpression1->Interpret(context) || m_pExpression2->Interpret(context);
	}

private:
	Expression *m_pExpression1;
	Expression *m_pExpression2;
};

class AndExpression :public Expression
{
public:
	AndExpression(Expression* pExpression1, Expression* pExpression2) :m_pExpression1(pExpression1), m_pExpression2(pExpression2) {}

public:
	bool Interpret(string context)
	{
		return m_pExpression1->Interpret(context) && m_pExpression2->Interpret(context);
	}

private:
	Expression *m_pExpression1;
	Expression *m_pExpression2;
};

int main()
{
	//创建规则:pig 和 dog是 animal(猪狗是动物)
	Expression* pIsAnimal = new OrExpression(new TerminalExpression("pig"), new TerminalExpression("dog"));

	//创建规则:o(o既在Hello中也在World中)
	Expression* pIsAllIn = new AndExpression(new TerminalExpression("Hello"), new TerminalExpression("World"));

	cout << "dog is animal? " << (pIsAnimal->Interpret("dog") == true ? "true" : "false") << endl;
	cout << "o is in Hello and World? " << (pIsAllIn->Interpret("o") == true ? "true" : "false") << endl;

	system("pause");
	return 0;
}

 创建了三个解释规则,包含、两个包含一个、两个都包含,就这回事

Logo

北京人形旗下天工造物具身智能开源社区,聚焦具身天工与慧思开物两大平台

更多推荐