12.解释器模式

简介: 1解释器模式具体描述 解释器模式:给定一个语言后,解释器模式可以定义出其文法的一种表示, 并同时提供一个解释器。客户端可以使用这个解释器来解释这个语言中的句子。 解释器模式将描述怎样在有了一个简单的文法后,使用模式设计解释这些语句。 在解释器模式里面提到的语言是指任何解释器对象能够解释的任何组合。 在解释器模式中需要定义一个代表文法的命令类的等级结构,

1解释器模式具体描述

解释器模式:给定一个语言后,解释器模式可以定义出其文法的一种表示,

并同时提供一个解释器。客户端可以使用这个解释器来解释这个语言中的句子。

解释器模式将描述怎样在有了一个简单的文法后,使用模式设计解释这些语句。

在解释器模式里面提到的语言是指任何解释器对象能够解释的任何组合。

在解释器模式中需要定义一个代表文法的命令类的等级结构,

也就是一系列的组合规则。每一个命令对象都有一个解释方法,

代表对命令对象的解释。命令对象的等级结构中的对象的任何排列组合都是一个语言。

 

俺有一个《泡MM真经》,上面有各种泡MM的攻略,比如说去吃西餐的步骤、

去看电影的方法等等,跟MM约会时,只要做一个Interpreter

照着上面的脚本执行就可以了。

4.观察者模式类图

5.代码:

#include<iostream>

#include <list>

#include <string>

using namespace std;

//解释器模式:给定一个语言后,解释器模式可以定义出其文法的一种表示,

//并同时提供一个解释器。客户端可以使用这个解释器来解释这个语言中的句子。

//解释器模式将描述怎样在有了一个简单的文法后,使用模式设计解释这些语句。

//在解释器模式里面提到的语言是指任何解释器对象能够解释的任何组合。

//在解释器模式中需要定义一个代表文法的命令类的等级结构,

//也就是一系列的组合规则。每一个命令对象都有一个解释方法,

//代表对命令对象的解释。命令对象的等级结构中的对象的任何排列组合都是一个语言。

//

//俺有一个《泡MM真经》,上面有各种泡MM的攻略,比如说去吃西餐的步骤、

//去看电影的方法等等,跟MM约会时,只要做一个Interpreter

//照着上面的脚本执行就可以了。

 

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);

    }

 

    cin.get();

    return 0;

}

运行结果如下:


目录
相关文章
0 和 1 的字面量
Julia 支持整数和浮点数数据类型,以及字面量表示固定值。`zero(x)` 和 `one(x)` 函数提供类型安全的零和一字面量,减少类型转换成本。例如:`zero(Float32)` 返回 `0.0f0`,`one(Int32)` 返回 `1`。
|
移动开发 前端开发 Java
|
关系型数据库 MySQL 数据库管理
|
4天前
|
搜索推荐 编译器 Linux
一个可用于企业开发及通用跨平台的Makefile文件
一款适用于企业级开发的通用跨平台Makefile,支持C/C++混合编译、多目标输出(可执行文件、静态/动态库)、Release/Debug版本管理。配置简洁,仅需修改带`MF_CONFIGURE_`前缀的变量,支持脚本化配置与子Makefile管理,具备完善日志、错误提示和跨平台兼容性,附详细文档与示例,便于学习与集成。
288 116
|
19天前
|
域名解析 人工智能
【实操攻略】手把手教学,免费领取.CN域名
即日起至2025年12月31日,购买万小智AI建站或云·企业官网,每单可免费领1个.CN域名首年!跟我了解领取攻略吧~
|
6天前
|
数据采集 人工智能 自然语言处理
Meta SAM3开源:让图像分割,听懂你的话
Meta发布并开源SAM 3,首个支持文本或视觉提示的统一图像视频分割模型,可精准分割“红色条纹伞”等开放词汇概念,覆盖400万独特概念,性能达人类水平75%–80%,推动视觉分割新突破。
408 38
Meta SAM3开源:让图像分割,听懂你的话
|
13天前
|
安全 Java Android开发
深度解析 Android 崩溃捕获原理及从崩溃到归因的闭环实践
崩溃堆栈全是 a.b.c?Native 错误查不到行号?本文详解 Android 崩溃采集全链路原理,教你如何把“天书”变“说明书”。RUM SDK 已支持一键接入。
670 220