给定一个语言, 定义它的文法的一种表示,并定义一个解释器, 该解释器使用该表示来解释语言中的句子。
此例来自心谭博客

  1. class Context {
  2. constructor() {
  3. this._list = []; // 存放 终结符表达式
  4. this._sum = 0; // 存放 非终结符表达式(运算结果)
  5. }
  6. get sum() {
  7. return this._sum;
  8. }
  9. set sum(newValue) {
  10. this._sum = newValue;
  11. }
  12. add(expression) {
  13. this._list.push(expression);
  14. }
  15. get list() {
  16. return [...this._list];
  17. }
  18. }
  19. class PlusExpression {
  20. interpret(context) {
  21. if (!(context instanceof Context)) {
  22. throw new Error("TypeError");
  23. }
  24. context.sum = ++context.sum;
  25. }
  26. }
  27. class MinusExpression {
  28. interpret(context) {
  29. if (!(context instanceof Context)) {
  30. throw new Error("TypeError");
  31. }
  32. context.sum = --context.sum;
  33. }
  34. }
  35. /** 以下是测试代码 **/
  36. const context = new Context();
  37. // 依次添加: 加法 | 加法 | 减法 表达式
  38. context.add(new PlusExpression());
  39. context.add(new PlusExpression());
  40. context.add(new MinusExpression());
  41. // 依次执行: 加法 | 加法 | 减法 表达式
  42. context.list.forEach(expression => expression.interpret(context));
  43. console.log(context.sum);

优点

  • 易于改变和扩展文法。
  • 由于在解释器模式中使用类来表示语言的文法规则,因此可以通过继承等机制来改变或扩展文法

    缺点

  • 执行效率较低,在解释器模式中使用了大量的循环和递归调用,因此在解释较为复杂的句子时其速度慢

  • 对于复杂的文法比较难维护