zoukankan      html  css  js  c++  java
  • 解释器模式

    解释器模式
    【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

  • 相关阅读:
    Redis配置文件详解
    SpingBoot 定时器(跟随Application启动)
    Linux 查找哪些文件包含指定的一个或多个字符串
    帆软报表中sql中出现汉字时乱码
    mysql 匹配奇数、偶数行数据
    vs code 快捷键中英文对照
    前端学习路线汇总
    vscode: Visual Studio Code 常用快捷键1
    vue-router的router.go(n)问题?
    vue2.0 技巧汇总
  • 原文地址:https://www.cnblogs.com/leijiangtao/p/4534535.html
Copyright © 2011-2022 走看看