设计模式之~解释器模式

news2024/10/6 16:36:49

简述:

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

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

  • 解释器模式(Interpreter Pattern)是指给定一门语言,定义它的文法的一种表示(如:加减乘除表达式和正则表达式等),然后再定义一个解释器,该解释器用来解释我们的文法表示(表达式)。

  • 解释器模式是一种按照规定的语法(文法)来进行解析的一种设计模式,属于行为型模式。

        

结构图:

抽象语法树:

  • 抽象语法树(abstract syntax code,AST)是源代码的抽象语法结构的树状表示,树上的每个节点都表示源代码中的一种结构,之所以说是抽象的,抽象表示把js代码进行了结构化的转化,转化为一种数据结构。这种数据结构其实就是一个大的json对象,json我们都熟悉,他就像一颗枝繁叶茂的树。有树根,有树干,有树枝,有树叶,无论多小多大,都是一棵完整的树。

  • 抽象语法树(abstract syntax code,AST)是源代码抽象语法结构的树状表示,树上的每个节点都表示源代码中的一种结构,之所以说语法是’抽象’的,是因为这里的语法不会表示出真实语法中出现的每个细节。比如说,嵌套括号被隐含在树的结构中,并没有以节点的形式呈现。

    抽象语法树并不依赖于源语言的语法,也就是说语法分析阶段所采用的上下文无文法,因为在写文法时,经常会对文法进行等价的转换(消除左递归,回溯,二义性等),这样会给文法分析引入一些多余的成分,对后续阶段造成不利影响,甚至会使合个阶段变得混乱。因些,很多编译器经常要独立地构造语法分析树,为前端,后端建立一个清晰的接口。

  • 什么叫做抽象语法树呢?《java 与模式》中给的解释为:抽象语法树的每一个节点都代表一个语句,而在每个节点上都可以执行解释方法。这个解释方法的执行就代表这个语句被解释。由于每一个语句都代表这个语句被解释。由于每一个语句都代表一个常见的问题的实例,因此每一个节点上的解释操作都代表对一个问题实例的解答。

抽象表达式,声明一个抽象的解释操作,这个接口为抽象语法树中所有的节点所共享。

public abstract class AbstractExpression {
    public abstract void interpret(Context context);
}

        终结符表达式,实现与文法中的终结符相关联的解释操作。实现抽象表达式中所要求的接口,主要是一个interpret()方法。文法中每一个终结符都有一个具体终结表达式与之相对应。

(终结符表达式(相当于树的叶子):遇到这个表达式interpreter执行能直接返回结果,不会向下继续调用。)

public class TerminalExpression extends AbstractExpression {
    public void interpret(Context context) {
        System.out.println("终端解释器");
    }
}

        非终结符表达式,为文法中的非终结符实现解释操作。对文法中每一条规则R1、R2……RN都需要一个具体的非终结符表达式类。通过实现抽象表达式的interpret()方法实现解释操作。解释操作以递归方式调用上面所提到的R1、R2、RN中各个符号的实例变量。

public class NonterminalExpression extends AbstractExpression {
    public void interpret(Context context) {
        System.out.println("非终端解释器");
    }
}

Context,包含解释器之外的一些全局信息。

public class Context {
    private String input;
    private String output;
    
    public String getInput() {
        return input;
    }
    public void setInput(String input) {
        this.input = input;
    }
    public String getOutput() {
        return output;
    }
    public void setOutput(String output) {
        this.output = output;
    }
}

客户端代码,构建表示该文法定义的语言中一个特定的句子的抽象语法树。调用解释操作。

public class Client {
    public static void main(String[] args) {
        Context context = new Context();
        List<AbstractExpression> list = new ArrayList<AbstractExpression>();
        list.add(new TerminalExpression());
        list.add(new NonterminalExpression());
        list.add(new TerminalExpression());
        list.add(new TerminalExpression());
        for (AbstractExpression exp : list) {
            exp.interpret(context);
        }
    }
}

优点:

  • 可扩展性比较好,灵活。

  • 增加了新的解释表达式的方式

  • 解释器模式,可以很容易地改变和扩展文法,因为该模式使用类来表示文法规则,你可使用继承来改变或扩展该文法。也比较容易实现文法,因为定义抽象语法树中各个节点的类的实现大体类似,这些类都易于直接编写。

缺点:

  • 当文法规则比较复杂时,会引起类膨胀,比较难维护。

  • 当文法规则比较复杂时,如果出错了,调试比较困难。

  • 执行效率比较低下。因为当表达式比较复杂,结果层层依赖的话会采用递归方式进行解析。

  • 解释器模式为文法中的每一条规则至少定义了一个类,因此包含许多规则的文法可能难以管理和维护。建议当文法非常复杂时,使用其他的技术如语法分析程序或编译器生成器来处理。

适用场景:

  • 当有一个语言需要解释执行,并且你可将该语言中的句子表示为一个抽象语法树时,可使用解释器模式。

  • 正则表达式就是解释器的一种应用,解释器为正则表达式定义了一个文法,如何表示一个特定的正则表达式,以及如何解释这个正则表达式。

  • 当我们有一些需要重复解析的问题可以考虑定义一个表达式来进行表达。

  • 一些简单的语法如果需要解释的话也可以考虑解释器模式。

  • 可以将一个需要解释执行的语言中的句子表示为一个抽象语法树

  • 编译器

  • 运算表达式计算、正则表达式

  • 机器人

 

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

基于安全产品DNS隧道流量分析

域名准备 选择哪家的云都没问题&#xff0c;这里我选择的TX云&#xff0c;因为之前注册过了&#xff0c;自己拿来做个流量分析不成问题。 域名添加解析记录 需要准备自己的vps作为DNS隧道的服务端&#xff0c;且需要添加ns记录 iodined 关闭53端口关闭开机自启 systemctl …

数据在内存中存储的真相来了!!!

&#x1f929;本文作者&#xff1a;大家好&#xff0c;我是paper jie&#xff0c;感谢你阅读本文&#xff0c;欢迎一建三连哦。 &#x1f970;内容专栏&#xff1a;这里是《C知识系统分享》专栏&#xff0c;笔者用重金(时间和精力)打造&#xff0c;基础知识一网打尽&#xff0c…

【CMake报错】“检测到_ITERATOR_DEBUG_LEVEL和RuntimeLibrary不匹配” 的解决方案

&#x1f449;博__主&#x1f448;&#xff1a;米码收割机 &#x1f449;技__能&#x1f448;&#xff1a;C/Python语言 &#x1f449;公众号&#x1f448;&#xff1a;测试开发自动化 &#x1f449;专__注&#x1f448;&#xff1a;专注主流机器人、人工智能等相关领域的开发、…

外观模式详解:轻松搞定复杂子系统

一、概述 外观模式&#xff08;Facade Pattern&#xff09;是一种结构型设计模式&#xff0c;它为多个子系统中的操作提供一个统一的高层接口&#xff0c;用于访问复杂子系统的功能。其核心思想是通过一个外观类将子系统的复杂操作进行封装&#xff0c;客户端只需与外观类进行…

微信朋友圈如何批量发圈

做营销最重要的任务是什么&#xff1f; 毋庸置疑&#xff0c;就是发布朋友圈。 为什么要发圈呢&#xff1f; 发朋友圈是一种推广产品和服务的营销手段。 在如今社交媒体普及的时代&#xff0c;人们大多数时间都在线上&#xff0c;而朋友圈作为微信中的社交场景之一&#xff…

小程序开发,帮助小个体实现品牌化

在这个互联网时代&#xff0c;小程序成为了各大平台的必备。微信作为一款国民级的应用&#xff0c;如今已经拥有近10亿的用户&#xff0c;而小程序作为微信新推出的一款产品&#xff0c;已经被大家熟知。除了微信平台之外&#xff0c;小程序也被很多商家所青睐。因为小程序能带…

C++中《stack和queue的使用》

本文主要讲解栈和队列的常见接口的使用 文章目录 一、栈的介绍和使用1.1 stack的介绍1.2 stack的使用 二、queue的介绍和使用2.1 queue的介绍2.2 queue的使用 一、栈的介绍和使用 1.1 stack的介绍 1️⃣stack是一种容器适配器&#xff0c;专门用在具有后进先出操作的上下文环…

CS5366电路原理图|CS5366demobord参考电路|单芯片PD集成4K60Hz拓展坞芯片设计

ASL CS5366是Type-C转HDMI 4K60HZPDUSB3.0单芯片集成芯片&#xff0c;芯片方案带DSC压缩功能且最高可支持支持RGB 4:4:4 。 CS5366参数特性&#xff1a; 支持最高分辨率/定时4k60Hz 支持DSC v1.2a&#xff0c;并与前一版本向后兼容 支持DSC解码器和直通模式 嵌入式32位RISC-V…

2023年天府杯全国大学生数学建模竞赛B题中国环境问题的治理解题全过程

2023年天府杯全国大学生数学建模竞赛 B题 中国环境问题的治理 原题再现&#xff1a; 问题背景&#xff1a;   随着经济的快速发展和人口的持续增长&#xff0c;中国的环境问题已经成为了一个急需解决的重要问题。这些环境问题不仅对人们的健康和生活质量产生了巨大的影响&a…

笔试强训7

作者&#xff1a;爱塔居 专栏&#xff1a;笔试强训 作者简介&#xff1a;大三学生&#xff0c;希望和大家一起进步 目录 day9 day10 day9 一. 单选 1.下面程序的输出是:() String x"fmn"; x.toUpperCase(); String yx.replace(f,F); yy"wxy"; System.out…

Redis的内存策略(未完成)

过期Key处理: 1)Redis之所以性能强大&#xff0c;最主要的原因就是基于内存来存储&#xff0c;然而单节点的Redis内存不宜设置的过大&#xff0c;否则会影响持久化或者是主从复制的性能&#xff0c;可以通过修改配置文件来设置redis的最大内存&#xff0c;通过maxmemory 1gb&am…

为什么数字化转型就应该选择低代码?一文详解

数字化转型在这几年被反复提及&#xff0c;我们听得耳朵都快起茧子了。数字化在当前经济社会发展中扮演着越来越重要的角色&#xff0c;可以帮助企业更好地理解消费者和市场需求&#xff0c;更好地应对市场竞争&#xff0c;同时也可以提高企业效率&#xff0c;促进经济发展。 究…

WICC · 出海嘉年华倒计时!精彩不容错过,「指南」一手掌握

6.2 广州 WICC出海嘉年华 精彩不容错过 指南一手掌握 -高端峰会 圆桌会议- 超 有 料 话题剧透 如何在巨头林立的热门赛道成功突围&#xff1f; 如何在迅猛发展的新兴市场深挖价值&#xff1f; 如何在复杂合规政策下实现应用增长&#xff1f; 如何利用好底层技术优化本地化…

pip安装库提示Read timed out更换下载源

在使用pip install xx安装库的时候提示 Read timed out. 一般解决方案就两种&#xff1a; 1.延长timeout时间&#xff0c;治标不治本&#xff0c;谁知道到底该延长多少时间才能百分百每次安装都成功。 使用方式&#xff1a; pip --default-timeout1000 install 需要安装的库…

强化学习笔记-07 n-step Bootstrapping 多步TD时分学习

本文是博主对《Reinforcement Learning- An introduction》的阅读笔记&#xff0c;不涉及内容的翻译&#xff0c;主要为个人的理解和思考。 上一节介绍了TD算法&#xff0c;其采用了Bootstrapping方法&#xff0c;当前过去的预估以及即期收益来更新累积收益函数&#xff1a; 前…

通过期待已久的帕丽斯·希尔顿人物化身系列,成为元宇宙的偶像

5,555 个以帕丽斯希尔顿为主题的独特人物化身将于 5 月 31 日推出&#xff0c;每个人物化身均可在 The Sandbox 中使用。 我们与帕丽斯希尔顿及全球流行文化中心的下一代娱乐公司 11:11 Media 合作&#xff0c;很高兴宣布帕丽斯希尔顿的人物化身系列即将推出&#xff01; 作为对…

Word导出PDF时图片质量下降问题的解决方法

Word导出PDF时图片质量下降问题的解决方法 ⭐️ 最近&#xff0c;在使用Word写完论文以后&#xff0c;另存为“PDF”文件时&#xff0c;发现文档中的图像质量明显下降。本文介绍的方法可以将Word保存为图片无压缩的带有标签的高质量PDF文件&#xff0c;建议仅在定稿时进行以下…

2023系统分析师下午案例分析真题

真题1 阅读以下关于软件系统分析与建模的叙述,在纸上回答问题1至3. 说明: 某软件公司拟开发一套汽车租赁系统,科学安全和方便的管理租赁公司的各项业务,提高公司效率,提升利率。注册用户在使用系统镜像车辆预约时需执行以下操作: (a) 用户登录系统 (b) 查询车辆信息 (c) …

业务安全情报第16期 | 大促8成优惠券竟被“羊毛党”抢走!?

目录 八成秒杀账户是羊毛党 羊毛党风险分析 安全防护及产品组合建议 近期&#xff0c;某电商小程序举办美食节营销活动&#xff0c;提供高额折扣券&#xff0c;并允许用户进行秒杀。然而&#xff0c;羊毛党团伙利用作弊手段&#xff0c;抢购囤券&#xff0c;然后倒卖变现&am…

释放 AI 的力量|2023 年 8 款最佳 AI 图像生成器

1973 年&#xff0c;Harold Cohen 设计的 AARON 系统创造了第一件人工智能生成的艺术品。黑白涂鸦远非所谓的美术&#xff0c;但它们为 DALLE-2 和 Midjourney 等一些出色的 AI 图像生成器奠定了基础。 在过去的 50 年里&#xff0c;AI 图像生成器变得更加智能。通过分析和学习…