C++设计模式之解释器模式

2013年07月06日 19:43:00
阅读数:8853

概述:

        未来机器智能化已然成为趋势,现在手机都能听懂英语和普通话,那我大中华几万种方言的被智能化也许也是趋势,我们的方言虽然和普通话相似,但是还是不一样的。这可能需要一个新的语法分析器来帮助我们。

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

但是解释一门自然语言是复杂的过程,我们以加减运算为例子来详细解释解释器模式。

UML类图:

// Interpreter.cpp : 定义控制台应用程序的入口点。
//

#include "stdafx.h"
#include <map>  
#include <string> 
#include<iostream>
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)
    {
        this->left = left;
        this->right = right;
    }
    int interpreter(Context context)
    {
        return this->left->interpreter(context) + this->right->interpreter(context);
    }
};

class SubtractNonterminalExpression:public AbstractExpression
{
private :
    AbstractExpression *left;
    AbstractExpression *right;
public:
    SubtractNonterminalExpression(AbstractExpression *left, AbstractExpression *right)
    {
        this->left = left;
        this->right = right;
    }
    int interpreter(Context context)
    {
        return this->left->interpreter(context) - this->right->interpreter(context);
    }
};

class TerminalExpression :public AbstractExpression
{
private:
    int i;
public:
    TerminalExpression(int i)
    {
        this->i = i;
    }
    int interpreter(Context context)
    {
        return this->i;
    }
};
int _tmain(int argc, _TCHAR* argv[])
{
    //a-b+c
    cout<<"解释器模式:a-b+c"<<endl;
    Context context;
    context.addValue("a",7);
    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<< addValue->interpreter(context)<<endl;
    return 0;
}

 

posted @ 2018-07-13 13:29  wxmwanggood  阅读(623)  评论(0编辑  收藏  举报