Java解析器设计模式

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

Java解析器设计模式

定义

解析器模式是一种行为型设计模式。其思想是:给定一个语言, 定义它的文法的一种表示,并定义一个解释器,该解释器使用该表示来解释语言中的句子。

对应角色

  • 抽象表达式(Expression):声明一个所有的具体表达式的抽象接口,包含一个interpret()方法,称做解释操作。
  • 终结符表达式(Terminal Expression):实现与文法中的元素相关联的解释操作。通常一个解释器模式中只有一个终结符表达式,但有多个实例,对应不同的终结符。
  • 非终结符表达式(Nonterminal Expression):文法中的每一条规则都需要一个具体的非终结符表达式,非终结符表达式一般是文法中的运算符或者其他关键字。
  • 环境(Context):用来存放文法中各个终结符所对应的具体值,很多情况下我们使用Map来充当环境角色。

优缺点

优点

  • 可以实现语言的文法和解释器的分离,易于扩展和维护。
  • 可以用于实现一些简单的领域特定语言(DSL)。
  • 可以利用现有的解析器生成工具,如ANTLR,来简化开发过程。

缺点

  • 对于复杂的语言,文法规则可能会很多,导致类的数量增加,系统变得复杂和低效。
  • 解析器模式通常需要递归调用,可能会导致性能和内存问题。
  • 解析器模式难以处理错误和异常情况。

应用场景

  • 需要解释和执行一些简单的语言或表达式,如数学表达式,布尔表达式,正则表达式等。
  • 需要构建一些领域特定语言(DSL),如SQL,XML,JSON等。
  • 需要对一些结构化的文本进行分析和处理,如配置文件,协议报文,编程语言等。

实例

通用模式:


1.首先创建特定文法(抽象表达式)接口:
public abstract class Expression { 
    public boolean interpret(String context); 
}

2.创建表达式接口的实现类(终结符表达式):
public class TerminalExpression extend Expression {
    private String data;
    public TerminalExpression(String data){
        this.data = data;
    }
    @Override 
    public Object interpret(String context) {
        //逻辑处理
        return null;
    }
}

//非终结符表达式
public class NonterminalExpression extends Expression { 
    public NonterminalExpression(Expression ...expressions) { } 
    @Override Object interpreter(Context ctx) { 
        return null; 
    }
}

//可以创建更多的的实现类用于处理特定语法中不同关键字

算数表达式实例文章来源地址https://www.toymoban.com/news/detail-597114.html

public abstract class Expression {
    int interpret(String info);
}

//变量解析器
public class VariableExpression extend Expression {
    private String key;
    VariableExpression(String key) {
        this.key = key;
    }
    @Override
    public int interpreter(HashMap<String, Integer> var) { 
        return var.get(key); 
    }
}

//运算符解析器
public abstract class OperatorExpression extend Expression {
    private Expression varLeft;//运算符左变量
    private Expression varRight;//运算符右变量
    OperatorExpression(Expression varLeft, Expression varRight) {
        this.varLeft = varLeft;
        this.varRight = varRight;
    }
}

//加法运算符解析器
public class AndExpression extend OperatorExpression {
    AndExpression(Expression varLeft, Expression varRight) {
        super(varLeft, varRight)
    }
    
    @Override
    public int interpreter(HashMap<String, Integer> var) { 
        return super.varLeft.interpreter(var) + super.varRight.interpreter(var); 
    }
    
}

//减法法运算符解析器
//加法运算符解析器
public class SubExpression extend OperatorExpression {
    SubExpression(Expression varLeft, Expression varRight) {
        super(varLeft, varRight)
    }
    @Override
    public int interpreter(HashMap<String, Integer> var) { 
        return super.varLeft.interpreter(var) - super.varRight.interpreter(var); 
    }
}


public class Client {

    public static void main(String[] args) throws IOException {
        //表达式
        String expStr = "a+b-c";
        
        //a、b、c对应的值放到operatorMap中
        HashMap<String, Integer> varMap;//变量数据
        
        //对表达式进行解析
        Expression expression = parse(expStr);
        
        //运算结果
        int result = expression.interpreter(varMap);
    }
    
    
    //定义对表达式进行解析的方法(解析器的核心方法,也可以说是真正的解析器)
    private static Expression parser(String expStr) {
        
        Stack<Expression> stack = new Stack<>(); 
        char[] charArray = expStr.toCharArray(); 
        Expression left = null; 
        Expression right = null; 
        for (int i = 0; i < charArray.length; i++) { 
        switch (charArray[i]) { 
            case '+': left = stack.pop(); 
                      right = new VariableExpression(String.valueOf(charArray[++i])); 
                      stack.push(new AddExpression(left, right)); 
                      break; 
            case '-': 
                      left = stack.pop(); 
                      right = new VariableExpression(String.valueOf(charArray[++i])); 
                      stack.push(new SubExpression(left, right)); 
                      break; 
            default: 
                      stack.push(new VariableExpression(String.valueOf(charArray[i]))); 
                      break; 
            } 
        } 
        return expression = stack.pop(); 
    }
}

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

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

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

相关文章

  • Java设计模式系列--观察者模式写法2:JDK

    原文网址:Java设计模式系列--观察者模式写法2:JDK_IT利刃出鞘的博客-CSDN博客 说明 本文用示例介绍观察者模式的一种写法:JDK。 JDK的观察者模式简介 在 Java 中,java.util.Observable 类和 java.util.Observer 接口定义了观察者模式,只要实现这两个接口就可以编写观察者模式。 1. Ob

    2024年02月13日
    浏览(38)
  • 【JAVA】XML及其解析技术、XML检索技术、设计模式

    XML(Extensible Markup Language)是可扩展标记语言的缩写,它是一种数据表示格式,可以描述复杂的数据结构,常用于传输和存储数据 作用: 用于进行存储数据和传输数据 作为软件的配置文件 第一行是文档声明 ? xml version =\\\"1.0\\\" encoding =\\\"UTF-8\\\" ? version:XML默认的版本号码、该属性是必

    2024年02月11日
    浏览(44)
  • 完全从零Java自学系列【入门篇】(第四课:Mysql服务端安装&使用客户端操作数据库&初识SQL基础操作&Java中使用第三方包&Java数据库操作&初步理解面相对象真正的意义之桥接设计模式)

      数据库是专门用来存储一系列集合数据的地方。所有的文件都可以被称之为库,当应用场景没那么复杂的时候,简单的应用程序用文本就可以了。数据库的意义是为了设计更好的保障数据安全(如多线程操作)、数据一致、索引(如何在庞大的数据中快速查找)等等一系

    2024年02月21日
    浏览(62)
  • JAVA设计模式----原型设计模式

    定义 :用原型实例指定创建对象的种类,并通过拷贝这些原型创建新的对象。 类型 :创建类模式 类图 : 原型模式主要用于对象的复制,它的核心是就是类图中的原型类Prototype。Prototype类需要具备以下两个条件: 实现Cloneable接口。在java语言有一个Cloneable接口,它的作用只

    2024年02月13日
    浏览(51)
  • 【设计模式】Java设计模式详细讲解

    一、概述 Java设计模式是Java程序设计中一种重要的最佳实践,它提供了一种框架和结构,可以帮助开发者更好地理解和设计复杂的系统。设计模式不仅仅是一种语法规则,更是一种思想和方法论,它能够帮助开发者更好地分析、设计和实现软件系统。 设计模式的概念最早由

    2024年02月10日
    浏览(53)
  • Java设计模式 (三) 代理设计模式

    什么是代理设计模式? 代理设计模式是一种结构型设计模式,它允许创建一个代理对象,用于控制对其他对象的访问。代理模式通常用于在访问对象时添加一些附加操作,而不是直接访问真实对象。代理模式可以在不改变原始类代码的情况下,通过引入代理类来增强功能。 代

    2024年02月12日
    浏览(42)
  • 【Java】 Java设计模式

    白白胖胖,充满希望~ Java工厂模式(Factory Pattern)是一种创建型设计模式,它提供了一种创建对象的最佳方式,而无需将对象的创建逻辑暴露给客户端代码。工厂模式通过定义一个工厂方法来创建对象,而客户端只需要调用该工厂方法即可获得所需对象,从而实现了对象的创

    2024年02月09日
    浏览(46)
  • Java设计模式 (一) 模板方法设计模式

    什么是模板方法设计模式? 模板方法设计模式是一种行为型设计模式,它定义了一个算法的骨架,并将一些步骤的具体实现延迟到子类中。模板方法模式可以帮助确保在算法的不同部分中保持一致性,同时也允许子类根据需要进行具体实现。 模板方法模式的关键特点包括:

    2024年02月12日
    浏览(44)
  • Java设计模式-命令模式

    命令模式,将一个请求封装为一个对象,从而使你可用不同的请求对客户进行参数化。对请求排队或记录请求日志,以及支持可撤销的操作。 命令模式乍一看,有点懵懵的。即使这个定义看完,也是不明所以。但是结合例子来讲的话,就比较容易理解了。 其实它就是把一个

    2024年02月15日
    浏览(35)
  • Java设计模式-组合模式

    在软件设计中,设计模式是一种被广泛接受和应用的经验总结,旨在解决常见问题并提供可复用的解决方案。 组合模式是一种结构型设计模式,它允许将对象组合成树形结构以表示“部分-整体”的层次结构。这种模式能够使客户端以一致的方式处理单个对象和对象集合,将

    2024年02月06日
    浏览(42)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包