C++解释器模式:Interpreter Pattern

2023-10-28

当有语言要解释时,请使用解释器模式为语言创建解释器。

解释器模式的核心是解释器类,在解释器模式中一般会定义两种解释器:

终结符解释器(Terminal Expression Interpreter):终结符解释器用于解释语言中的基本单位,对应语法树中的叶子节点,比如变量、常量等。

非终结符解释器(Nonterminal Expression Interpreter):非终结符解释器用于解释一个语法规则,对应语法树中的非叶子节点,比如算术表达式、逻辑表达式等。

解释器模式优缺点

解释器模式的优点是可以扩展语法规则,只需要增加相应的解释器即可,而不需要修改已有的解释器。但是,解释器模式的缺点也很明显,由于每个语法规则都需要对应一个解释器,因此解释器模式在解析复杂语句时会造成类膨胀和系统性能下降。

案例:

基于前面的Duck类,现在把它用于儿童学习编程的教育工具。使用这个模拟器,每个孩子都能用一种简单的语言来控制一只鸭子,

eg:

right;让鸭子右转

while(daylight)fly;让鸭子整天都在飞翔

quack;让鸭子嘎嘎叫

定义好语法后,现在所需要做的就是解释语法中的句子,好让学生们可以看到用这个语言控制鸭子的效果。

 

类图:

实现如下:

duck.h:

#ifndef DUCK_H
#define DUCK_H
#include <iostream>
#include <vector>
#include <string>

using namespace std;

class Duck {
public:
    void quack()
    {
        cout << "鸭子嘎嘎叫" << endl;
    }

    void right()
    {
        cout << "鸭子右转" << endl;
    }

    void left()
    {
        cout << "鸭子左转" << endl;
    }

    void fly()
    {
        cout << "鸭子飞" << endl;
    }
};

#endif // DUCK_H


expression.h:

#ifndef EXPRESSION_H
#define EXPRESSION_H
#include "duck.h"

class Expression {
public:
    virtual void interpret() = 0;

protected:
    Duck* m_duck = new Duck();
};

class Quack : public Expression{
public:
    virtual void interpret()
    {
        m_duck->quack();
    }

};

class Left : public Expression{
public:
    virtual void interpret()
    {
        m_duck->left();
    }

};


#endif // EXPRESSION_H


main.cpp:

/*
 * 解释器模式
 *
 * date:2023-9-20
*/

#include "expression.h"

int main()
{
    vector<string> contexts;
    string context;

    cout << "输入表达式(!结尾):" << endl;

    while(cin>>context)
    {
        if(context == "!") break;
        contexts.push_back(context);
    }

    Expression* expressions;
    for(int i = 0; i < contexts.size(); i++)
    {
        if(contexts[i] == "quack")
        {
            expressions = new Quack();
            expressions->interpret();
        }
        else if(contexts[i] == "left")
        {
            expressions = new Left();
            expressions->interpret();
        }
    }


}

运行截图:

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

C++解释器模式:Interpreter Pattern 的相关文章

  • 神经网络基础04-25个神经网络模型

    参考链接 https www toutiao com i6432188985530909186 前言 神经元 卷积神经元 Convolutional cells 和前馈神经元非常相似 除了它们只跟前一神经细胞层的部分神经元有连接 因为它们不

随机推荐

  • G - Card Game

    G Card Gamehttps vjudge csgrandeur cn problem Gym 102263G Zeyad and Ehab are playing a simple card game each player init
  • FISCO BCOS(十六)——— ubuntu安装go语言环境

    1 创建安装目录 mkdir home go 2 下载go安装包 wget https golang google cn dl go1 17 8 linux amd64 tar gz 3 解压go安装包 sudo tar zxvf go1
  • setup.py方式打包自己的python代码并可以用pip install安装

    setup py方式打包自己的python代码并可以用pip install安装 所需文件及目录规范 示例演示 打包静态文件补充说明 引用自己打的包 所需文件及目录规范 注意setup py文件和MANIFEST in文件需要放在和你需要打
  • 扩散模型Diffusion Model 【质量提升2.0】【扩散模型】

    扩散模型Diffusion Model 质量提升2 0 扩散模型 文章目录 扩散模型Diffusion Model 质量提升2 0 扩散模型 一 扩散模型简介 二 前向扩散简介 三 逆向扩散简介 四 目标函数 一 扩散模型简介 其最早出现在
  • 为什么人人都该懂点LLVM

    原文链接 http adriansampson net blog llvm html 作者 Adrian Sampson 译者 张洵恺 只要你和程序打交道 了解编译器架构就会令你受益无穷 无论是分析程序效率 还是模拟新的处理器和操作系统 通
  • 算法入门--递归

    不死神兔 有一对兔子 从出生后第3个月起每个月都生一对兔子 小兔子长到第三个月后每个月又生一对兔子 假如兔子都不死 问第二十个月的兔子对数为多少 规律 1 1 2 2 1 3 2 5 3 这就是暴力美学 不死神兔public class t
  • TF-IDF(词频-逆文档频率)介绍与python实现

    TF IDF term frequency inverse document frequency TF IDF介绍 TF IDF 词频 逆文档频率 是一种用于信息检索 Information retrieval 与数据挖掘 data min
  • 布林通道参数用20还是26_布林线指标参数设置为13、20、26、30、60、99,那个才是最佳?...

    布林线 Boll 指标是通过计算股价的 标准差 再求股价的 信赖区间 很多炒股新人不知道怎么设置布林线的参数 13 20 26 30 60 99那个才是最佳 下面详细介绍 一起来学习吧 布林带指标参数设置多少才最佳 布林带的参数一般默认的情
  • 系统用户名为中文导致PowerShell无法正确操作conda

    本文叙述的问题诱因 系统用户名为中文 本文最后给出了解决方案 并给出了原理猜测 conda版本 4 10 3 系统版本 Win11 专业版 21H2 现象 我在Win11使用Powershell时 发现终端提示 conda没有被初始化 需要
  • Spring系列篇--关于Spring Bean完整的生命周期【附有流程图,超级易懂】

    Welcome Huihui s Code World 接下来看看由辉辉所写的关于Spring的相关操作吧 目录 Welcome Huihui s Code World 一 Spring Bean是单例模式还是多例模式 二 论证Bean是单
  • AMD历代CPU发布时间

    1969年5月1日 AMD公司以10万美元的启动资金正式成立 1997 AMD推出AMD K6处理器 1998 AMD在微处理器论坛上发布AMD速龙处理器 以前的代号为K7 1999 AMD推出AMD速龙处理器 它是业界第一款支持Micro
  • ioctl函数详细分析

    IPv4 和 IPv6 的网络接口操作使用套接字 ioctl 命令 级别 中级 Katiyar Manish manish katiyar in ibm com 软件工程师 IBM Intel Microsoft HPShweta Gupt
  • 显式调用构造函数和析构函数

    今天跟同事聊天 他说到STL源码有用到显示调用析构函数 试一了一下 果然能行 include lt iostream gt using namespace std class MyClass public MyClass cout lt l
  • SqlServer傻瓜教程 — 表备份

    大家好 我们知道类似于ERP这种大型软件 最大的难点就在庞大数据库的整理和维护 表备份顾名思义 是对一个表进行备份 那么我们什么时候需要表备份呢 表备份是在操作大型ERP数据库的某一个表中有重要数据的时候 测试你对此表操作的存储过程 或者测
  • pytorch下import numpy失败_PyTorch的编译系统

    背景 本文以PyTorch 1 0为基础 PyTorch的编译首先是python风格的编译 使用了python的setuptools编译系统 以最基本的编译安装命令python setup py install 为例 这一编译过程包含了如下
  • 两台linux服务器互相自动备份

    将数据同步到其它服务器这里使用Linux同步文件工具rsync来进行文件的同步 rsync rsync是类unix系统下的数据镜像备份工具 remote sync 一款快速增量备份工具 Remote Sync 远程同步 支持本地复制 或者与
  • 【教3妹学算法-leetcode】数组能形成多少数对

    插 前些天发现了一个巨牛的人工智能学习网站 通俗易懂 风趣幽默 忍不住分享一下给大家 点击跳转到网站 坚持不懈 越努力越幸运 大家一起学习鸭 3妹 这么热的天气还要持续多久啊 快要被热死了 2哥 感觉还要有一阵子 今天刚入伏 3妹 啊 今年
  • 三极管的工作原理详解,图文+案例

    什么是三极管 三极管全称是 晶体三极管 也被称作 晶体管 是一种具有放大功能的半导体器件 通常指本征半导体三极管 即BJT管 典型的三极管由三层半导体材料 有助于连接到外部电路并承载电流的端子组成 施加到晶体管的任何一对端子的电压或电流控制
  • C语言程序设计 例7-5

    例7 5 原题 选择排序法 输入一个正整数n 1
  • C++解释器模式:Interpreter Pattern

    当有语言要解释时 请使用解释器模式为语言创建解释器 解释器模式的核心是解释器类 在解释器模式中一般会定义两种解释器 终结符解释器 Terminal Expression Interpreter 终结符解释器用于解释语言中的基本单位 对应语法