解释器模式

一 定义

给定一个语言,定义它的文法的一种表示,并定义一个解释器,这个解释器使用该表示来解释语言中的句子。
文法:即语法规则。在解释器模式中每一个语法都将对应一个解释器对象,用来处理相应的语法规则。它对于扩展、改变文法以及增加新的文法规则都很方便。

解释器模式描述了如何为简单的语言定义一个文法,如何在该语言中表示一个句子,以及如何解释这些句子。

在解释器模式中可以通过一种称之为抽象语法树(Abstract Syntax Tree, AST)的图形方式来直观地表示语言的构成,每一棵抽象语法树对应一个语言实例

二 UML图

在这里插入图片描述

  1. AbstractExpression:定义解释器的接口,约定解释器的解释操作。其中的Interpret接口,正如其名字那样,它是专门用来解释该解释器所要实现的功能。(如加法解释器中的Interpret接口就是完成两个操作数的相加功能)。
  2. TerminalExpression:终结符解释器,用来实现语法规则中和终结符相关的操作,不再包含其他的解释器,如果用组合模式来构建抽象语法树的话,就相当于组合模式中的叶子对象,可以有多种终结符解释器。
  3. NonterminalExpression:非终结符解释器,用来实现语法规则中非终结符相关的操作,通常一个解释器对应一个语法规则,可以包含其他解释器,如果用组合模式构建抽象语法树的话,就相当于组合模式中的组合对象。可以有多种非终结符解释器。
  4. Context:上下文,通常包含各个解释器需要的数据或是公共的功能。这个Context在解释器模式中起着非常重要的作用。一般用来传递被所有解释器共享的数据,后面的解释器可以从这里获取这些值。
  5. Client:客户端,指的是使用解释器的客户端,通常在这里将按照语言的语法做的表达式转换成使用解释器对象描述的抽象语法树,然后调用解释操作。

三 例子

简单的计算器

#include <string>  
//相当于AbstractExpression
class Expression
{
public:
	virtual int interpret() = 0;
	virtual ~Expression() {}
};

//数值 相当于 TerminalExpression
class VarExpression :public Expression
{
public:
	VarExpression(int data) :m_nData(data) {}
	int interpret()
	{
		return m_nData;
	}
private:
	int m_nData;
};

//相当于 NonterminalExpression
class SymbolExpression :public Expression
{
public:
	SymbolExpression(Expression* left, Expression * right) :m_left(left), m_right(right) {}
	~SymbolExpression()
	{
		if (m_left)
			delete m_left;
		if (m_right)
			delete m_right;
	}
protected:
	Expression * m_left = NULL;
	Expression * m_right = NULL;
};

class PlusExpression :public SymbolExpression
{
public:
	PlusExpression(Expression* left, Expression * right) :SymbolExpression(left, right) {}
	int interpret()
	{
		if(m_left && m_right)
			return m_left->interpret() + m_right->interpret();
		return 0;
	}
};


class SubExpression :public SymbolExpression
{
public:
	SubExpression(Expression* left, Expression * right) :SymbolExpression(left, right) {}
	int interpret()
	{
		if (m_left && m_right)
			return m_left->interpret() - m_right->interpret();
		return 0;
	}
};
 
//相当于 Context
class Calculator
{
public:
	Calculator(string data):m_data(data){}
	int getRes()
	{
		if (m_data.size() == 0)
			return 0;

		stack<Expression*> resStack;//栈 保存计算步骤
		Expression * left = NULL;
		Expression * right = NULL;
		for (int i = 0; i < m_data.size(); i++)
		{
			char cdata = m_data[i];
			switch (cdata)
			{
			case'+':
			{
				left = resStack.top();
				resStack.pop();
				right = new VarExpression(m_data[++i] - '0');
				resStack.push(new PlusExpression(left, right));
				break;
			}
			case'-':
			{
				left = resStack.top();
				resStack.pop();
				right = new VarExpression(m_data[++i] - '0');
				resStack.push(new SubExpression(left, right));
				break;
			}
			default:
				resStack.push(new VarExpression(cdata - '0'));
			}
		}
		left = resStack.top();
		int res = (left == NULL) ? 0 : left->interpret();
		delete left;//删除栈
		return res;		
	}
private:
	string m_data;

};


int main()
{
	Calculator cal("1+2-3");
	cout << "res=:" << cal.getRes() << endl;

	getchar();
	return 0;
}

只能做一位数的加减法,但是还是能看出这个模式。

四 解释器模式的优缺点

优点

  1. 易于实现文法:在解释器模式中,一条语法规则用一个解释器对象来解释执行。对于解释器的实现来讲,功能就变得比较简单,只需要考虑这一条语法规则的实现就可以了,其他的都不用管。
  2. 易于扩展新的语法。由于解释器采用类来描述语法规则,因此可以通过继承等机制创建相应的解释器对象,在创建抽象语法树的时候使用这个新的解释器对象就可以了。

缺点

  1. 执行效率较低。由于在解释器模式中使用了大量的循环和递归调用,因此在解释较为复杂的句子时其速度很慢,而且代码的调试过程也比较麻烦。
  2. 对于复杂文法难以维护。在解释器模式中,每一条规则至少需要定义一个类,因此如果一个语言包含太多文法规则,类的个数将会急剧增加,导致系统难以管理和维护,此时可以考虑使用语法分析程序等方式来取代解释器模式。

四 使用场合

在以下情况下可以考虑使用解释器模式:
1.可以将一个需要解释执行的语言中的句子表示为一个抽象语法树;
2.一些重复出现的问题可以用一种简单的语言来进行表达;
3.一个语言的文法较为简单;
4.执行效率不是关键问题。【注:高效的解释器通常不是通过直接解释抽象语法树来实现的,而是需要将它们转换成其他形式,使用解释器模式的执行效率并不高。】

五 总结

目前个人来看,本质就是解析字符串

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
智慧校园的建设目标是通过数据整合、全面共享,实现校园内教学、科研、管理、服务流程的数字化、信息化、智能化和多媒体化,以提高资源利用率和管理效率,确保校园安全。 智慧校园的建设思路包括构建统一支撑平台、建立完善管理体系、大数据辅助决策和建设校园智慧环境。通过云架构的数据中心与智慧的学习、办公环境,实现日常教学活动、资源建设情况、学业水平情况的全面统计和分析,为决策提供辅助。此外,智慧校园还涵盖了多媒体教学、智慧录播、电子图书馆、VR教室等多种教学模式,以及校园网络、智慧班牌、校园广播等教务管理功能,旨在提升教学品质和管理水平。 智慧校园的详细方案设计进一步细化了教学、教务、安防和运维等多个方面的应用。例如,在智慧教学领域,通过多媒体教学、智慧录播、电子图书馆等技术,实现教学资源的共享和教学模式的创新。在智慧教务方面,校园网络、考场监控、智慧班牌等系统为校园管理提供了便捷和高效。智慧安防系统包括视频监控、一键报警、阳光厨房等,确保校园安全。智慧运维则通过综合管理平台、设备管理、能效管理和资产管理,实现校园设施的智能化管理。 智慧校园的优势和价值体现在个性化互动的智慧教学、协同高效的校园管理、无处不在的校园学习、全面感知的校园环境和轻松便捷的校园生活等方面。通过智慧校园的建设,可以促进教育资源的均衡化,提高教育质量和管理效率,同时保障校园安全和提升师生的学习体验。 总之,智慧校园解决方案通过整合现代信息技术,如云计算、大数据、物联网和人工智能,为教育行业带来了革命性的变革。它不仅提高了教育的质量和效率,还为师生创造了一个更加安全、便捷和富有智慧的学习与生活环境。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值