From 8f59fff5ad7b46c265492a01709d5497096417e0 Mon Sep 17 00:00:00 2001 From: CyC2018 <1029579233@qq.com> Date: Tue, 5 Jun 2018 11:21:16 +0800 Subject: [PATCH] auto commit --- notes/设计模式.md | 111 ++++++++++++++++++ pics/794239e3-4baf-4aad-92df-f02f59b2a6fe.png | Bin 0 -> 17408 bytes 2 files changed, 111 insertions(+) create mode 100644 pics/794239e3-4baf-4aad-92df-f02f59b2a6fe.png diff --git a/notes/设计模式.md b/notes/设计模式.md index 6c29e7e9..43b0d79b 100644 --- a/notes/设计模式.md +++ b/notes/设计模式.md @@ -823,6 +823,117 @@ public class Client { 为语言创建解释器,通常由语言的语法和语法分析来定义。 +### 类图 + +- TerminalExpression:终结符表达式,每个终结符都需要一个 TerminalExpression +- Context:上下文,包含解释器之外的一些全局信息 + +

+ +### 实现 + +以下是一个规则检验器实现,具有 and 和 or 规则,通过规则可以构建一颗解析树,用来检验一个文本是否满足解析树定义的规则。 + +例如一颗解析树为 D And (A Or (B C)),文本 "D A" 满足该解析树定义的规则。 + +这里的 Context 指的是 String。 + +```java +public abstract class Expression { + public abstract boolean interpret(String str); +} +``` + +```java +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; + } +} +``` + +```java +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); + } +} +``` + +```java +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); + } +} +``` + +```java +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)); + } +} +``` + +```html +true +false +``` + ### JDK - [java.util.Pattern](http://docs.oracle.com/javase/8/docs/api/java/util/regex/Pattern.html) diff --git a/pics/794239e3-4baf-4aad-92df-f02f59b2a6fe.png b/pics/794239e3-4baf-4aad-92df-f02f59b2a6fe.png new file mode 100644 index 0000000000000000000000000000000000000000..7adddd918e780bea24305a961a2831e36dd74c24 GIT binary patch literal 17408 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