设计模式C++版:第十九式解释器模式

本文探讨了解释器模式,它允许我们为特定语言定义文法并创建解释器来执行这些语言的句子。常见应用包括配置文件解析、正则表达式匹配以及HTML解析。在需要对某种语言进行解释执行,且能将其表示为抽象语法树的情况下,解释器模式尤为适用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

解释器模式:给定一个语言,定义它的文法的一种表示,并定义一个解释器,这个解释器使用该解释语言中的句子。比如配置文件,比如正则表达式,比如浏览器对HTML。当有一个语言需要解释执行,并且可将该语言中的句子表示为一个抽象语法树时,可以使用解释器模式。


#pragma once 
#include<stdio.h>
#include<string>
using std::string;

//文本类
class Context
{
public:
	void  settext(const string& text)
	{
		this->m_text = text;
	}

	string  gettext()
	{
		return m_text;
	}

private:
	string m_text;
};


// 解释类

class  Expression
{
public:
	virtual ~Expression(){ }
	void interpret(Context &context)
	{
		if (context.gettext().length()==0)
		{
			return;
		}
		else
		{
			string key = context.gettext().substr(0, 1);
			context.settext(context.gettext().substr(2));
			double value = atof(context.gettext().substr(0,context.gettext().find(' ')+1).c_str());
			context.settext(context.gettext().substr(context.gettext().find(' ')+1));
			excute(key, value);
		}
	}
	virtual void excute(const string& key, double value){ }
};


class Note:public Expression
{
public:
	virtual void excute(const string& key, double value)
	{
		char not = key.at(0);
		switch(not)
		{
		case'C':
			not = '1';
			break;

		case'D':
			not = '2';
			break;

		case'E':
			not = '3';
			break;
		case'F':
			not = '4';
			break;
		case'G':
			not = '5';
			break;
		case'A':
			not = '6';
			break;
		case'B':
			not = '7';
			break;
		default:
			break;
		}

		printf("%c ", not);
	}
};

class Scale :public Expression
{
public:
	virtual void excute(const string& key, double value)
	{
		string  key0 = "";
		int val = value;
		switch (val)
		{
		case 1:
			key0 ="低音";
			break;
		case 2:
			key0 = "中音";
			break;
		case 3:
			key0 = "高音";
			break;
		default:
			break;
		}

		printf("%s ", key0.c_str());
	}
};

int main()
{
	Context context;
	context.settext("O 2 E 0.5 G 0.5 A 3 E 0.5 G 0.5 D 3 E 0.5 G 0.5 A 0.5 O 3 C 1 O 2 A 0.5 G 1 C 0.5 E 0.5 D 3 ");

	while (context.gettext().length() > 0)
	{
		string str = context.gettext().substr(0, 1);
		char not = str.at(0);
		Expression * expr = nullptr;
		switch (not)
		{
		case 'C':
		case 'D':
		case 'E':
		case 'F':
		case 'G':
		case 'A':
		case 'B':
		case 'P':
			expr = new Note;
			break;
		case 'O':
			expr = new Scale;
			break;
		default:
			break;
		}
		expr->interpret(context);   //引用

		delete expr;
		expr = nullptr;
	}

	printf("\n");
	return 0;
}

说到底如果状态和类型多的时候,switch case 还是比状态等模式使用方便。效率高,还清晰,当然使用数组也可以。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值