[设计模式]Interpreter解释器模式
Interpreter解释器模式
通常当一个语言需要解释执行,并且你可以将该语言的句子表示成为一个抽象的语法树时,可以使用解释器模式
解析
1)context:包含解释器之外的一些全局信息
2)AbstractExpression:抽象基类,声明一个抽象的解释操作,这个接口为抽象语法树中所有的节点所共享
3)TerminalExpression:终结符类,实现与文法中的终结符相关联的解释操作
4)NonterminalExpression:非终结符类,为文法中非终结符实现解释操作,对文法中每一条规则R1,R2...Rn都需要一个具体的非终结符类
小demointerpreter.h
#pragma once#include <iostream>#include <string>#include <vector>using namespace std;class Context;class AbstractExpression{public:virtual void Interpret(Context* contex) =0;};class TerminalExpression : public AbstractExpression{public:virtual void Interpret(Context* contex){cout<<"终端解释器"<<endl;}};class NonterminalExpression : public AbstractExpression{public:virtual void Interpret(Context* contex){cout<<"非终端解释器"<<endl;}};class Context{public:string input;string output;};
main.cpp
#include "interpreter.h"#include <stdlib.h>void main(){Context* context=new Context();vector<AbstractExpression*> express;express.push_back(new TerminalExpression());express.push_back(new NonterminalExpression());express.push_back(new NonterminalExpression());vector<AbstractExpression*>::iterator iter=express.begin();while(iter!=express.end()){(*iter)->Interpret(context);iter++;}system("pause");}
XML格式的数据解析式一个在应用开中很常见并且有时候很难处理的事情,虽然目前很多的开发平台,语言都提供了对XML格式数据的解析,但是例如到了移动终端设备上,由于处理速度,计算能力,存储容量的原因,解析XML格式的数据却是很复杂的一件事情,最近也提出了很多的移动设备的XML格式解析器,但是总体上在项目开发的时候还是需要自己去设计和实现这一过程。
Iterpreter模式则提供了一种很好的组织和设计这种解析器的架构。
Iterpreter模式中使用类来表示文法规则,因此可以很容易实现文法的扩展。另外对于终结符我们可以使用Flyweight模式来实现终结符的共享。