首页 > 其他分享 >23-解释器模式

23-解释器模式

时间:2023-03-09 10:11:26浏览次数:37  
标签:case 解释器 String 23 模式 break context public

23-解释器模式

概念

解释器模式(interpreter), 给定一个语言,定义它的文法的一种表示,并定义一个解释器,这个解释器使用该表示来解释语言中的句子。
如果一种特定类型的问题发生的频率足够高,name可能就指的将该问题的各个势力标书为一个简单语言中的句子。这样就可以构建一个解释器,该解释器通过解释这些句子来解决该问题

当有一个语言需要解释执行,并且你可将改语言中的句子表示为一个抽象语法树时,可使用解释器模式
优点:可以很容易地改变和扩展文法,因为改模式使用类来表示文法规则,你可使用继承来改变或扩展该文法,也比较容易实现文法,因为定义抽象语法树中个节点的类的实现阀体类似,这些类都易于直接编写
缺点:解释器模式为文法中的每一条规则至少定义了一个类,因此包含许多规则的文法可能难以管理和维护。建议当文法非常复杂时,使用其他的技术如语法分析程序或编译器生成器来处理

例子 音乐解释器

package com.gof.interpreter;

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

/**
 * 功能描述
 *
 * @since 2023-03-09
 */
@Data
@AllArgsConstructor
@NoArgsConstructor
public class PlayContext {
    private String context;
}
package com.gof.interpreter;

/**
 * 功能描述
 *
 * @since 2023-03-09
 */
public abstract class Expression {
    public void Interpret(PlayContext context) {
        if (context.getContext().length() == 0) {
            return;
        } else {
            String playKey = context.getContext().substring(0, 1);
            String playText = context.getContext().substring(2);
            double playValue = Double.parseDouble(playText.substring(0, playText.indexOf(" ")));
            context.setContext(playText.substring(playText.indexOf(" ") + 1));
            execute(playKey, playValue);
        }
    }

    public abstract void execute(String key, double value);
}
package com.gof.interpreter;

/**
 * 功能描述
 *
 * @since 2023-03-09
 */
public class Note extends Expression {
    @Override
    public void execute(String key, double value) {
        String note = "";
        switch (key) {
            case "C":
                note = "1";
                break;
            case "D":
                note = "2";
                break;
            case "E":
                note = "3";
                break;
            case "F":
                note = "4";
                break;
            case "G":
                note = "5";
                break;
            case "A":
                note = "6";
                break;
            case "B":
                note = "7";
                break;
        }
        System.out.print(note);
    }
}
package com.gof.interpreter;

/**
 * 功能描述
 *
 * @since 2023-03-09
 */
public class Scale extends Expression {
    @Override
    public void execute(String key, double value) {
        String scale = "";
        switch ((int) value) {
            case 1:
                scale = "低音";
                break;
            case 2:
                scale = "中音";
                break;
            case 3:
                scale = "高音";
                break;
        }
        System.out.print(scale);
    }
}
package com.gof.interpreter;

/**
 * 功能描述
 *
 * @since 2023-03-09
 */
public class Client {
    public static void main(String[] args) {
        PlayContext context = new PlayContext();
        System.out.println("上海滩");
        context
            .setContext("O 2 E 0.5 G 0.5 A 3 E 0.5 G 0.5 D 3 E 0.5 G 0.5 A 0.5 O 3 C 1 O 2 A 0.5 G 1 C 0.5 E 0.5 D 3 ");
        Expression expression = null;
        try {
            while (context.getContext().length() > 0) {
                String str = context.getContext().substring(0, 1);
                switch (str) {
                    case "O":
                        expression = new Scale();
                        break;
                    case "C":
                    case "D":
                    case "E":
                    case "F":
                    case "G":
                    case "A":
                    case "B":
                    case "P":
                        expression = new Note();
                        break;
                }
                expression.Interpret(context);
            }

        } catch (Exception ex) {
            System.out.println(ex.getMessage());
        }
    }
}

标签:case,解释器,String,23,模式,break,context,public
From: https://www.cnblogs.com/Oh-mydream/p/17197341.html

相关文章

  • 分布式事务-最大努力通知2 20230308
          ......
  • 力扣---2379. 得到 K 个黑块的最少涂色次数
    给你一个长度为n下标从0开始的字符串blocks,blocks[i]要么是'W'要么是'B',表示第i块的颜色。字符'W'和'B'分别表示白色和黑色。给你一个整数k,表示想要连......
  • 23-3-9 基金学习笔记-创金合信医疗保健股票
    23-3-9 基金学习笔记基金业绩迅速上涨的时候,都是基金规模小的时候。创金合信医疗保健股票  基金规模迅速上涨的时候,都是业绩开始摆烂的时候。如下20.6.30从四千......
  • Spring设计模式——单例模式
    单例模式单例模式(SingletonPattern)是指确保一个类在任何情况下都绝对只有一个实例,并提供一个全局访问点。单例模式是创建型模式。饿汉单例模式饿汉单例模式在类的......
  • 2023-3-8-pytorch关于CNN的描述与代码,ai对话生成的
    左脚踩右脚上天了是什么搞笑笑话这不是搞笑笑话,而是一个玩笑语言游戏。“左脚踩右脚上天了”实际上是一个不合逻辑的语句,因为脚无法踩在自己的脚上,更不可能踩上天。这种语......
  • 【补题】2022-2023 ACM-ICPC German Collegiate Programming Contest (GCPC 2022)
    题目链接https://codeforces.com/gym/104059A.AlternativeArchitecture思路简单题,但要注意细节。给的方格很干扰思考,事实上注意到顶点指的是四个角上的圆圈,我们将长......
  • 清醒时刻记23
    在咖啡厅的下午。刚陪着红人从火锅底料的商家那里签完广告回来,我想总结这次的成功签约是因为红人之前做了几个类似“吃播”的视频,反响很好,很多评论都说“馋哭了”、“......
  • 狗屁不通文章生成器在线网页版 (2023年最新)
    今天给大家分享一个在线小工具:狗屁不通文章生成器,顾名思义,使用这个小工具可快速生成一篇狗屁不通的文章,默认是生成6000字,还挺有意思的。一、先看效果只需在输入框里面......
  • 20230308总结
    总之就是很寄,很寄。T1:想出来前缀和了,但是没想出来怎么优化,于是心态没了,于是就gg了,后面也没想暴力,我很菜。T1可以dfsmndp过nm二分过但是我一个没想出来我很废物......
  • 2023年度Android面试复习
    Android系统启动流程?当按电源键触发开机,首先会从ROM中预定义的地方加载引导程序BootLoader到RAM中,并执行BootLoader程序启动LinuxKernel;然后启动用户级别的第一个......