Java设计模式-解释器模式、解释器模式什么回事,抽象语法树又是什么

news2024/11/17 14:47:23

继续整理记录这段时间来的收获,详细代码可在我的Gitee仓库SpringBoot克隆下载学习使用!

6.12 解释器模式

6.12.1 概述

  • 思维:翻译识别机器,如解析由数字、“+”、“-”号构成的合法运算序列,若将数字和字符看作结点,可逐个节点进行读取计算
  • 定义:给定一种语言,定义文法表示,定义解释器,且此解释器可以使用该标识来解释语言中句子
  • 文法(语法)规则:描述语言的语法结构的形式规则,如
expression ::= value|plus|minus
plus::= expression '+' expression
minus::= expression '-' expression
value ::= Integer

可描述为表达式可以为数字或者plus运算或minus运算,而plus、minus又是表达式结合运算符构成,值类型为整数

  • 抽象语法树:AbstractSyntaxTree,简称AST,是源代码语法结构的一种抽象表示,以树状形式表示编程语言的语法结构,树上每个节点都表示源代码中的一种结构。如图![[Pasted image 20230118200014.png]]

6.12.2 结构

  • 抽象表达式角色(Abstract Expression):定义解释器接口,约定解释器的解释操作,主要包含解释方法Interpret()
  • 终结符表达式角色(Terminal Expression):抽象表达式子类,用来实现文法中与终结符相关的操作,文法中的每个终结符都有一个具体终结表达式与之相对应,如value
  • 非终结符表达式角色(Noterminal Expression):抽象表达式式子类,用来实现文法中与非终结符相关的操作,文法中的每条规则都对应于一个非终结符表达式,如+、-
  • 环境角色(Context):包含各个解释器需要的数据或是公共的功能,一般用来传递被所有解释器共享的数据,后面解释器可以从这里获取值
  • 客户端:主要任务是将需要分析的句子或表达式转换成使用解释器对象描述的抽象语法树,然后调用解释器的解释方法,也可以通过环境角色间接访问解释器解释方法

6.12.3 案例(加减法)

  • 环境角色
public class Context {  
//    用map存储变量  
    private Map<Variable,Integer> map = new HashMap<Variable,Integer>();  
//    添加变量  
    public void addVariable(Variable v,Integer value){  
        map.put(v, value);  
    }  
//    获取变量  
    public int getVariable(Variable v){  
        return  map.get(v);  
    }  
}
  • 抽象表达式
public abstract class AbstractExpression {  
    public abstract int interpret(Context context);  
}
  • 非终结符表达式
public class Plus extends AbstractExpression{  
    //    + 号左边表达式  
    private AbstractExpression left;  
    //    + 号右边表达式  
    private AbstractExpression right;  
    public Plus(AbstractExpression left,AbstractExpression right) {  
        this.left = left;  
        this.right = right;  
    }  
    @Override  
    public int interpret(Context context) {  
//        左边表达式+右边表达式  
        return left.interpret(context) + right.interpret(context);  
    }  
    @Override  
    public String toString() {  
        return "("+left.toString()+ "+ "+ right.toString() +")";  
    }  
}
public class Minus extends AbstractExpression{  
    //    - 号左边表达式  
    private AbstractExpression left;  
    //    - 号右边表达式  
    private AbstractExpression right;  
    public Minus(AbstractExpression left,AbstractExpression right) {  
        this.left = left;  
        this.right = right;  
    }  
    @Override  
    public int interpret(Context context) {  
//        左边表达式-右边表达式  
        return left.interpret(context) - right.interpret(context);  
    }  
    @Override  
    public String toString() {  
        return "("+left.toString()+ "-"+ right.toString() +")";  
    }  
}
  • 终结符表达式
public class Variable extends AbstractExpression{  
//    变量名  
    private String name;  
    public Variable(String name) {  
        this.name = name;  
    }  
    @Override  
    public int interpret(Context context) {  
        return context.getVariable(this);  
    }  
    @Override  
    public String toString() {  
        return  name;  
    }  
}
  • 测试
    public static void main(String[] args) {  
//        创建环境对象  
        Context context = new Context();  
//        创建变量  
        Variable a = new Variable("a");  
        Variable b = new Variable("b");  
        Variable c = new Variable("c");  
        Variable d = new Variable("d");  
//        赋值  
        context.addVariable(a,1);  
        context.addVariable(b,3);  
        context.addVariable(c,7);  
        context.addVariable(d,4);  
//        创建语法规则 a + b - c + d
AbstractExpression expression = new Plus(new Minus(new Plus(a,b),c),d);  
        int interpret = expression.interpret(context);  
        System.out.println(expression +"= "+ interpret);  
    }
  • 结果
    在这里插入图片描述
  • 类图![[Pasted image 20230118204543.png]]

6.12.4 优缺点

6.12.4.1 优点

  • 易于改变和扩展文法:由于模式中使用类表示语言文法规则,故可通过继承等机制改变或扩展文法,每一文法规则均可表示为一个类
  • 实现文法较为容易:抽象语法树汇总每一表达式节点类实现方式相似
  • 增加新解释表达式较为方便:若用户需要增加新解释表达式只需对应增加一新的终结符表达式或非终结符表达式类,原有表达式类不需要修改,符合“开闭原则”。

6.12.4.2 缺点

  • 对复杂文法难以维护:每条规则至少定义一个类,若语言包含太多文法规则,类个数爆发增长,导致系统难管理和维护
  • 执行效率低:使用了大量循环和递归调用

6.12.5 使用场景

  • 当语言文法较为简单,且执行效率不是关键问题
  • 当问题重复出现,且可以用一种简单语言来进行表达时
  • 当语言需要解释执行,且语言中句子可以表示为一抽象语法树

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

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

相关文章

Lesson 4.1 逻辑回归模型构建与多分类学习方法

文章目录一、广义线性模型&#xff08;Generalized liner model&#xff09;的基本定义二、对数几率模型与逻辑回归1. 对数几率模型&#xff08;logit model&#xff09;2. 逻辑回归与 Sigmoid 函数3. Sigmoid 函数性质三、逻辑回归模型输出结果与模型可解释性四、多分类学习与…

CPU缓存一致性

CPU缓存一致性写直达写回缓存一致性总线嗅探MESI协议CPU Cache通常分为三级缓存&#xff0c;L1Cache&#xff0c;L2Cache,L3Cache&#xff0c;级别越低的离CPU越近&#xff0c;访问速度越快&#xff0c;但同时容量越小&#xff0c;价格越贵。在多核的CPU中&#xff0c;每个核都…

今天大年三十,新年快乐,我在这里给大家整理了一下除夕的习俗,来看看吧

今天是大年三十,阿玥在这里祝大家,一来风水,二来平安,阖家欢乐,四季平安,五福临门,六六大顺,七星高照,八方来财,十全十美,新年好! 名字:不晓得 学习:python,c 主页:木有 今天给大家整理一下大年三十的习俗等小知识,就不更python啦 目录 除夕要做的事情有什么…

Meta CTO:真正的全天候轻量化AR眼镜,可能要到2030年

去年Meta发布了售价高达1500美元的VST头显Quest Pro&#xff0c;该头显与Meta的Quest 2等产品在定价、技术路径上有很大不同&#xff0c;其搭载了眼球追踪、彩色VST等更高端的功能&#xff0c;而产品发布后&#xff0c;外界对其反馈也褒贬不一。作为Pro产品线首个产品&#xff…

Markdown基础总结

Markdown Tools TyporaVSCode Markdown Preview Enhanced扩展 有道云笔记… 上述工具都能很好地支持markdown书写 Markdown标题 1 使用 和 - 标记一级和二级标题 和 - 标记语法格式如下&#xff1a; 我展示的是一级标题我展示的是二级标题 ---效果如下: 2 使用 # 号标…

Java设计模式-访问者模式、访问者模式怎么使用,具体是怎么用

继续整理记录这段时间来的收获&#xff0c;详细代码可在我的Gitee仓库SpringBoot克隆下载学习使用&#xff01; 6.10 访问者模式 6.10.1 定义 封装一些作用域某种数据结构中的各元素的操作&#xff0c;可以在不改变此数据结构的前提下定义作用于这些元素的新操作 6.10.2 结…

2023年新年烟花代码(背景音乐完整版)

文章目录前言烟花效果展示使用教程查看源码HTML代码CSS代码JavaScript新年祝福前言 大家过年好&#xff01;新春佳节&#xff0c;在这个充满喜悦的日子里&#xff0c;愿新年的钟声带给你一份希望和期待&#xff0c;我相信&#xff0c;时空的距离不能阻隔你我&#xff0c;我的祝…

Solidity 中的数学(第 5 部分:指数和对数

本文是关于在 Solidity 中进行数学运算的系列文章中的第五篇。这次的主题是&#xff1a;指数和对数 介绍 几个世纪以来&#xff0c;对数被用来简化计算。在电子计算器广泛普及之前&#xff0c;计算尺、基于对数的机械计算器是工程师职业的标志。 对数函数连同指数函数&#x…

【matplotlib】21.多图合并【python3、numpy、pandas、matplotlib完结】

#【matplotlib】21.多图合并 2023.1.20 python3、numpy、pandas、matplotlib完结 新年快乐&#xff01;&#xff01; 21.1 多合一显示 21.1.1 均匀分布 方法很简单 就是一张图 分几块 第一张占几块 从哪开始&#xff1b;第二张… plt.subplot() # 打开一个窗口 import ma…

Redis数据类型简介

目录 1、字符串(Strings) 1.1、底层实现 1.2、基本命令 1.3、应用场景 2、列表(Lists) 2.1、底层实现 2.2、基本命令 2.3、应用场景 3、集合(Sets) 3.1、底层实现 3.2、基本命令 3.3、应用场景 4、哈希(Hashes) 4.1、底层实现 4.2、基本命令 4.3、应用场景 5、…

Caché数据库简要记录

前一阵子&#xff0c;实施的小伙伴找过来问我用过 Cach 数据库吗&#xff1f;我当时有点懵&#xff1f;难道是 redis、memcached 之流&#xff1f;后来我特意去搜索了一下&#xff0c;还真是有一款数据库叫做 Cach Database。 这里做一下简单的记录吧&#xff0c;Cach 在医疗系…

Mine Goose Duck 0.1版本发布

我本次制作了一款MC版的Goose Goose Duck模组&#xff0c;游戏版本是Forge 1.19.2。 1.身份物品 熟悉鹅鸭杀的朋友都知道游戏中含有许多的身份&#xff0c;有好人、坏人、中立三个阵营&#xff0c;本次我加入了原作中的一些基本角色&#xff1a; 1.警长 你可以杀死怪物但错…

DFS(三)电话号码的字母组合

数组版本 哈希版本&#xff1a; 一、17. 电话号码的字母组合 给定一个仅包含数字 2-9 的字符串&#xff0c;返回所有它能表示的字母组合。答案可以按 任意顺序 返回。 给出数字到字母的映射如下&#xff08;与电话按键相同&#xff09;。注意 1 不对应任何字母。 示例 1&#x…

Elasticsearch7.8.0版本高级查询——范围查询文档

目录一、初始化文档数据二、范围查询文档2.1、概述2.2、示例一、初始化文档数据 在 Postman 中&#xff0c;向 ES 服务器发 POST 请求 &#xff1a;http://localhost:9200/user/_doc/1&#xff0c;请求体内容为&#xff1a; {"name":"张三","age"…

Git的安装与使用

目录 一、简介 1. Git 是什么&#xff1f; 2. 集中式和分布式 二、Git 环境搭建 1. Linux 下安装 2. Windows 下安装 三、创建版本库 四、把文件添加到版本库 1. 添加并提交 2. 仓库状态 3. 版本回退 &#xff08;1&#xff09;查看提交日志 &#xff08;2&#xff0…

量化交易-因子有效性分析

量化交易-因子有效性分析一、 因子的 IC 分析2. 信息系数3. 举例4. 因子处理4.1 去极值4.2 标准化4.3 市值中性化一、 因子的 IC 分析 判断因子与收益的相关性强度 分析结果 因子平均收益IC meanIC stdIC > 0.02&#xff1a;IC大约0.02的比例&#xff0c;越大越严格IR&…

leetcode刷题记录总结-1. 数组

文章目录一、二分查找[704. 二分查找](https://leetcode.cn/problems/binary-search/)题解小结[35. 搜索插入位置](https://leetcode.cn/problems/search-insert-position/)题解1&#xff1a;暴力解法题解2&#xff1a;二分法[34. 在排序数组中查找元素的第一个和最后一个位置]…

Day865.基础架构 -MySQL实战

基础架构&#xff1a;一条SQL查询语句是如何执行的 Hi&#xff0c;我是阿昌&#xff0c;今天学习记录的关于基础架构&#xff1a;一条SQL查询语句是如何执行的的内容。 经常说&#xff0c;看一个事儿千万不要直接陷入细节里&#xff0c;应该先鸟瞰其全貌&#xff0c;这样能够…

01-使用Camera Raw滤镜调色

1.需求展示 点击下载图片素材 原图 调色后, 具有电影感 2.操作步骤 1.打开原图 1.我使用的是ps2018, 打开原图, 图层名字可以自定义 2.拷贝底片建立一个新图层 养成好习惯, 每种操作都建立新图层来进行, 这样如果修坏了, 直接把该图层删除就行了, 还原图片比较快捷 3…

[QMT]03-让QMT支持从Tushare获取数据

QMT安装python第三方库为了兼容性&#xff0c;需要本地使用python3.6.8版本&#xff0c;因为刚刚下载的QMT python版本就是3.6.8.如果你本地有其他python版本的话&#xff0c;建议使用虚拟环境操作。这样不会影响你原有的python版本以及已经安装的第三方库。因为一机装多版本的…