龗孖 龗孖
首页
  • JAVA
  • 设计模式
  • 前端文章

    • JavaScript
  • 学习笔记

    • 《JavaScript教程》
    • 《JavaScript高级程序设计》
    • 《ES6 教程》
    • 《Vue》
    • 《React》
    • 《TypeScript 从零实现 axios》
    • 《Git》
    • TypeScript
    • JS设计模式总结
  • 页面

    • HTML
    • CSS
  • 技术文档
  • GitHub技巧
  • Nodejs
  • 博客搭建
  • 学习
  • 面试
  • 心情杂货
  • 实用技巧
  • 友情链接
关于
收藏
  • 分类
  • 标签
  • 归档
GitHub (opens new window)

靇孖

某微型企业非牛逼技术专家。
首页
  • JAVA
  • 设计模式
  • 前端文章

    • JavaScript
  • 学习笔记

    • 《JavaScript教程》
    • 《JavaScript高级程序设计》
    • 《ES6 教程》
    • 《Vue》
    • 《React》
    • 《TypeScript 从零实现 axios》
    • 《Git》
    • TypeScript
    • JS设计模式总结
  • 页面

    • HTML
    • CSS
  • 技术文档
  • GitHub技巧
  • Nodejs
  • 博客搭建
  • 学习
  • 面试
  • 心情杂货
  • 实用技巧
  • 友情链接
关于
收藏
  • 分类
  • 标签
  • 归档
GitHub (opens new window)
  • 设计模式
  • 设计模式-单例
  • 设计模式-中介者
  • 设计模式-享元
  • 设计模式-代理
  • 设计模式-原型模式
  • 设计模式-命令
  • 设计模式-备忘录
  • 设计模式-外观
  • 设计模式-工厂方法
  • 设计模式-抽象工厂
  • 设计模式-桥接
  • 设计模式-模板方法
  • 设计模式-状态
  • 设计模式-生成器
  • 设计模式-空对象
  • 设计模式-策略
  • 设计模式-简单工厂
  • 设计模式-组合
  • 设计模式-装饰
  • 设计模式-观察者
  • 设计模式-解释器
    • 解释器(Interpreter)
      • Intent
      • Class Diagram
      • Implementation
      • JDK
  • 设计模式-访问者
  • 设计模式-责任链
  • 设计模式-迭代器
  • 设计模式-适配器
  • 设计模式
  • 设计模式
龗孖
2023-07-20
目录

设计模式-解释器

# 解释器(Interpreter)

# Intent

为语言创建解释器,通常由语言的语法和语法分析来定义。

# Class Diagram

  • TerminalExpression:终结符表达式,每个终结符都需要一个 TerminalExpression。
  • Context:上下文,包含解释器之外的一些全局信息。

# Implementation

以下是一个规则检验器实现,具有 and 和 or 规则,通过规则可以构建一颗解析树,用来检验一个文本是否满足解析树定义的规则。

例如一颗解析树为 D And (A Or (B C)),文本 "D A" 满足该解析树定义的规则。

这里的 Context 指的是 String。

public abstract class Expression {
    public abstract boolean interpret(String str);
}
1
2
3
public class TerminalExpression extends Expression {

    private String literal = null;

    public TerminalExpression(String str) {
        literal = str;
    }

    public boolean interpret(String str) {
        StringTokenizer st = new StringTokenizer(str);
        while (st.hasMoreTokens()) {
            String test = st.nextToken();
            if (test.equals(literal)) {
                return true;
            }
        }
        return false;
    }
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
public class AndExpression extends Expression {

    private Expression expression1 = null;
    private Expression expression2 = null;

    public AndExpression(Expression expression1, Expression expression2) {
        this.expression1 = expression1;
        this.expression2 = expression2;
    }

    public boolean interpret(String str) {
        return expression1.interpret(str) && expression2.interpret(str);
    }
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
public class OrExpression extends Expression {
    private Expression expression1 = null;
    private Expression expression2 = null;

    public OrExpression(Expression expression1, Expression expression2) {
        this.expression1 = expression1;
        this.expression2 = expression2;
    }

    public boolean interpret(String str) {
        return expression1.interpret(str) || expression2.interpret(str);
    }
}
1
2
3
4
5
6
7
8
9
10
11
12
13
public class Client {

    /**
     * 构建解析树
     */
    public static Expression buildInterpreterTree() {
        // Literal
        Expression terminal1 = new TerminalExpression("A");
        Expression terminal2 = new TerminalExpression("B");
        Expression terminal3 = new TerminalExpression("C");
        Expression terminal4 = new TerminalExpression("D");
        // B C
        Expression alternation1 = new OrExpression(terminal2, terminal3);
        // A Or (B C)
        Expression alternation2 = new OrExpression(terminal1, alternation1);
        // D And (A Or (B C))
        return new AndExpression(terminal4, alternation2);
    }

    public static void main(String[] args) {
        Expression define = buildInterpreterTree();
        String context1 = "D A";
        String context2 = "A B";
        System.out.println(define.interpret(context1));
        System.out.println(define.interpret(context2));
    }
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
true
false
1
2

# JDK

  • java.util.Pattern (opens new window)
  • java.text.Normalizer (opens new window)
  • All subclasses of java.text.Format (opens new window)
  • javax.el.ELResolver (opens new window)
上次更新: 2024/11/03, 21:31:17
设计模式-观察者
设计模式-访问者

← 设计模式-观察者 设计模式-访问者→

最近更新
01
树中两个节点的最低公共祖先
10-17
02
hexo多平台多博客网站同步
09-04
03
最长不含重复字符的子字符串
09-03
更多文章>
Theme by Vdoing | Copyright © 2015-2024 Ling ma | 996.icu | 京ICP备16011424号-1
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式