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

    解释器模式interpreter):

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



        如果一种特定类型的问题发生的频率足够高,那么可能就值得将该问题的各个实例表示为一个简单语言中的句子。这样就可以构建一个解释器,该解释器通过解释这些句子来解决问题(比如正则表达式)。

    解析器模式实现代码

    #pragma once
    #include <string>
    #include <iostream>
    using namespace std;
    
    //Context 包含解释器之外的一些全局信息
    class CContext
    {
    public:
    	string m_strInput;
    	CContext(const string &strInput)
    	{
    		m_strInput = strInput;
    	}
    };
    
    //AbstractExpression(抽象表达式),声明一个抽象的解释操作,这个接口为抽象语法树中
    //所有的节点所共享。
    class CAbstractExpression
    {
    public:
    	virtual void Interpret(CContext *pContext) = 0;
    };
    
    //TerminalExpression(终结符表达式),实现与文法中的终结符相关联的解释器操作。
    //实现抽象表达式中所要求的接口,主要是一个interpret()方法。文法中每一个终结符
    //都有一个具体终结表达式与之相对应。
    class CTerminalExpression : public CAbstractExpression
    {
    public:
    	void Interpret(CContext *pContext)
    	{
    		cout<<"zhongduanjiehsiqi:"<<pContext->m_strInput<<endl;
    	}
    };
    
    //NonterminalExpression(非终结符表达式),为文法中的非终结符实现解释操作。
    //对文法中每一条规则R1、R2......Rn都需要一个具体的非终结符表达式类。
    //通过实现抽象表达式的interpret()方法实现解释器操作。解释操作以递归方式
    //调用上面所提到的表达式R1、R2......Rn中各个符号的实例变量。
    class CNonterminalExpression : public CAbstractExpression
    {
    public:
    	void Interpret(CContext *pContext)
    	{
    		cout<<"feizhongduanjiehsiqi:"<<pContext->m_strInput<<endl;
    	}
    };
    
    运客户端调用

    #include "stdafx.h"
    #include <list>
    #include <iostream>
    #include <windows.h>
    #include "CinterpreterMode.h"
    
    using namespace std;
    
    int main()
    {
    	CContext *pContext = new CContext("test");
    	list <CAbstractExpression *> lstWork;
    	lstWork.clear();
    	lstWork.push_back(new CTerminalExpression());
    	lstWork.push_back(new CNonterminalExpression());
    	lstWork.push_back(new CTerminalExpression());
    	lstWork.push_back(new CTerminalExpression());
    	for each(CAbstractExpression * i in lstWork)
    	{
    		i->Interpret(pContext);
    		delete i;
    	}
    	delete pContext;
    
       return 0;
    }
    
    运行结果



  • 相关阅读:
    【数学建模】—优秀论文(一)
    【数学建模】—论文排版
    【Linux学习】—第8章linux编程
    【Linux学习】—文件权限和目录配置
    【ESP8266学习】(一)
    【OpenCV】——b站达尔闻
    【Linux学习】——Shell编程基础
    【数学建模】——模拟退火算法(SAA)
    react 开发中火狐,Safari浏览器嵌套iframe显示空白
    element ui dataPicker 日期范围限制
  • 原文地址:https://www.cnblogs.com/csnd/p/12062318.html
Copyright © 2011-2022 走看看