• 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;
    }
  • 相关阅读:
    vue项目中使用定时器,离开页面时清除定时器
    不能在循环中使用res.send(err);
    React使用require加载图片失败
    实验五 单元测试
    实验四 代码评审
    UML 建模工具的安装与使用
    结对编程 第二阶段
    结对编程
    GIT 代码版本管理
    结构化方法与面向对象化方法的比较
  • 原文地址:https://www.cnblogs.com/wxmwanggood/p/9304452.html
Copyright © 2020-2023  润新知