设计模式(4)--类行为(3)--解释器
2023-12-24 12:39:58
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++)
#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);
}
};
#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)。
文章来源:https://blog.csdn.net/myepicure/article/details/134909703
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!