解释器

来源:互联网 发布:股指期货分析软件 编辑:程序博客网 时间:2024/04/30 00:58

解释器是一种类行为型模式。

解释器其实有些类似与组合模式,都可以不断的利用递归去做一些工作。

1.目的

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

如示例中用于求布尔值的表达式,可以利用解释器来逐层分析求值结果,从而最后得到表达式的值。

2.适用性

当有一个语言需要解释执行,并且你可以将该语言的句子表示为一个语法树时,可使用解释器模式。

3.优点

(1)易于改变和扩展文法,如果扩展文法,可以改变继承来扩展解释类型,如在示例中在扩展一个异或操作,只需要再次声明一个异或类并继承自基类BoolExp即可。不会影响其他操作的实现。

(2)易于实现文法并增加了新的解释表达式的方式。

4.示例代码

////  Interpreter.h//  Interpreter////  Created by CHM on 14-6-17.//  Copyright (c) 2014年 CHM. All rights reserved.//  解释器设计模式可以很方便得用于语法分析,而不用建立语法分析树。#ifndef Interpreter_Interpreter_h#define Interpreter_Interpreter_h#include <iostream>#include <string>#include <map>using namespace std;//变量到bool类型到一个映射class VariableExp;class Contex{public:    Contex(){}    bool Lookup(const string& s)    {        map<string,bool>::iterator index=_map.find(s);        if(index!=_map.end())            return index->second;        return false;    }    void Assign(VariableExp*,bool);private:    map<string,bool> _map;};//抽象类,声明一些接口class BoolExp{public:    virtual ~BoolExp(){}    virtual bool Evaluate(Contex&)=0;    virtual BoolExp* Replace(const string&,BoolExp&)=0;    virtual BoolExp* Copy() const=0;};//变量类class VariableExp:public BoolExp{public:    VariableExp(const string& name):_name(name){}    bool Evaluate(Contex& contex)    {        return contex.Lookup(_name);    }    BoolExp* Replace(const string& s,BoolExp& exp)    {        if(_name==s)            return exp.Copy();        else            return new VariableExp(s);    }    BoolExp* Copy() const    {        return new VariableExp(_name);    }    string Name() const    {        return _name;    }private:    string _name;};//与操作class AndExp:public BoolExp{public:    AndExp(BoolExp* op1,BoolExp* op2):_op1(op1),_op2(op2){}    bool Evaluate(Contex& contex)    {        return _op1->Evaluate(contex)&&_op2->Evaluate(contex);    }    BoolExp* Replace(const string& s,BoolExp& exp)    {        return new AndExp(_op1->Replace(s,exp),_op2->Replace(s,exp));    }    BoolExp* Copy() const    {        return new AndExp(_op1,_op2);    }private:    BoolExp* _op1;    BoolExp* _op2;};//或操作class OrExp:public BoolExp{public:    OrExp(BoolExp* op1,BoolExp* op2):_op1(op1),_op2(op2){}    bool Evaluate(Contex& contex)    {       return  _op1->Evaluate(contex)||_op2->Evaluate(contex);    }    BoolExp* Replace(const string& s,BoolExp& exp)    {        return new OrExp(_op1->Replace(s,exp),_op2->Replace(s,exp));    }    BoolExp* Copy() const    {        return new OrExp(_op2,_op2);    }private:    BoolExp* _op1;    BoolExp* _op2;};//非操作class NotExp:public BoolExp{public:    NotExp(BoolExp* op):_op(op){}    bool Evaluate(Contex& contex)    {        return !_op->Evaluate(contex);    }    BoolExp* Replace(const string& s,BoolExp& exp)    {       return new NotExp(_op->Replace(s,exp));    }    BoolExp* Copy() const    {        return new NotExp(_op);    }private:    BoolExp* _op;};void Contex::Assign(VariableExp* vexp,bool boolean){    _map.insert(map<string,bool>::value_type(vexp->Name(),boolean));}#endif

5.测试用例

#include "Interpreter.h"int main(int argc, const char * argv[]){    Contex contex;    //建立变量    VariableExp* x=new VariableExp("x");    VariableExp* y=new VariableExp("y");    //变量赋值    contex.Assign(x,false);    contex.Assign(y,true);    //声明表达式,这里是(!x)&&(x||y)    BoolExp* expression=new AndExp(new NotExp(x),new OrExp(x,y));    //求值    bool value=expression->Evaluate(contex);    //输出结果    if(value)        cout<<"the result is true"<<endl;    else        cout<<"The result is false"<<endl;    return 0;}


0 0