设计模式(4)--类行为(3)--解释器

1. 意图

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

言中的句子。

2. 四种角色

抽象表达式(AbstractExpression)、终结表达式(TerminalExpression)、非终结表达式(NonterminalExpression)、上下文(Context)

3. 优点

3.1 易于改变和扩展文法

3.2 易于实现文法

3.3 实现新表达式"计算"变得容易

4. 缺点

4.1 复杂的文法难于维护

5. 相关模式

5.1 抽象语法树是一个组合模式的实例

5.2 抽象语法树用享元模式来共享终结符

5.3 解释器可用一个迭代器遍历该结构

5.4 访问者可用来在一个类中维护抽象语法树中的各节点的行为

6. 代码示意(C++)
cpp 复制代码
#pragma once
#include<iostream>
#include <string>
using namespace std;

class Context
{
	string m_input;
public:
	Context(const string& input) :m_input(input) {

	}
	bool Lookup(const char* name) {
		size_t nPos = m_input.find(*name);
		return nPos != string::npos;
	}
};

class AbstractExpression
{
public:
	virtual bool Interpret(Context& context) = 0;
};

class TerminalExpression :public AbstractExpression
{
	char* m_name;
public:
	TerminalExpression(const char* name) {
		m_name = _strdup(name);//拷贝副本
	}
	virtual bool Interpret(Context& context) {
		cout << "终端解析器" << endl;
		return context.Lookup(m_name);
	}
};

class NonterminalExpression :public AbstractExpression
{
	AbstractExpression* m_pExpression1;
	AbstractExpression* m_pExpression2;
public:
	NonterminalExpression(AbstractExpression* pExpression1, AbstractExpression* pExpression2) {
		m_pExpression1 = pExpression1;
		m_pExpression2 = pExpression2;
	}
	~NonterminalExpression() {
		delete m_pExpression1;
		delete m_pExpression2;
	}
	virtual bool Interpret(Context& context) {
		cout << "非终端解析器" << endl;
		return m_pExpression1->Interpret(context) && m_pExpression2->Interpret(context);
	}
};
cpp 复制代码
#include "Expression.h"
int main() {
	Context context("hello");

	AbstractExpression* pExpression = new TerminalExpression("H");
	cout << "解释器返回:" << pExpression->Interpret(context) << endl;
	delete pExpression;

	pExpression = new NonterminalExpression(new TerminalExpression("h"), new TerminalExpression("o"));
	cout << "解释器返回:" << pExpression->Interpret(context) << endl;
	delete pExpression;

	return 0;
}

运行结果:

6.1 可以很容易地改变解释器或增加新的终端解释器来实现新文法(3.1、3.2)。

6.2 非终端解释器是组合模式,很容易实现新的"计算"(3.3)。

相关推荐
芝士熊爱编程1 小时前
创建型模式-单例模式
java·单例模式·设计模式
咖啡八杯4 小时前
GoF设计模式——访问者模式
设计模式·访问者模式
谢栋_6 小时前
设计模式从入门到精通之(七)责任链模式
java·设计模式·责任链模式
葬送的代码人生19 小时前
别再让 AI 瞎写代码了!Vibe Coding 三步法教你写出靠谱代码
前端·设计模式·架构
无风听海1 天前
Claude Agent Skills 的四种设计模式;从渐进式披露到最小权限
java·算法·设计模式
富贵冼中求1 天前
从单向流到双向 RPC:Agent 通信协议的范式分叉与 ACP 协议实战拆解
设计模式·架构
电子科技圈1 天前
先进封装、芯粒架构和3D集成——先进异构集成亟需兼具标准化与定制化能力的互联及总线IP解决方案
tcp/ip·设计模式·架构·软件构建·代码规范·设计规范
zjun10011 天前
C++:2.工厂模式
设计模式
触底反弹1 天前
🤯 面试被问 AI Workflow 和 Agent 有啥区别?3 张图 + 2 段代码讲清楚!
人工智能·设计模式·面试
杨充2 天前
10.可测试性实战设计
设计模式·开源·代码规范