Interpreter Pattern

这篇具有很好参考价值的文章主要介绍了Interpreter Pattern。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

It can explain what ?

如下是解释器要解释的主体:

  • 加减乘除等运算,3+4/9+6*8
  • 摩尔斯电码
  • 正则表达式
  • El表达式
  • OGNL表达式
  • 小明是北京人
  • 小红是一名售货员
  • 部门领导下发一则通知
  • ...

How explain ?

解释器模式常用于对简单语言集的编译或分析,例如:

  • 我是大学生
  • 张强学习编程
  • 小明是北京人
  • 部门领导下发一则通知

为了掌握好它的结构与实现,需要先了解编译原理中的文法句子语法树等相关概念。(其实不了解也行,可以直接看code,在回来看)

这里提到的文法和句子的概念同编译原理中的描述相同,

  • 文法指语言的语法规则
    如何解释语言的规则
  • 句子是语言集中的元素
    例如,汉语中的句子有很多,“我是大学生”是其中的一个句子,可以用一棵语法树来直观地描述语言中的句子。

Grammar Concept

这个是分析的关键。

〈句子〉::=〈主语〉〈谓语〉〈宾语〉
〈主语〉::=〈代词〉|〈名词〉
〈谓语〉::=〈动词〉
〈宾语〉::=〈代词〉|〈名词〉
〈代词〉::= 你 | 我 | 他
〈名词〉::= 大学生 | 小明 | 英语 | 张强
〈动词〉::= 是 | 学习

注意:

  • ::= 表示“定义为”的意思;
  • 括住的是非终结符没有括住的是终结符;
  • | 是 逻辑符号or.

Sentence

句子是语言的基本单位,是语言集中的一个元素,它由终结符构成,能由"文法"推导出
例如,上述文法可以推出“我是大学生”,所以它是句子。

Syntax Tree

语法树是句子结构的一种树型表示,它代表了句子的推导结果,它有利于理解句子语法结构的层次。

“我是大学生”的语法树如图所示:
Interpreter Pattern

<expression> ::= <代词>是<名词>
<代词> ::= 我 | 你 | 他 | 她
<名词> ::= 大学生 | 程序员 | 牲口 | 懦夫

终结符和非终结符

终结符表达式(Terminal Expression):
就是一个最终的元素,不可在向下分割。

非终结符表达式(Nonterminal Expression):
非终结符需要依照文法规则去分割,文法中的每条规则都对应于一个非终结符表达式。

Key Elements

解释器模式包含以下主要角色。

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

Example —— 公交车身份识别系统

需求描述:每个人坐车都需要缴费,每个人上车后需要刷自己的公交卡卡,每个人的卡里都有每个人的信息,信息如下:

  • "韶关的老人";
  • "韶关的年轻人";
  • "广州的妇女";
  • "广州的儿童";
  • "山东的儿童";

你需要写一个解释器去识别每个人的身份,如果是“韶关”或者“广州”的“老人” “妇女”“儿童”就可以免费乘车,其他人员乘车一次扣 2 元。

分析:本实例用“解释器模式”设计比较适合,首先设计其文法规则如下:

<expression> ::= <city>的<person>
<city> ::= 韶关 | 广州
<person> ::= 老人 | 妇女 | 儿童

Client

public static void main(String[] args){
      Context bus=new Context();
      bus.freeRide("韶关的老人");
      bus.freeRide("韶关的年轻人");
      bus.freeRide("广州的妇女");
      bus.freeRide("广州的儿童");
      bus.freeRide("山东的儿童");
}

Context

class Context {
    private String[] citys = {"韶关", "广州"};
    private String[] persons = {"老人", "妇女", "儿童"};
    private Expression cityPerson;

    public Context() {
        Expression city = new TerminalExpression(citys);
        Expression person = new TerminalExpression(persons);
        cityPerson = new AndExpression(city, person);
    }

    public void freeRide(String info) {
        boolean ok = cityPerson.interpret(info);
        if (ok) System.out.println("您是" + info + ",您本次乘车免费!");
        else System.out.println(info + ",您不是免费人员,本次乘车扣费2元!");
    }
}
//抽象表达式类
interface Expression {
    public boolean interpret(String info);
}

//终结符表达式类
class TerminalExpression implements Expression {
    private Set<String> set = new HashSet<String>();

    public TerminalExpression(String[] data) {
        for (int i = 0; i < data.length; i++) set.add(data[i]);
    }

    public boolean interpret(String info) {
        if (set.contains(info))
            return true;
        return false;
    }
}

//非终结符表达式类
class AndExpression implements Expression {
    private Expression city = null;
    private Expression person = null;

    public AndExpression(Expression city, Expression person) {
        this.city = city;
        this.person = person;
    }

    public boolean interpret(String info) {
        String s[] = info.split("的");
        System.out.println(city.interpret(s[0]) && person.interpret(s[1]));
        return city.interpret(s[0]) && person.interpret(s[1]);
    }
}

out:

true
您是韶关的老人,您本次乘车免费!
false
韶关的年轻人,您不是免费人员,本次乘车扣费2元!
true
您是广州的妇女,您本次乘车免费!
true
您是广州的儿童,您本次乘车免费!
false
山东的儿童,您不是免费人员,本次乘车扣费2元!

Interpreter Example

如果你有一个配置文件,其中包含多个逻辑语句,我应该如何处理它们?

{
  "logic_statements": [
    "condition1 and condition2",
    "condition3 or condition4",
    "condition5 and condition6 or condition7"
  ]
}

todo

Reference

设计模式之解释器模式(Interpreter)详解及代码示例
https://www.cnblogs.com/jing99/p/12610089.html文章来源地址https://www.toymoban.com/news/detail-700033.html

到了这里,关于Interpreter Pattern的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包赞助服务器费用

相关文章

  • 设计模式(二十三)——解释器模式(Interpreter )

    设计模式(二十三)——解释器模式(Interpreter )

    解释器模式(Interpreter ) 实现了一个表达式接口,该接口解释一个特定的上下文 应用 编译器,正则表达式,SQL解析 实现 实现一个一位数的加法运算

    2024年02月11日
    浏览(13)
  • iThinkAir代码解释器对照Code Interpreter的应用案例

    iThinkAir代码解释器对照Code Interpreter的应用案例

    前几天OpenAI对Plus会员开放了Code Interpreter功能,有人说是王炸,有人说是核弹级更新,也有人说是继ChatGPT之后再度让人感受到震撼和颠覆的产品。 时隔几天,iThinkAir也创造了自己的\\\"代码解释器\\\"。 下面列举iThinkAir\\\"代码解释器\\\"的十几个应用案例,大家可以和Code Interpreter对照一

    2024年02月16日
    浏览(11)
  • 【设计模式——学习笔记】23种设计模式——解释器模式Interpreter(原理讲解+应用场景介绍+案例介绍+Java代码实现)

    【设计模式——学习笔记】23种设计模式——解释器模式Interpreter(原理讲解+应用场景介绍+案例介绍+Java代码实现)

    通过解释器模式来实现四则运算,如计算 a+b-c 的值,具体要求 先输入表达式的形式,比如 a+b+c-d+e ,要求表达式的字母不能重复 在分别输入 a,b,c,d,e 的值 最后求出结果 编写一个方法,接收表达式的形式,然后根据用户输入的数值进行解析,得到结果 【分析】 如果加入新的

    2024年02月13日
    浏览(48)
  • python项目移动解决pycharm中解释器invalid与 Invalid python interpreter selected for the project。

    python项目移动解决pycharm中解释器invalid与 Invalid python interpreter selected for the project。

    为项目选择的python解释器无效。   新入职的时候拿过别人的自动化框架借鉴的时候,发现打开代码pycharm中解释器上方报 Invalid python interpreter selected for the project的错误 打开pycharm,点击File — Settings时发现同样有错误  同时之前可以使用的selenium此时也不能使用 步骤1. 步骤2:

    2024年02月08日
    浏览(17)
  • Interpreter Pattern

    Interpreter Pattern

    如下是解释器要解释的主体: 加减乘除等运算,3+4/9+6*8 摩尔斯电码 正则表达式 El表达式 OGNL表达式 小明是北京人 小红是一名售货员 部门领导下发一则通知 ... 解释器模式常用于对简单语言集的编译或分析,例如: 我是大学生 张强学习编程 小明是北京人 部门领导下发一则

    2024年02月09日
    浏览(8)
  • ML Design Pattern——Explainable Predictions

    Explainable Predictions Explainable Predictions refer to the practice of designing ML models in a way that enables humans to understand and interpret the rationale behind their predictions. This is particularly important in domains where the decisions made by ML models have real-world consequences, such as loan approvals, medical diagnoses, and autonomous dr

    2024年01月23日
    浏览(14)
  • 『pycharm 』解决无法添加解释器,无法新建项目问题(是无法添加解释器,不是没有添加解释器)

    『pycharm 』解决无法添加解释器,无法新建项目问题(是无法添加解释器,不是没有添加解释器)

    这个问题和大家常见的: 没有Python解释器 这种简单问题不同。请看问题描述。👇👇 如图,解释器列表空空如也,即使点击“ 添加本地解释器 ”也没有反应(那个展开小三角也是空的)。 所有项目都这样了,那里变成空的了。而且这些都是我自己的项目,之前都好好的。 删

    2024年02月11日
    浏览(42)
  • Pycharm 重命名SSH的conda解释器后,提示该解释器不可用

    Pycharm 重命名SSH的conda解释器后,提示该解释器不可用

    目前已知是BUG,截至投稿日未修复 已经提交给youtrack.jetbrains.com,如下图:

    2024年01月17日
    浏览(86)
  • 解锁Spring Boot中的设计模式—02.解释器模式:探索【解释器模式】的奥秘与应用实践!

    解锁Spring Boot中的设计模式—02.解释器模式:探索【解释器模式】的奥秘与应用实践!

    解释器模式(Interpreter Pattern)是一种行为设计模式,它用于定义语言的文法,并且解释语言中的表达式。在Java中,解释器模式可以用于构建解释器以解析特定的语言或表达式,如数学表达式、查询语言等。 优点: 灵活性: 解释器模式可以 灵活地添加新的表达式和规则 ,因

    2024年02月19日
    浏览(47)
  • 什么是解释器模式

    程序员必知!解释器模式的实战应用与案例分析 - 知乎 上边这篇文章写的比较好,有定义,有例子,还划了重点,引用一下重点: 解释器模式在日常Java开发过程中使用的非常多,它最大的优点在于灵活性:能动态地解释和执行代码,这在处理复杂逻辑或多变需求时特别有用

    2024年01月19日
    浏览(11)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包