解释器模式(interpreter)

简介: 解释器模式(interpreter)

一、什么是解释器模式?

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

如果在一个系统中需要匹配字符的需求在软件的很多地方都会使用,而且行为之间都非常类似,过去的做法是针对特定的需求,编写特定的函数,比如判断Email、匹配电话号码等等,与其为每一个特定需求都写一个算法函数,不如使用一种通用的搜索算法来解释执行一个正则表达式,该正则表达式定义了待匹配字符串的集合。而所谓的解释器模式,正则表达式就是他的一种应用,解释器为正则表达式定义了一个文法,如果表示一个特定的正则表达式,以及如何解释这个正则表达式。


e87026fe4f2be466a3cc3b9649492c63.png


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


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


TerminalExpression:终结符表达式,实现与文法中的终结符相关联的解释操作。


NonterminalExpression:非终结符表达式,为文法中的非终结符实现解释操作。对文法中每一条规则R1、R2……Rn都需要一个具体的非终结符表达式类。


二、有什么优点吗?

满足依赖倒转原则,对文法的扩展和维护带来方便


三、有什么缺点?

文法中的每一条规则至少定义了一个类,包含许多文法可能难以管理和维护;


四、什么时候应用呢?

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


五、代码展示

场景:让小菜用QB或者手机说明书中定义的规则去编写音乐程序,让一段文法去让QB或手机去翻译成具体的指令来执行。


①、解释器模式


af28081534eb8b4a31f9ca26790ca362.png


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

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

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

class TerminalExpression : AbstractExpression
{
    public override void Interpret(Context context)
    {
        Console.WriteLine("终端解释器");
    }
}

NonterminalExpression(非终结符表达式),为文法中的非终结符实现解释操作。

class NonterminalExpression:AbstractExpression
{
    public override void Interpret(Context context)
    {
        Console.WriteLine("非终端解释器");
    }
}

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

class Context
{
        private string input;
        public string Input
        {
            get { return input; }
            set { input = value; }
        }
        private string output;
        public string Output
        {
            get { return output; }
            set { output = value; }
        }
}

客户端

Context context = new Context();     
IList<AbstractExpression> list = new List<AbstractExpression>();
list.Add(new TerminalExpression());
list.Add(new NonterminalExpression());
list.Add(new TerminalExpression());
list.Add(new TerminalExpression());
foreach (AbstractExpression  exp in list)
{
    exp.Interpret(context);
}
Console.ReadKey();
目录
相关文章
|
前端开发 JavaScript Java
从前端到后端:构建全栈应用的技术路线探析
【2月更文挑战第3天】本文通过探讨前端和后端开发的基本概念和技术要点,深入剖析了构建全栈应用的技术路线。从前端的HTML、CSS和JavaScript,到后端的Java、C和数据库,我们将带您逐步了解如何将不同技术组合起来实现高效、稳定的全栈应用。
489 7
|
3月前
|
人工智能 弹性计算 安全
2026阿里云权益中心个人和企业优惠权益解析,上云优选,普惠好价
阿里云权益中心2026年持续深化“普惠+创新”双轮驱动,为全球开发者和企业提供全方位上云支持。涵盖个人开发者、企业、高校及出海场景,推出140+款免费试用产品、99元/年长效云服务器、7000万大模型tokens免费体验、5亿企业迁云补贴等权益。同时提供学生专属优惠、AI产品免费试用、出海企业专属10万元补贴及全球化合规支持,通过差异化配置满足多元需求,助力用户低成本实现业务提效与数字化转型。
|
3月前
|
存储 弹性计算 人工智能
2026年阿里云轻量、ECS 与 GPU云服务器租用收费标准说明
阿里云服务器涵盖轻量应用服务器、云服务器 ECS 及 GPU 服务器三大类,适配从个人开发到企业核心业务的不同需求,价格差异显著。以下结合最新收费信息,用通俗语言梳理各机型配置与价格,包含优惠活动、续费规则及附加资源成本,帮助用户精准把控预算。
2026年阿里云轻量、ECS 与 GPU云服务器租用收费标准说明
|
4月前
|
运维 供应链 监控
MES制造执行系统的核心代码,基于Spring Boot+Vue.js开发
MES系统程序源码是制造执行系统的核心代码,基于Spring Boot+Vue.js开发,涵盖生产、设备、库存、质检等全流程管理功能,助力企业数字化转型。
224 1
|
机器学习/深度学习 人工智能 决策智能
推理速度开挂!谷歌推出 Gemini 2.5 Flash:在保持Gemini 2.5精度的同时,延迟降低到竞品的1/3
谷歌最新推出的Gemini 2.5 Flash AI模型在保持低延迟和成本效益的同时,通过引入思考能力为开发者解锁了智能代理构建、代码辅助等新应用场景。
482 1
推理速度开挂!谷歌推出 Gemini 2.5 Flash:在保持Gemini 2.5精度的同时,延迟降低到竞品的1/3
|
11月前
|
人工智能 Go
[go]Slice 切片原理
本文详细介绍了Go语言中的切片(slice)数据结构,包括其定义、创建方式、扩容机制及常见操作。切片是一种动态数组,依托底层数组实现,具有灵活的扩容和传递特性。文章解析了切片的内部结构(包含指向底层数组的指针、长度和容量),并探讨了通过`make`创建切片、基于数组生成切片以及切片扩容的规则。此外,还分析了`append`函数的工作原理及其可能引发的扩容问题,以及切片拷贝时需要注意的细节。最后,通过典型面试题深入讲解了切片在函数间传递时的行为特点,帮助读者更好地理解和使用Go语言中的切片。
360 0
|
缓存 开发工具 开发者
鸿蒙NEXT开发App相关工具类(ArkTs)
这段代码展示了一个名为鸿蒙NEXT开发 `AppUtil` 的工具类,主要用于管理鸿蒙应用的上下文、窗口、状态栏、导航栏等配置。它提供了多种功能,例如设置灰阶模式、颜色模式、字体类型、屏幕亮度、窗口属性等,并支持获取应用包信息(如版本号、包名等)。该工具类需在 UIAbility 的 `onWindowStageCreate` 方法中初始化,以便缓存全局变量。代码由鸿蒙布道师编写,适用于鸿蒙系统应用开发,帮助开发者更便捷地管理和配置应用界面及系统属性。
404 0
鸿蒙NEXT开发App相关工具类(ArkTs)
|
存储 编解码 搜索推荐
课时10:阿里云视频服务
阿里云视频服务Apsara Video为企业提供一站式视频解决方案,涵盖开发、上传、转码、存储、分发和播放全流程。平台支持点播、直播等业务,零编码搭建快速高效,具备窄带高清、画质重生等先进技术,确保高质量视频传输。同时,丰富的安全防护工具保障内容安全,按需付费模式降低成本,助力企业轻松构建个性化视频应用。
391 0
|
网络协议 Shell Go
Socks5代理协议与Golang实现
本文主要讲解了SOCKS5协议以及golang实现相关内容
777 1
|
安全 Java fastjson