设计模式(4)--类行为(3)--解释器

1. 意图

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

    言中的句子。 

2. 四种角色

    抽象表达式(AbstractExpression)、终结表达式(TerminalExpression)、非终结表达式(NonterminalExpression)、上下文(Context)

3. 优点

    3.1 易于改变和扩展文法

    3.2 易于实现文法

    3.3 实现新表达式“计算”变得容易 

4. 缺点

    4.1 复杂的文法难于维护

5. 相关模式

    5.1 抽象语法树是一个组合模式的实例

    5.2 抽象语法树用享元模式来共享终结符

    5.3 解释器可用一个迭代器遍历该结构

    5.4 访问者可用来在一个类中维护抽象语法树中的各节点的行为  

6. 代码示意(C++)
#pragma once
#include<iostream>
#include <string>
using namespace std;class Context
{string m_input;
public:Context(const string& input) :m_input(input) {}bool Lookup(const char* name) {size_t nPos = m_input.find(*name);return nPos != string::npos;}
};class AbstractExpression
{
public:virtual bool Interpret(Context& context) = 0;
};class TerminalExpression :public AbstractExpression
{char* m_name;
public:TerminalExpression(const char* name) {m_name = _strdup(name);//拷贝副本}virtual bool Interpret(Context& context) {cout << "终端解析器" << endl;return context.Lookup(m_name);}
};class NonterminalExpression :public AbstractExpression
{AbstractExpression* m_pExpression1;AbstractExpression* m_pExpression2;
public:NonterminalExpression(AbstractExpression* pExpression1, AbstractExpression* pExpression2) {m_pExpression1 = pExpression1;m_pExpression2 = pExpression2;}~NonterminalExpression() {delete m_pExpression1;delete m_pExpression2;}virtual bool Interpret(Context& context) {cout << "非终端解析器" << endl;return m_pExpression1->Interpret(context) && m_pExpression2->Interpret(context);}
};
#include "Expression.h"
int main() {Context context("hello");AbstractExpression* pExpression = new TerminalExpression("H");cout << "解释器返回:" << pExpression->Interpret(context) << endl;delete pExpression;pExpression = new NonterminalExpression(new TerminalExpression("h"), new TerminalExpression("o"));cout << "解释器返回:" << pExpression->Interpret(context) << endl;delete pExpression;return 0;
}

运行结果:

6.1 可以很容易地改变解释器或增加新的终端解释器来实现新文法(3.1、3.2)。

6.2 非终端解释器是组合模式,很容易实现新的“计算”(3.3)。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/296537.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

LTE之帧结构

一、基本时间单位 在LTE里&#xff0c;时间的基本单位都是采样周期Ts&#xff0c;值固定等于&#xff1a; Ts 1 / (15000 * 2048) 32.55ns 其中&#xff0c;15000表示子载波的间隔是15kHz&#xff0c;2048表示采样点个数。除了15kHz的子载波间隔之外&#xff0c;3GPP还定义…

【高数定积分求解旋转体体积】 —— (上)高等数学|定积分|柱壳法|学习技巧

&#x1f308;个人主页: Aileen_0v0 &#x1f525;热门专栏: 华为鸿蒙系统学习|计算机网络|数据结构与算法 &#x1f4ab;个人格言:"没有罗马,那就自己创造罗马~" 目录 Shell method Setting up the Integral 例题 Example 1: Example 2: Example 3: Computing…

安工程校园导游系统课程设计报告

第一章 概述 1.1 问题描述 根据题目内容,需要用无向网表示所在学校的景点平面图,即校内每个景点 为无向网中的各个结点,景点的编号、名称、简介等信息存储在结点中,图中的 边表示景点间的道路,存放景点之间的路径长度等信息。需要回答有关景点介绍、 游览路径等问题。具…

【LearnOpenGL基础入门——5】着色器

目录 一.简介 二.GLSL 三.数据类型 四.输入与输出 五.Uniform 六.更多属性 一.简介 着色器(Shader)是运行在GPU上的小程序。这些小程序为图形渲染管线的某个特定部分而运行。从基本意义上来说&#xff0c;着色器只是一种把输入转化为输出的程序。着色器也是一种非常独立…

深度学习 | 基础卷积神经网络

卷积神经网络是人脸识别、自动驾驶汽车等大多数计算机视觉应用的支柱。可以认为是一种特殊的神经网络架构&#xff0c;其中基本的矩阵乘法运算被卷积运算取代&#xff0c;专门处理具有网格状拓扑结构的数据。 1、全连接层的问题 1.1、全连接层的问题 “全连接层”的特点是每个…

关于巴西网络犯罪分子使用LOLBaS和CMD脚本窃取银行账户的动态情报

一、基本内容 最近&#xff0c;一名未知身份的网络犯罪威胁行为者以使用西班牙语和葡萄牙语的用户为目标&#xff0c;破坏墨西哥、秘鲁和葡萄牙等地的网上银行账户。该攻击链主要利用社会工程学技术&#xff0c;利用葡萄牙和西班牙用户的电子邮件&#xff0c;发送带有欺骗性的…

idea structure视图介绍

作用 idea的Structure视图可以辅助查看代码结构 如何呼出Structure视图&#xff1f; Alt 7 Ctrl F12 侧边栏点Structure 我的常用配置 1、选Show Toolbar&#xff0c;便于使用功能按钮 2、使用Float视图&#xff0c;悬浮于窗口表面&#xff0c;可以使用 ShiftEsc来退出…

若依vue如何展示一个HTML页面(或者展示Markdown文档)

一. 前言 ⚠ 本文是展示Markdown的方法,不能直接前端编辑Markdown文档. 二. 准备部分 用Typora编辑器打开需要导出html页面,我这里使用Typora来导出 1. 先将md文件导出成html 2. 将导出好的文件放在若依vue的pubilc下(文件可以是中文) 三. 代码部分 1.使用v-html来展示HT…

ApsaraMQ Serverless 演进之路,助力企业降本

作者&#xff1a;家泽 ApsaraMQ 与时俱进&#xff0c;砥砺前行 阿里云消息队列从诞生开始&#xff0c;至今已有十余年。今年&#xff0c;阿里云消息产品全面品牌升级为 ApsaraMQ&#xff0c;与时俱进&#xff0c;砥砺前行。 2012 年&#xff0c;RocketMQ 诞生于集团内部&…

鸿蒙(HarmonyOS)项目方舟框架(ArkUI)之Image图片组件

鸿蒙&#xff08;HarmonyOS&#xff09;项目方舟框架&#xff08;ArkUI&#xff09;之Image图片组件 一、操作环境 操作系统: Windows 10 专业版、IDE:DevEco Studio 3.1、SDK:HarmonyOS 3.1 二、Image组件 Image 用来加载并显示图片的基础组件&#xff0c;它支持从内存、本…

Anchor-based目标检测算法

Anchor-based目标检测算法是一类利用预定义锚框&#xff08;anchor boxes&#xff09;进行目标检测的算法。这些锚框在图像中覆盖不同尺度和宽高比例的区域&#xff0c;用于生成候选目标框。以下是一些主要的anchor-based目标检测算法&#xff1a; Faster R-CNN (Region-based…

Android UID相关知识

一、UID/PID/GID/GIDS的含义和作用 UID : android中uid用于标识一个应用程序&#xff0c;uid在应用安装时被分配&#xff0c;并且在应用存在于手机上期间&#xff0c;都不会改变。一个应用程序只能有一个uid&#xff0c;多个应用可以使用sharedUserId 方式共享同一个uid&#…