二十一、解释器模式——解析表达式和脚本

深入解析C#中的解释器模式:原理与应用 首先,我们需要定义一个抽象表达式类,所有的具体表达式类都需要继承这个类,并实现解释方法。解释器模式是一种通过定义文法规则和解释逻辑,将复杂的表达式解析和执行的设计模式。在C#中实现该模式时,通过抽象类和继承关系,将不同的语法规则封装为独立的类,使得系统更加灵活、易于扩展和维护。尽管解释器模式存在类数量激增和性能问题的潜在缺点,但在处理简单表达式和领域特定语言时,它是一种非常有效的解决方案。理解并掌握解释器模式,可以帮助开发者在需要灵活解析和执行规则时,做出更好的架构设计。 阅读详情


设计模式是面向问题、场景而总结产生的设计思路。是解决问题的套路。23 种经典的设计模式。它们又可以分为三大类:创建型、结构型、行为型。

行为型 包含了 观察者模式、模板模式、策略模式、职责链模式、状态模式、迭代器模式、 访问者模式、备忘录模式、命令模式、解释器模式、中介模式 总共11种模式。

解释器模式

给定一个语言之后,解释器模式可以定义出其文法的一种表示,并同时提供一个解释器。客户端可以使用这个解释器来解释这个语句中的表达式。

  • 抽象表达式角色(Expression):声明一个所有的具体表达式角色都需要实现的抽象接口。这个接口主要是一个interpret()方法,称作解释操作。
  • 终结符表达式角色(Terminal Expression):实现了抽象表达式角色所要求的接口,主要是一个interpret()方法;文法中的每一个终结符都有一个具体终结表达式与之相对应。
  • 非终结表达式角色(Nonterminal Expression):文法中的每一条规则都需要一个具体的非终结符表达式。比如公式R=R1+R2中,+就是非终结符,解析+的解释器就是一个非终结符表达式
  • 环境角色(Context):这个角色的任务一般是用来存放文法中各个终结符所对应的具体值,很多情况下我们使用Map来充当环境角色就够了。

1.Expression

定义表达式,有2中子类,一类是变量型,从map中就可以取值了。一类是符号型,这里支持加减。

public abstract class Expression {
    public abstract int interpreter(HashMap<String,Integer> var);
}

public class SymbolExpression extends Expression{

    protected Expression left;
    protected Expression right;

    public SymbolExpression(Expression left, Expression right) {
        this.left = left;
        this.right = right;
    }

    @Override
    public int interpreter(HashMap<String, Integer> var) {
        return 0;
    }
}

public class AddExpression extends SymbolExpression{
    public AddExpression(Expression left, Expression right) {
        super(left, right);
    }

    @Override
    public int interpreter(HashMap<String, Integer> map) {
        return super.left.interpreter(map) + super.right.interpreter(map);
    }
}

public class MinusExpression extends SymbolExpression{
    public MinusExpression(Expression left, Expression right) {
        super(left, right);
    }

    @Override
    public int interpreter(HashMap<String, Integer> map) {
        return super.left.interpreter(map) - super.right.interpreter(map);
    }
}

2.Caculator

Caculator 将字符串解析为表达式。其方法是将字符组合成一个复杂的表达式对象,每个对象的left和right都是表达式。

public class Calculator {
    public Expression parse(String expStr) { // expStr = a+b
        Stack<Expression> stack = new Stack<>();

        char[] charArray = expStr.toCharArray();// [a, +, b]

        Expression left = null;
        Expression right = null;

        //针对不同的情况,做处理
        for (int i = 0; i < charArray.length; i++) {
            switch (charArray[i]) {
                case '+': //
                    left = stack.pop();
                    right = new VarExpression(String.valueOf(charArray[++i]));
                    stack.push(new AddExpression(left, right));
                    break;
                case '-': //
                    left = stack.pop();
                    right = new VarExpression(String.valueOf(charArray[++i]));
                    stack.push(new MinusExpression(left, right));
                    break;
                default:
                    stack.push(new VarExpression(String.valueOf(charArray[i])));
                    break;
            }
        }
        return stack.pop();
    }
}

3.Main

public class Main {
    public static void main(String[] args) throws IOException {
        String expStr = new BufferedReader(new InputStreamReader(System.in)).readLine();
        HashMap<String,Integer> map = new HashMap<>();
        for(char c:expStr.toCharArray()) {
            if(c!='+'&&c!='-'&&!map.containsKey(String.valueOf(c))){
                String val = new BufferedReader(new InputStreamReader(System.in)).readLine();
                map.put(String.valueOf(c),Integer.valueOf(val));
            }
        }
        Calculator calculator = new Calculator();
        Expression expression = calculator.parse(expStr);
        System.out.println("运算结果:" + expStr + "=" + expression.interpreter(map));
    }
}

运行结果:

a+b+c
12
3
5
运算结果:a+b+c=20

总结

解释器模式代码实现的核心思想,就是将语法解析的工作拆分到各个小类中,以此来避免大而全的解析类。一般的做法是,将语法规则拆分成一些小的独立的单元,然后对每个单元进行解析,最终合并为对整个语法规则的解析。

设计模式系列在github上有一个开源项目,主要是本系列博客的demo代码。https://github.com/forestnlp/designpattern
如果您对软件开发、机器学习、深度学习有兴趣请关注本博客,将持续推出Java、软件架构、深度学习相关专栏。
您的支持是对我最大的鼓励。

C++设计模式——Interpreter解释器模式 解释器模式是一种行为型设计模式,它用于定义一个语言的文法并解析语言中的表达式,使开发者可以实现自定义语言,并通过解释器对语言中的表达式进行解析和执行。解释器模式主要用于解决对特定表达式的解析与执行,它定义了一种解释器的语法规则,通过解释器来解析并执行自定义的语言表达式。通过解释器,可以将复杂的语言解析问题拆分为简单的表达式解析,并且可以通过增加新的解释器对象来扩展语言的功能。自然语言解释器:比如翻译软件,可以将一种语言的句子解释为另一种语言。 阅读详情

相关推荐

脚本解析器 脚本引擎

c 语言模式脚本解析器,脚本执行不是其目的。其作用是对PE文件进行编辑。暂且不论。 现在仅支持 if关键字、以及一些+-/* && || 等常规操作。 操作符支持优先级,但不支持括号。 今天调试成功,先放出来,让大家看看。高手飘过 对脚本的解析采用二叉树存储。详见代码。 2010.4.21增加while for += -= *= /= 支持。 2010.4.22 支持for的的死循环 以及其他变型。 for(;;) for(a=0;;) for(;;a+=3) 等 脚本从文件中得到。 支持单行、多行注释 测试字符串类型 希望对学习脚本的人有所帮助。 今天测试循环 发现效率实在令人郁闷。先不管了(感觉递归引起的) 代码照样没释放内存,存在内存泄露问题。

脚本语言解析

查找文件夹中包含特定字符串的文件这是一个 Linux 命令,用于查找文件夹中包含特定字符串的文件。具体来说,该命令包括以下几个部分:ls:列出当前文件夹下的所有文件和文件夹。|:管道符号,用于将前一个命令的输出结果作为后一个命令的输入。grep:字符串查找命令,用于在输入的文本中查找包含指定字符串的行。interceptor:要查找的字符串,即文件名中包含“interceptor”的文件。最终输出的结果是当前文件夹下所有符合条件(文件名包含“interceptor”)的文件名。

DPJ0012的博客 430

脚本引擎 脚本解析器

author:ListenWind mail:gangyilovevc@163.com c 语言模式脚本解析器,脚本执行不是其目的。其作用是对PE文件进行编辑。暂且不论。 现在仅支持 if关键字、以及一些+-/* && || 等常规操作。 操作符支持优先级,但不支持括号。 今天调试成功,先放出来,让大家看看。高手飘过 对脚本的解析采用二叉树存储。详见代码。 2010.4.21增加while for += -= *= /= 支持。 2010.4.22 支持for的的死循环 以及其他变型。 for(;;) for(a=0;;) for(;;a+=3) 等 脚本从文件中得到。 支持单行、多行注释 测试字符串类型 希望对学习脚本的人有所帮助。 今天测试循环 发现效率实在令人郁闷。先不管了(感觉递归引起的) 代码照样没释放内存,存在内存泄露问题。

油猴脚本全解析——让你的浏览器更强大

不同的脚本有不同的功能和用法,因此在使用之前,最好先阅读脚本的说明文档或查看其源代码以了解它是如何工作的。油猴脚本(Tampermonkey)是一款流行的浏览器扩展程序,它允许用户安装和运行自定义的JavaScript脚本,以增强或修改网页的功能。打开Google浏览器或其他支持扩展的浏览器(手机推荐X浏览器)访问Tampermonkey的官方网站,下载并安装适用于你的浏览器的扩展程序。在Tampermonkey的管理面板中,你可以看到已安装的脚本列表,以及每个脚本的详细信息。

wujiayu31415的博客 1万+

表达式解析器

NULL 博文链接:https://drift-ice.iteye.com/blog/718592

C++坦克大战源代码

【代码】C++坦克大战源代码。

强国豪,林中霖 2609

Shell全解析(一):Shell脚本

文章目录一、前言二、Shell脚本2.1 从Shell到Shell脚本2.2 编写Shell脚本2.3 执行Shell脚本三、Shell脚本内对参数的操作四、Shell脚本中常见命令4.1 Shell echo命令4.1.1 echo中直接输出普通字符串4.1.2 echo中显示转义字符4.1.3 echo中读取输入4.1.4 echo换行操作4.1.4.1 默认每一个echo占一行的4.1.4.2 输出中增加一个换行4.1.4.3 输出中去掉原有换行4.1.5 将echo结果定向至文件4.1.6 echo

毛毛的专栏 1万+

新手自己动手设置3D-slicer中文版(超详细图文)

3DSlicer是一个开源的免费软件,用于医学图像分析(包括配准和交互式分割)和可视化(包括3D渲染)以及用于图像引导治疗研究的软件平台。复制qm文件,粘贴于3D-slicer文件相关文件夹内,\bin\translations\。打开3dslicer,edit菜单下Application Settings,支持的操作系统:Linux,Mac OSX和Windows。本人英语太差,所以第一反应就是中文版,官网无中文版下载,下载后不能直接使用,必须要发布成qm文件;qm文件已经生成,位于ts文件同一文件夹。

linjianping513的博客 9854

链接脚本(Linker Script)解析

链接脚本实质上是一个规则文件,程序员用来指挥链接器工作的,当我们编写了多个C文件,调用了大量库,如何编译成一个可执行文件呢?这是链接脚本文件就会发挥他的作用了:将多个目标文件(xx.o)、库文件(xx.a)、动态库(.so)等等链接成一个可执行文件。

保持一颗永远好奇、勇于探索的心 1万+

ML307A模组通过MQTT协议接入OneNET平台的AT指令全解析

本文详细解析了ML307A模组通过MQTT协议接入OneNET平台的完整AT指令流程。从平台侧的产品创建、设备添加,到核心难点连接密钥的计算方法,再到模组侧的基础网络附着、MQTT连接配置、数据收发及调试排错,提供了手把手的实战指南,帮助开发者快速实现物联网设备上云。

weixin_29240711的博客 493

VSCode+Pyside6开发环境配置全攻略:从安装到实战UI设计

本文提供了一份详细的VSCode与Pyside6集成开发环境配置指南。从创建Python虚拟环境、安装必备VSCode插件,到深度配置PYQT Integration插件以打通Qt Designer与代码编译,最后通过一个待办事项应用实战演示了从UI设计到业务逻辑绑定的完整工作流,旨在帮助开发者建立高效、可维护的GUI开发环境。

qq_27496129的博客 981

《游戏脚本的设计与开发》-第一章 读取和解析一个脚本文件

上一篇《游戏脚本的设计与开发》-序中我介绍了游戏脚本的基本概念和准备工作,本篇来说说具体如何解析一个脚本 所谓解析脚本,就是按照自己定义的语法,将每一个脚本命令还原成不同的代码逻辑进行执行,比如,我规定绘制一个矩形的脚本 draw rect和一个绘制圆的脚本draw arc那么,当我读取到了字符串“draw rect”的时候,就在屏幕上画一个矩形,读取到了字符串“draw arc”的时候,就在屏...

20386053 505

V-REP(Cooprliesim EDU)自学笔记 实现UR5机械臂末端按轨迹移动

V-REP(Cooprliesim EDU)自学笔记 实现UR5机械臂末端按轨迹移动

xu_white的博客 7583

C++ 设计模式——解释器模式

解释器模式是一种特定于语言的模式,用于定义如何评估语言的句法或表达式。它适用于某些重复出现的问题,可以将一个需要解释执行的语言中的句子表示为一个抽象的语法树。这种模式通常被用于开发编程语言解释器或简单的脚本引擎。

慢慢记录,慢慢更新。 3465

YOLOv11 知识蒸馏完整实战:Teacher–Student 训练策略与性能飞跃

在self.alpha = alpha # 蒸馏损失权重self.temperature = temperature # 温度系数,控制分布平滑度# 输出分布蒸馏(KL散度损失)# 中间特征蒸馏(MSE损失,对齐中间层特征)# 总蒸馏损失知识蒸馏是YOLOv11在“小模型高性能部署”场景的“破局之法”——它让小模型能“站在大模型的肩膀上”,兼具速度与精度。从损失函数定义到多阶段训练,再到实战落地,本教程已为你铺就了一条清晰的路径。

m0_64661770的博客 141

openclaw 保姆级部署与核心玩法解析:国产DeepSeek模型 + 飞书

OpenClaw是一款功能强大的开源AI个人助理,支持全平台私有化部署,数据完全本地掌控。它不仅可通过聊天窗口直接操控电脑(安装软件、创建项目),还支持接入飞书等主流通讯工具,化身24小时在线的智能助理。本文提供了从零开始的详细部署教程,涵盖基础安装、模型配置(如GLM-4、DeepSeek)到飞书集成的完整实战指南,助你将这款“核动力”AI助手快速融入日常工作流。

甘蓝的专栏 2999

LangFlow Interpreter解释器模式解析表达式

LangFlow通过解释器模式将图形化工作流转化为可执行的语义表达式,用户拖拽节点即在构建AI程序。系统后端基于DAG拓扑排序、动态实例化与上下文传递,实现低代码、高灵活性的LLM应用开发,让非技术人员也能快速验证AI创意。

weixin_30021053的博客 1012

AutoSAR系列讲解(入门篇)4.6-BSW的Watchdog功能

BSW的看门狗功能

雪云飞星的博客 1万+

解释器模式和典型应用案例

解释器模式是一种行为设计模式,用于定义一种语言的文法,并提供一个解释器来解释该语言中的句子。它通常用于处理类似脚本语言、正则表达式、数学表达式等需要解析的场景。语言解析:如正则表达式、SQL、模板语言等。表达式计算:如数学表达式、逻辑表达式等。脚本执行:如JavaScript、Python等脚本语言的执行引擎。在框架中,解释器模式通常用于处理复杂的语法解析和动态执行逻辑。通过将文法规则分解为简单的表达式类,解释器模式使得系统更加灵活和可扩展。

weixin_44424997的博客 1129

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

解释器模式原理剖析和Spring中的应用

是一种行为型设计模式,它定义了一种语言的文法表示,并提供了一个解释器来处理该文法的表达式。解释器模式可以用于构建**语法解释器**,例如计算器、简单编程语言的解释器等。解释器模式 在 Spring 框架中的应用并不像某些行为型模式(如策略模式、工厂模式)那样直接、明显,然而在一些高级功能或组件的实现中,解释器模式的思想仍然被应用到了。尤其是在需要处理表达式、规则解析或动态解析配置的场景中

欢迎每一位朋友不吝赐教,无论是宝贵的建议还是中肯的批评,都将是我前进路上不可或缺的灯塔 1172

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

探索 C# 中的解释器模式:解析与执行语言的秘密

解释器模式的核心是为特定语言或文法创建解释器,使得可以解析和执行特定的输入。需要根据自定义规则解析特定格式的文本。例如简单的数学计算或逻辑表达式的解析与执行。在应用程序中嵌入自定义脚本,允许用户自定义一些行为。抽象表达式(AbstractExpression):定义了表达式解释接口。终结符表达式(TerminalExpression):实现特定的解释方法,用于处理具体的输入。非终结符表达式(NonTerminalExpression):处理更复杂的规则,通常由其他表达式组合而成。

hy_4377的博客 932

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

23、解释器模式应用案例

解释器模式定义了一个语言的文法,并且构建了一个解释器来解释该语言中的句子。这个模式使客户端可以使用特定的表达式语言来发出请求,而无需直接了解这种语言的底层实现。解释器模式通常用于处理一些复杂语言或者表达式,并且希望将这些语言或表达式转换成一些中间表示形式进行处理的场景中。通过解释器模式,成功地将一个复杂的表达式语言转换为一个易于理解和执行的中间表示形式。在这个例子中,我们定义了一个简单的数学表达式语言,并创建了一个解释器来解释和执行该语言中的表达式。灵活性:通过定义不同的表达式类,可以轻松地扩展和修改语言。

专业深耕,技术前沿 1315

Unity实现解释器模式

(Interpreter Pattern)是一种行为型设计模式,它为某种语言定义一个语法表示,并实现一个解释器来解释该语言中的句子。如果语法规则复杂,解析效率可能会较低,建议使用更高效的解析器(如正则表达式或编译器生成的解析器)。当语法规则变得复杂时,终结符和非终结符类的数量会快速增加,导致代码难以维护。通过解释器模式,可以让Unity中的动态规则解析更加灵活,同时也为游戏逻辑的扩展提供了强大的支持。在Unity中,解释器模式通常结合脚本语言(如Lua)或配置文件解析,与游戏逻辑结合使用。

小宝哥Code的专栏 679

解释器模式

喜欢内容的话欢迎!!

码事漫谈 1788

设计模式之解释器模式

解释器模式是一种强大的设计模式,它通过将复杂的语言或表达式转换为一系列简单的规则,并通过解释器逐个解释和执行这些规则,从而实现了对语言或表达式的解析和操作。解释器模式适用于需要解释和处理特定语言或表达式的场景,如编程语言解释器、查询语言解析器、正则表达式解析器等。虽然解释器模式具有易于扩展、灵活性高和代码清晰等优点,但也存在类膨胀、性能问题和实现复杂等缺点。因此,在使用解释器模式时,需要根据具体的应用场景和需求进行权衡和选择。

一个老Java开发的自白 1679
上一篇: 二十、中介模式——由网状关系变为星形关系
下一篇: 二十二、状态模式——不同形态下的绿巨人
悟空学编程
博客等级 码龄12年 32粉丝 123原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

悟空学编程

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值