解析器模式

什么是解析器模式

给定一种语言,定义它的文法表示,并定义一个解释器,该解释器使用该表示来解释语言中句子(通过解析器解析自定义的表达式返回解析后的信息)

示例图

图片.png

示例场景

使用自定义的表达式进行相加 相减操作。
比如:e1=2 e2=8 e3=6, e1+e2=10, e2-e3=2, e1+e2-e3=4

示例代码

1.创建Expression解析器接口

public interface Expression {
    int interpreter(Context context);
}

2.创建Context上下文类

public class Context {
    private Map<Expression, Integer> map = new HashMap<>();

    //添加解析器对象
    public void add(Expression s, Integer value){
        map.put(s, value);
    }
    //获取解析后的值
    public int getValue(Expression s){
        return map.get(s);
    }
}

3.创建TerminalExpression终结表达式

public class TerminalExpression implements  Expression{
    @Override
    public int interpreter(Context context) {
        return context.getValue(this);
    }
}

4.创建NonTerminalExpression非终结表达式

public abstract class NonTerminalExpression implements Expression{
    Expression e1,e2;
    public NonTerminalExpression(Expression e1, Expression e2){
        this.e1 = e1;
        this.e2 = e2;
    }
}

5.创建非终结表达式实现类PlusOperation相加操作和MinusOperation相减操作

public class PlusOperation extends NonTerminalExpression {
    public PlusOperation(Expression e1, Expression e2) {
        super(e1, e2);
    }

    //将两个表达式相加
    @Override
    public int interpreter(Context context) {
        return this.e1.interpreter(context) + this.e2.interpreter(context);
    }
}
public class MinusOperation  extends NonTerminalExpression {
    public MinusOperation(Expression e1, Expression e2) {
        super(e1, e2);
    }

    //将两个表达式相减
    @Override
    public int interpreter(Context context) {
        return this.e1.interpreter(context) - this.e2.interpreter(context);
    }
}

6.创建Client启动类

public class Client {
    public static void main(String[] args) {
        Context context = new Context();
        TerminalExpression e1 = new TerminalExpression();
        TerminalExpression e2 = new TerminalExpression();
        TerminalExpression e3 = new TerminalExpression();
        context.add(e1, 2);
        context.add(e2, 8);
        context.add(e3, 6);
        System.out.println("------------------------------表达式相减操作");
        MinusOperation minusOperation = new MinusOperation(e1, e2);
        System.out.println(minusOperation.interpreter(context));
        System.out.println("------------------------------表达式相加操作");
        PlusOperation plusOperation = new PlusOperation(e1,e3);
        System.out.println(plusOperation.interpreter(context));
        System.out.println("------------------------------表达式先加再减操作");
        Expression expression = new MinusOperation(new PlusOperation(e1, e2), e3);
        System.out.println(expression.interpreter(context));
    }
}

7.运行结果


图片.png
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 解析器模式给定一个语言,定义它的文法表示,并定义一个解释器,这个解释器使用该标识来解释语言中的句子。这种模式被用在...
    巨子联盟阅读 525评论 0 0
  • 一、模式简介 定义:给分析对象定义一个语言,并定义该语言的文法表示,再设计一个解析器来解释语言中的句子,用编译语言...
    潜心之力阅读 453评论 0 0
  • 解析器模式-定义? 定义:给定一个语言,定义它的文法的一种表达式,并且定义一个解析器,该解析器使用该表示来解析语言...
    架构师的一小步阅读 335评论 0 0
  • 定义 给定一个语言,定义它的语法的一种表达式,并且定义一个解析器,该解析器使用该表达式来解析语言中的句子; 文法 ...
    fanren阅读 192评论 0 0
  • 解析器模式:解析脚本的语言解析器。 php源于c语言,其实是用c语言解析了php脚本,那么php有是如何解析其他语...
    美雨知春阅读 588评论 0 1

友情链接更多精彩内容