目的

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

类图

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

解释器类图.png

实现

以下是一个规则检验器实现,具有 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. }
  4. public class TerminalExpression extends Expression{
  5. private String literal = null;
  6. public TerminalExpression(String str){
  7. literal = str;
  8. }
  9. public boolean interpret(String str){
  10. StringTokenizer st = new StringTokenizer(str);
  11. while(st.hasMoreTokens()){
  12. String test = st.nextToken();
  13. if(test.equals(literal)){
  14. return true;
  15. }
  16. }
  17. return false;
  18. }
  19. }
  20. public class AndExpression extends Expression {
  21. private Expression expression1 = null;
  22. private Expression expression2 = null;
  23. public AndExpression(Expression expression1, Expression expression2) {
  24. this.expression1 = expression1;
  25. this.expression2 = expression2;
  26. }
  27. public boolean interpret(String str) {
  28. return expression1.interpret(str) && expression2.interpret(str);
  29. }
  30. }
  31. public class OrExpression extends Expression {
  32. private Expression expression1 = null;
  33. private Expression expression2 = null;
  34. public OrExpression(Expression expression1, Expression expression2) {
  35. this.expression1 = expression1;
  36. this.expression2 = expression2;
  37. }
  38. public boolean interpret(String str) {
  39. return expression1.interpret(str) || expression2.interpret(str);
  40. }
  41. }
  42. public class Client {
  43. /**
  44. * 构建解析树
  45. */
  46. public static Expression buildInterpreterTree() {
  47. // Literal
  48. Expression terminal1 = new TerminalExpression("A");
  49. Expression terminal2 = new TerminalExpression("B");
  50. Expression terminal3 = new TerminalExpression("C");
  51. Expression terminal4 = new TerminalExpression("D");
  52. // B C
  53. Expression alternation1 = new OrExpression(terminal2, terminal3);
  54. // A Or (B C)
  55. Expression alternation2 = new OrExpression(terminal1, alternation1);
  56. // D And (A Or (B C))
  57. return new AndExpression(terminal4, alternation2);
  58. }
  59. public static void main(String[] args) {
  60. Expression define = buildInterpreterTree();
  61. String context1 = "D A";
  62. String context2 = "A B";
  63. System.out.println(define.interpret(context1));
  64. System.out.println(define.interpret(context2));
  65. }
  66. }
  67. 运行结果
  68. true
  69. false

JDK中的体现