解释器模式

解释器模式
【1】什么是解释器模式?

解释器模式:拟定一种 “语言”,定义该语言文法的一种表示,并定义一种解释器,这个解释器使用该表示文法来解释语言中的句子。

【2】解释器模式代码示例:

(1)代码示例1:

 

#include <iostream>
#include <list>
#include <string>
using namespace std;

class Context;

class AbstractExpression
{
public:
    virtual void interpret(Context *) = 0;
};

class TerminalExpression : public AbstractExpression
{
public:
    void interpret(Context *context)
    {
        cout << "终端解释器" << endl;
    }
};

class NonterminalExpression : public AbstractExpression
{
public:
    void interpret(Context *context)
    {
        cout << "非终端解释器" << endl;
    }
};

class Context
{
public:
    string input, output;
};

int main()
{
    Context *context = new Context(); 
    list<AbstractExpression*>  lt;
    lt.push_back(new TerminalExpression());
    lt.push_back(new NonterminalExpression());
    lt.push_back(new TerminalExpression());
    lt.push_back(new TerminalExpression());
    
    for (list<AbstractExpression*>::iterator iter = lt.begin(); iter != lt.end(); iter++)
    {
        (*iter)->interpret(context);
    }
    
    return 0;
}
// Result:
/*
终端解释器
非终端解释器
终端解释器
终端解释器
*/

 

(2)代码示例2:

#include <iostream>  
#include <map>  
#include <string>  
 
using namespace std;  

class Context
{
private:
    map<string, int> valueMap;

public:
    void addValue(string key,int value)
    {       
        valueMap.insert(std::pair<string, int>(key, value));   // 插入构建项
    }

    int getValue(string key)
    {
        return valueMap[key]; // 解析值
    }
};

class AbstractExpression
{
public :
     virtual int interpreter(Context context) = 0;
};

class AddNonterminalExpression : public AbstractExpression
{
private :
    AbstractExpression *left;
    AbstractExpression *right;

public:
    AddNonterminalExpression(AbstractExpression *left, AbstractExpression *right)
        : left(left)
        , right(right)
    {
    }

    int interpreter(Context context)
    {
        return (left->interpreter(context)) + (right->interpreter(context));
    }
};

class SubtractNonterminalExpression : public AbstractExpression
{
private :
    AbstractExpression *left;
    AbstractExpression *right;

public:
    SubtractNonterminalExpression(AbstractExpression *left, AbstractExpression *right)
        : left(left)
        , right(right)
    {
    }

    int interpreter(Context context)
    {
        return (left->interpreter(context)) - (right->interpreter(context));
    }
};

class TerminalExpression : public AbstractExpression
{
private :
    int i;
public :
    TerminalExpression(int i) : i(i)
    {
    }

    int interpreter(Context context)
    {
        return i;
    }
};

int main()
{  
    // a - b + c
    Context context;
    context.addValue("a", 10);
    context.addValue("b", 8);
    context.addValue("c", 2);

    SubtractNonterminalExpression *subtractValue = 
        new SubtractNonterminalExpression(new TerminalExpression(context.getValue("a")), new TerminalExpression(context.getValue("b")));

    AddNonterminalExpression *addValue = new AddNonterminalExpression(subtractValue, new TerminalExpression(context.getValue("c")));

    cout << subtractValue->interpreter(context);  // 10 - 8 = 2
    cout << addValue->interpreter(context);  // 2 + 2 = 4
    
    return 0;  
}

【3】应用


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

 

http://www.cnblogs.com/leijiangtao/p/4534478.html

posted @ 2015-05-27 22:07  南哥的天下  阅读(168)  评论(0编辑  收藏  举报