乐在其中设计模式(C#) - 解释器模式(Interpreter Pattern)

C#设计模式-解释器模式(Interpreter Partten) 含义:提供了评估语言的语法或表达式的方式这种模式实现了一个表达式接口,该接口解释一个特定的上下文。这种模式被用在 SQL 解析、符号处理引擎等。 优点:1.可扩展性比较好,灵活。 2.增加了新的解释表达式的方式。 3.易于实现简单文法。 缺点:1.可利用场景比较少。 2.对于复杂的文法比较难维护。 ... 阅读详情
[索引页]
[源码下载]


乐在其中设计模式(C#) - 解释器模式(Interpreter Pattern)


作者: webabcd


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


示例
有一个Message实体类,某个类对它的操作有Get()方法。现在要求用具有某一规则的中文语法来执行这个操作。



MessageModel
using  System;
using  System.Collections.Generic;
using  System.Text;

namespace  Pattern.Interpreter
{
    
/// <summary>
    
/// Message实体类
    
/// </summary>

    public class MessageModel
    
{
        
/// <summary>
        
/// 构造函数
        
/// </summary>
        
/// <param name="msg">Message内容</param>
        
/// <param name="pt">Message发布时间</param>

        public MessageModel(string msg, DateTime pt)
        
{
            
this._message = msg;
            
this._publishTime = pt;
        }


        
private string _message;
        
/// <summary>
        
/// Message内容
        
/// </summary>

        public string Message
        
{
            
get { return _message; }
            
set { _message = value; }
        }


        
private DateTime _publishTime;
        
/// <summary>
        
/// Message发布时间
        
/// </summary>

        public DateTime PublishTime
        
{
            
get { return _publishTime; }
            
set { _publishTime = value; }
        }

    }

}


SqlMessage
using  System;
using  System.Collections.Generic;
using  System.Text;

namespace  Pattern.Interpreter
{
    
/// <summary>
    
/// Sql方式操作Message
    
/// </summary>

    public class SqlMessage
    
{
        
/// <summary>
        
/// 获取Message
        
/// </summary>
        
/// <returns></returns>

        public static List<MessageModel> Get()
        
{
            List
<MessageModel> l = new List<MessageModel>();
            l.Add(
new MessageModel("SQL方式获取Message", DateTime.Now));

            
return l;
        }

    }

}


Context
using  System;
using  System.Collections.Generic;
using  System.Text;

namespace  Pattern.Interpreter
{
    
/// <summary>
    
/// Context
    
/// </summary>

    public class Context
    
{
        
private string _input;
        
private string _output;

        
/// <summary>
        
/// 构造函数
        
/// </summary>
        
/// <param name="input">输入内容</param>

        public Context(string input)
        
{
            
this._input = input;
        }


        
/// <summary>
        
/// 输入内容
        
/// </summary>

        public string Input
        
{
            
get { return _input; }
            
set { _input = value; }
        }


        
/// <summary>
        
/// 输出内容
        
/// </summary>

        public string Output
        
{
            
get { return _output; }
            
set { _output = value; }
        }

    }

}


AbstractExpression
using  System;
using  System.Collections.Generic;
using  System.Text;

namespace  Pattern.Interpreter
{
    
/// <summary>
    
/// 抽象公式(AbstractExpression)
    
/// </summary>

    public abstract class AbstractExpression
    
{
        
/// <summary>
        
/// 解释Context的方法
        
/// </summary>
        
/// <param name="context">context</param>

        public void Interpret(Context context)
        
{
            
if (String.IsNullOrEmpty(context.Input))
            
{
                
return;
            }


            context.Output 
+= GetCSharp(context.Input);
        }


        
/// <summary>
        
/// 获得输入内容所对应的C#代码
        
/// </summary>
        
/// <param name="source">source</param>
        
/// <returns></returns>

        private string GetCSharp(string source)
        
{
            
string csharp = "";
            
string word = "";

            
// 从输入内容中取得要解释的词
            word = GetWord(source);

            
// 从字典中找到word所对应的C#代码
            GetDictionary().TryGetValue(word, out csharp);

            
return csharp;
        }


        
/// <summary>
        
/// 从输入内容中取得要解释的词
        
/// </summary>
        
/// <param name="source">source</param>
        
/// <returns></returns>

        public abstract string GetWord(string source);

        
/// <summary>
        
/// 获取字典
        
/// </summary>
        
/// <returns></returns>

        public abstract Dictionary<string, string> GetDictionary();
    }

}


DatabaseExpression
using  System;
using  System.Collections.Generic;
using  System.Text;

using  System.Text.RegularExpressions;

namespace  Pattern.Interpreter
{
    
/// <summary>
    
/// 终端公式(TerminalExpression)分析与数据库相关的
    
/// </summary>

    public class DatabaseExpression : AbstractExpression
    
{
        
/// <summary>
        
/// 从输入内容中取得要解释的词
        
/// </summary>
        
/// <param name="source">source</param>
        
/// <returns></returns>

        public override string GetWord(string source)
        
{
            MatchCollection mc;
            Regex r 
= new Regex(@"/{(.*)/}");
            mc 
= r.Matches(source);

            
return mc[0].Groups[1].Value;
        }


        
/// <summary>
        
/// 获取与数据库相关的字典
        
/// </summary>
        
/// <returns></returns>

        public override Dictionary<string, string> GetDictionary()
        
{
            Dictionary
<string, string> d = new Dictionary<string, string>();

            d.Add(
"数据库", "Sql");

            
return d;
        }

    }

}


ObjectExpression
using  System;
using  System.Collections.Generic;
using  System.Text;

using  System.Text.RegularExpressions;

namespace  Pattern.Interpreter
{
    
/// <summary>
    
/// 终端公式(TerminalExpression)分析与对象相关的
    
/// </summary>

    public class ObjectExpression : AbstractExpression
    
{
        
/// <summary>
        
/// 从输入内容中取得要解释的词
        
/// </summary>
        
/// <param name="source">source</param>
        
/// <returns></returns>

        public override string GetWord(string source)
        
{
            MatchCollection mc;
            Regex r 
= new Regex(@"/[(.*)/]");
            mc 
= r.Matches(source);

            
return mc[0].Groups[1].Value;
        }


        
/// <summary>
        
/// 获取与对象相关的字典
        
/// </summary>
        
/// <returns></returns>

        public override Dictionary<string, string> GetDictionary()
        
{
            Dictionary
<string, string> d = new Dictionary<string, string>();

            d.Add(
"信息", "Message");

            
return d;
        }

    }

}


MethodExpression
using  System;
using  System.Collections.Generic;
using  System.Text;

using  System.Text.RegularExpressions;

namespace  Pattern.Interpreter
{
    
/// <summary>
    
/// 终端公式(TerminalExpression)分析与方法相关的
    
/// </summary>

    public class MethodExpression : AbstractExpression
    
{
        
/// <summary>
        
/// 从输入内容中取得要解释的词
        
/// </summary>
        
/// <param name="source">source</param>
        
/// <returns></returns>

        public override string GetWord(string source)
        
{
            MatchCollection mc;
            Regex r 
= new Regex(@"/((.*)/)");
            mc 
= r.Matches(source);

            
return mc[0].Groups[1].Value;
        }


        
/// <summary>
        
/// 获取与方法相关的字典
        
/// </summary>
        
/// <returns></returns>

        public override Dictionary<string, string> GetDictionary()
        
{
            Dictionary
<string, string> d = new Dictionary<string, string>();

            d.Add(
"获取", ".Get()");

            
return d;
        }

    }

}



client
using  System;
using  System.Data;
using  System.Configuration;
using  System.Collections;
using  System.Web;
using  System.Web.Security;
using  System.Web.UI;
using  System.Web.UI.WebControls;
using  System.Web.UI.WebControls.WebParts;
using  System.Web.UI.HtmlControls;

using  Microsoft.CSharp;
using  System.Reflection;
using  System.Text;
using  System.Collections.Generic;

using  Pattern.Interpreter;

public  partial  class  Interpreter : System.Web.UI.Page
{
    
protected void Page_Load(object sender, EventArgs e)
    
{
        
string chinese = "{数据库}[信息](获取)";
        Context context 
= new Context(chinese);

        List
<AbstractExpression> l = new List<AbstractExpression>();
        l.Add(
new DatabaseExpression());
        l.Add(
new ObjectExpression());
        l.Add(
new MethodExpression());

        
foreach (AbstractExpression exp in l)
        
{
            exp.Interpret(context);
        }


        Assembly assembly 
= Assembly.Load("Pattern.Interpreter");
        MethodInfo method 
= assembly.GetType("Pattern.Interpreter." + context.Output.Split('.')[0]).GetMethod(context.Output.Split('.')[1].Replace("()", ""));
        
object obj = method.Invoke(null, null);

        List
<MessageModel> m = (List<MessageModel>)obj;

        Response.Write(
"中文语法:" + chinese);
        Response.Write(
"<br />");
        Response.Write(
"解释后的C#代码:" + context.Output);
        Response.Write(
"<br />");
        Response.Write(
"执行结果:" + m[0].Message + " " + m[0].PublishTime.ToString());
    }

}


运行结果
中文语法:{数据库}[信息](获取)
解释后的C#代码:SqlMessage.Get()
执行结果:SQL方式获取Message 2007-5-1 8:48:07


参考
http://www.dofactory.com/Patterns/PatternInterpreter.aspx


OK
[源码下载]
C# 解释器模式实现 使用 C# 实现解释器模式,需要定义抽象语法树和实现语法解析,并通过执行语法树来得到最终结果。解释器模式是一种行为型设计模式,通过对语言的文法规则进行解析,来定义一个解释器。可以看到,这个文法包含两种规则,一个是数字规则,另一个是表达式规则。表达式规则包含一个运算符和一个数字,也可以是另一个表达式。为了实现解释器模式,我们需要根据规则来解析字符串,构建对应的抽象语法树,并使用该树来执行表达式。方法中,针对 “1 + 2 - 3” 字符串,构建出语法树,并通过执行语法树来计算结果。,分别表示数字和运算符。 阅读详情

相关推荐

C#设计模式教程(16):解释器模式

解释器模式是一种设计模式,用于定义一种语言的文法,并建立一个解释器来解释该语言中的句子。抽象表达式(Abstract Expression):定义解释操作的接口,通常是一个抽象类或接口。具体表达式(Concrete Expression):实现抽象表达式中定义的接口。每一种规则都对应于一个具体的表达式类。上下文(Context):包含解释器之外的一些全局信息。客户端(Client):构建(或被给定)一个特定的语言句子,然后解释这个句子。

琅嬛福地 417

Linux C++ 058-设计模式之解释器模式

本节关键字:Linux、C++、设计模式、解释器模式 相关库函数:

Tianwx的博客 745

解释器(Interpreter),自定义语法(类C)

"程序语言"这门课的课程实验。 给一个自定义语法的语言写一个解释器(Interpreter),首先写了Parser,然后存入剖析树(Parse Tree)对象中,最后根据Parse Tree的结构执行程序,计算出结果。 语法如下: <prog> ::= program <decl seq> (1) begin <stmt seq> end <decl seq> ::= <decl> | <decl> <decl seq> (2) <stmt seq> ::= <stmt> | <stmt> <stmt seq> (3) <decl> ::= int <id list>; (4) <id list> ::= <id> | <id>, <id list> (5) <stmt> ::= <assign>|<if>|<loop>|<in>|<out> (6) <assign> ::= <id> = <exp>; (7) <if> ::= if <cond> then <stmt seq> end; (8) |if <cond> then <stmt seq> else <stmt seq> end; <loop> ::= while <cond> loop <stmt seq> end; (9) <input> ::= read <id list>; (10) <output> ::= write <id list>; (11) <cond> ::=<comp>|!<cond> (12) | [<cond> && <cond>] | [<cond> or <cond>] <comp> ::= (<op> <comp op> <op>) (13) <exp> ::= <fac>|<fac>+<exp>|<fac>-<exp> (14) <fac> ::= <op> | <op> * <fac> (15) <op> ::= <int> | <id> | (<exp>) (16) <comp op> ::= != | == | < | > | <= | >= (17) <id> ::= <let> | <let><id> | <let><int> (18) <let> ::= A | B | C | ... | X | Y | Z (19) <int> ::= <digit> | <digit><int> (20) <digit> ::= 0 | 1 | 2 | 3 | ... | 9 (21)

设计模式:解释器模式(C#、JAVA、JavaScript、C++、Python、Go、PHP)

解释器模式,它是一种行为型模式,它给定一门语言,定义其文法的一种表示,并定义一个解释器,这个解释器使用该表示来解释语言中的句子。解释器模式的主要目标是解决一些固定文法构建解释句子的解释器的问题。

web 448

C#实现scheme解释器

支持scheme语法包括lambda define cond set!等

简单的运算解释器例子(C#)

采用C#编写的一个解释简单的+-*/%运算的例子。研究解释器模型的朋友可以下载。其中包含说明文件以及UML图(PDF)

C# 设计模式(行为型模式):解释器模式

解释器模式(Interpreter Pattern)是一种行为型设计模式,用于定义一种语言的语法表示,并提供一个解释器来解释这些语法。它通常用于构建简单的语言处理器或解析器,将特定的业务规则转化为代码可理解的语法结构。在这种模式中,通过为语言中的每条规则定义一个类,解释器可以逐一解析输入并执行相应的操作。解释器模式包含以下几个核心角色:AbstractExpression(抽象表达式) 定义一个接口,提供解释操作。TerminalExpression(终结符表达式) 实现与语法规则中的终结符相关的操作。No

玉面小浪君的博客 1252

C#数学运算表达式解释器源码

C#数学运算表达式解释器,参考:http://blog.youkuaiyun.com/testcs_dn/article/details/37776937

【C#设计模式】23.解释器模式(Interpreter Pattern)【行为型】

1.1 动机(Motivate) 在软件构建过程中,如果某一特定领域的问题比较复杂,类似的模式不断重复出现,如果使用普通的编程方式来实现将面临非常频繁的变化。在这种情况下,将特定领域的问题表达为某种语法规则下的句子,然后构建一个解释器来解释这样的句子,从而达到解决问题的目的。 1.2 意图(Intent) 给定一个语言,定义它的文法的一种表示,并定义一种解释器,这个解释器使用该表示来解释语言中的句子。       ——《设计模式》GoF.........

星Yeah 的博客 1911

CMM解释器C#版

C#版CMM解释器、编译器,包括词法分析语法分析

【QGIS】PyCharm集成pyqgis的processing工具箱:环境配置与初始化实战

本文详细介绍了如何在PyCharm中配置QGIS的Python环境并成功集成其强大的Processing工具箱。文章核心解决了独立环境下导入processing模块失败、算法无法调用等常见难题,通过手动添加插件路径和执行关键初始化步骤,实现了在PyCharm中丝滑调用QGIS地理处理算法,从而将复杂的空间分析流程自动化。

weixin_28831399的博客 390

解释器模式(Interpreter Pattern)

设计模式 - 吕震宇 .NET设计模式系列文章 薛敬明的专栏 乐在其中设计模式(C#) 设计模式16:Interpreter Pattern(解释者模式) 本文翻译自:http://www.dofactory.com/Patterns/PatternInterpreter.aspx Define:Given a language, define a representati

jiangxinyu的专栏 1729

从原理到实战:ARS548 4D毫米波雷达数据处理与多模态融合全解析

本文深入解析了4D毫米波雷达ARS548的工作原理与数据处理全流程。从FMCW测距测速、MIMO虚拟天线阵列到点云生成的三步FFT处理,提供了详尽的Python代码实现。文章进一步探讨了与激光雷达、相机的多模态时空对齐与融合策略,并指导如何构建用于自动驾驶感知训练的多模态标注数据集,为相关算法工程师提供了从理论到实践的完整指南。

weixin_29161719的博客 364

C# 设计模式:第十九章 - 行为型模式 之 解释器模式(Interpreter Pattern)

解释器模式是一种行为型设计模式,它允许你为一种语言定义文法,并通过解释器来解析和执行该语言的句子。解释器模式的核心思想是将语言的文法表示为类结构,每个类负责解释语言中的某个部分。通过这种方式,你可以轻松地解析和执行复杂的表达式,而不需要手动编写大量的解析逻辑。在这章中,我们学习了解释器模式的基本概念、应用场景、实现方法以及注意事项。解释器模式允许你为一种语言定义文法,并通过解释器来解析和执行该语言的句子。计算器程序:如解析和计算数学表达式(如3 + 5 * 2查询语言解析器:如解析和执行查询语句(如。

caifox的博客 994

Ubuntu配置Qt Creator树莓派交叉编译环境一步到位

本文详细指导在Ubuntu系统上配置Qt Creator树莓派交叉编译环境。从工具链安装、sysroot创建到Qt库编译,逐步讲解如何搭建完整的ARMv7交叉编译工具链,实现高效开发树莓派应用。

1273

LiblibAI新手教程:从零开始训练你的第一个LoRA模型(保姆级指南)

本文提供LiblibAI平台上从零开始训练LoRA模型的保姆级教程,涵盖数据准备、参数优化到效果调优全流程。详细解析LoRA技术优势,包括云端计算资源、自动化预处理工具等,帮助新手快速掌握自定义模型训练技巧,实现高效AI绘画创作。

dell8的博客 618

D24:C#设计模式之二十三解释器模式(Interpreter Pattern)【行为型】

一、引言 今天我们开始讲“行为型”设计模式的第十一个模式,也是面向对象设计模式的最后一个模式,先要说明一下,其实这个模式不是最后一个模式(按Gof的排序来讲),为什么把它放在最后呢?因为我们在业务系统中写一个解释器的机会并不是很多,实践比较少,理解和应用该模式就有些困难,所以就放在最后来说。该模式就是【解释器模式】,英文名称是:Interpreter Pattern。按老规矩,先从名称上来看...

. 676

从硬件拆解到图像生成:一次搞懂MRI设备(主磁体、梯度线圈、射频系统)是如何协同工作的

本文深入解析MRI设备的三大核心系统——主磁体、梯度线圈和射频系统如何协同工作,实现从量子现象到诊断图像的转化。通过详细的技术参数和临床案例,揭示磁共振成像(MRI)在医疗图像处理中的精密工程原理和最新技术突破,帮助读者全面理解这一现代医学影像技术的运作机制。

weixin_33734785的博客 545

解释器模式( Interpreter Pattern ): 最不容易实现的设计模式

参考书籍: 《Design Patterns: Elements of Reusable Object-Oriented Software》 设计模式用前须知 设计模式种一句出现频率非常高的话是,“ 在不改动。。。。的情况下, 实现。。。。的扩展“ 。 对于设计模式的学习者来说,充分思考这句话其实非常重要, 因为这句往往只对框架/ 工具包的设计才有真正的意义。因为框架和工具包存在

萧萧的专栏 617

你学Simulink--基于储能系统的建模与仿真场景:飞轮储能系统在电网调频中的作用仿真

本文详细介绍了利用Simulink+Simscape搭建飞轮储能系统(FESS)电网调频仿真模型的全过程。主要内容包括:系统工作原理及调频作用分析,基于Simulink的模块化建模步骤(飞轮、电机/发电机、功率电子接口等组件搭建),调频控制策略实现(频率检测、功率指令生成和模式切换),以及仿真参数设置与结果分析方法。该模型可有效模拟FESS在电网频率调节中的快速响应特性,为新能源存储和智能电网研究提供重要仿真工具,同时可通过参数优化和算法改进进一步提升系统性能。

xiaoheshang_123的博客 168

Android 13.0 app进程保活白名单功能实现

在13.0的系统rom产品开发中,在某些重要的app即使进入后台,产品需求要求也不想被系统杀掉进程,需要app长时间保活,就是app进程保活白名单功能的实现, 所以需要在系统杀进程的时候不杀掉白名单的进程,接下来就看怎么样来实现这些功能

安卓兼职framework和app工程师的博客 3142

C#设计模式读书笔记之解释器模式 (Interpreter Pattern)

解释器模式 (Interpreter Pattern) 1. 概述   定义一个语言的文法,并且建立一个解释器来解释该语言中的句子,这里的“语言”是指使用规定格式和语法的代码。 2. 模式中的角色   2.1 AbstractExpression(抽象表达式):在抽象表达式中声明了抽象的解释操作,它是所有终结符表达式和非终结符表达式的公共父类。 2.2 TerminalEx...

qq826364410的专栏 608

从原理到落地:Mamba-YOLOv8 全面实战指南(源码 + 训练 + 部署一次学会)

在目标检测领域,CNN与Transformer的较量从未停歇。本文提出一种革命性的架构——,将状态空间模型(SSM)首次引入YOLO框架。实验表明,该模型在COCO数据集上达到54.3% mAP@0.5,推理速度达89 FPS(RTX 4090),相比原版YOLOv8提升12.7%精度与23%速度。本文将完整揭示其技术原理与工程实现,助您掌握这一前沿技术。

FJN110的博客 119
上一篇: 乐在其中设计模式(C#) - 责任链模式(Chain of Responsibility Pattern)
下一篇: 乐在其中设计模式(C#) - 抽象工厂模式(Abstract Factory Pattern)
webabcd
博客等级 码龄17年 28粉丝 911原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值