解释器(Interpreter)

Intent

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

Class Diagram

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

设计模式 - 解释器 - 图1

Implementation

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

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

这里的 Context 指的是 String。

  1. public abstract class Expression {
  2. public abstract boolean interpret(String str);
  3. }
  1. public class TerminalExpression extends Expression {
  2. private String literal = null;
  3. public TerminalExpression(String str) {
  4. literal = str;
  5. }
  6. public boolean interpret(String str) {
  7. StringTokenizer st = new StringTokenizer(str);
  8. while (st.hasMoreTokens()) {
  9. String test = st.nextToken();
  10. if (test.equals(literal)) {
  11. return true;
  12. }
  13. }
  14. return false;
  15. }
  16. }
  1. public class AndExpression extends Expression {
  2. private Expression expression1 = null;
  3. private Expression expression2 = null;
  4. public AndExpression(Expression expression1, Expression expression2) {
  5. this.expression1 = expression1;
  6. this.expression2 = expression2;
  7. }
  8. public boolean interpret(String str) {
  9. return expression1.interpret(str) && expression2.interpret(str);
  10. }
  11. }
  1. public class OrExpression extends Expression {
  2. private Expression expression1 = null;
  3. private Expression expression2 = null;
  4. public OrExpression(Expression expression1, Expression expression2) {
  5. this.expression1 = expression1;
  6. this.expression2 = expression2;
  7. }
  8. public boolean interpret(String str) {
  9. return expression1.interpret(str) || expression2.interpret(str);
  10. }
  11. }
  1. public class Client {
  2. /**
  3. * 构建解析树
  4. */
  5. public static Expression buildInterpreterTree() {
  6. // Literal
  7. Expression terminal1 = new TerminalExpression("A");
  8. Expression terminal2 = new TerminalExpression("B");
  9. Expression terminal3 = new TerminalExpression("C");
  10. Expression terminal4 = new TerminalExpression("D");
  11. // B C
  12. Expression alternation1 = new OrExpression(terminal2, terminal3);
  13. // A Or (B C)
  14. Expression alternation2 = new OrExpression(terminal1, alternation1);
  15. // D And (A Or (B C))
  16. return new AndExpression(terminal4, alternation2);
  17. }
  18. public static void main(String[] args) {
  19. Expression define = buildInterpreterTree();
  20. String context1 = "D A";
  21. String context2 = "A B";
  22. System.out.println(define.interpret(context1));
  23. System.out.println(define.interpret(context2));
  24. }
  25. }
  1. true
  2. false

JDK

设计模式 - 解释器 - 图2