解释器模式

本文涉及的产品
全局流量管理 GTM,标准版 1个月
云解析 DNS,旗舰版 1个月
公共DNS(含HTTPDNS解析),每月1000万次HTTP解析
简介: 解释器模式是一种行为型设计模式,用于定义语言的文法表示并提供解释器处理语句或表达式。它将语法规则与解释逻辑分离,便于扩展和维护。适用于简单的语法规则、固定文法结构及重复使用的语法解释场景,如数学表达式求值、SQL解析和简单脚本语言。优点包括易于扩展新规则和分离语法逻辑,但复杂文法会导致类数量激增,维护困难。

解释器模式详解

概念

解释器模式(Interpreter Pattern)是一种行为型设计模式,用于定义一个语言的文法表示,并提供一个解释器来处理该语言中的语句或表达式。它可以让语法规则和解释逻辑分离,从而轻松地扩展和维护。

特点

  • 分离语法和逻辑:语言的规则由语法树表示,解释逻辑由解释器实现。
  • 递归调用:通常通过递归结构解析和计算语法树。
  • 扩展性强:新增规则只需扩展语法树节点和解释逻辑。

适用场景

  • 简单的语法规则:适用于开发简单的脚本语言、配置文件解析器等。
  • 固定文法结构:需要定义一套固定文法并对其进行解析。
  • 重复使用的语法解释:如表达式求值器、命令解析器。

使用案例

1. 数学表达式求值

  • 场景:对表达式如3 + 5 * (2 - 4)进行解析和计算。
  • 解决:用语法树表示表达式,并实现解释器计算结果。

2. SQL解析

  • 场景:实现对SQL查询语句的解析和执行。
  • 解决:构建SQL语法树并解析执行。

3. 简单脚本语言

  • 场景:如游戏中配置简单行为脚本。
  • 解决:为脚本语言定义文法规则和解释器。

优缺点

优点 缺点
易于扩展新规则,符合开闭原则 文法复杂时会导致类数量激增,难以维护
文法和解释逻辑分离,结构清晰 不适用于复杂语法,会增加系统复杂性
便于实现自定义语言和表达式解析 对效率要求高的场景不适用,性能可能较低

类图


C++实现

#include <iostream>
#include <string>
#include <memory>
#include <vector>

// 上下文类
class Context {
public:
   std::string input;
   int output = 0;
};

// 抽象表达式
class AbstractExpression {
public:
   virtual ~AbstractExpression() = default;
   virtual void Interpret(Context& context) = 0;
};

// 终结符表达式
class TerminalExpression : public AbstractExpression {
private:
   std::string match;
public:
   explicit TerminalExpression(const std::string& match) : match(match) {}
   void Interpret(Context& context) override {
       if (context.input.find(match) != std::string::npos) {
           context.output++;
       }
   }
};

// 非终结符表达式
class NonTerminalExpression : public AbstractExpression {
private:
   std::vector<std::unique_ptr<AbstractExpression>> expressions;
public:
   void Add(std::unique_ptr<AbstractExpression> expression) {
       expressions.push_back(std::move(expression));
   }

   void Interpret(Context& context) override {
       for (auto& expression : expressions) {
           expression->Interpret(context);
       }
   }
};

// 示例用法
int main() {
   Context context{"hello world"};
   NonTerminalExpression root;
   root.Add(std::make_unique<TerminalExpression>("hello"));
   root.Add(std::make_unique<TerminalExpression>("world"));

   root.Interpret(context);
   std::cout << "Matched words: " << context.output << std::endl;

   return 0;
}


C#实现

using System;
using System.Collections.Generic;

// 上下文类
public class Context {
   public string Input { get; set; }
   public int Output { get; set; } = 0;
}

// 抽象表达式
public abstract class AbstractExpression {
   public abstract void Interpret(Context context);
}

// 终结符表达式
public class TerminalExpression : AbstractExpression {
   private readonly string _match;

   public TerminalExpression(string match) {
       _match = match;
   }

   public override void Interpret(Context context) {
       if (context.Input.Contains(_match)) {
           context.Output++;
       }
   }
}

// 非终结符表达式
public class NonTerminalExpression : AbstractExpression {
   private readonly List<AbstractExpression> _expressions = new();

   public void Add(AbstractExpression expression) {
       _expressions.Add(expression);
   }

   public override void Interpret(Context context) {
       foreach (var expression in _expressions) {
           expression.Interpret(context);
       }
   }
}

// 示例用法
class Program {
   static void Main(string[] args) {
       var context = new Context { Input = "hello world" };
       var root = new NonTerminalExpression();
       root.Add(new TerminalExpression("hello"));
       root.Add(new TerminalExpression("world"));

       root.Interpret(context);
       Console.WriteLine($"Matched words: {context.Output}");
   }
}

目录
相关文章
|
3月前
|
设计模式 存储 缓存
Java设计模式 - 解释器模式(24)
Java设计模式 - 解释器模式(24)
|
7月前
|
设计模式 监控 Java
聊聊Java设计模式-解释器模式
解释器模式(Interpreter Design Pattern)指给定一个“语言”,定义它的文法的一种表示,并定义一个解释器,这个解释器使用该表示来解释语言中的句子。这里所指的“语言”是指使用规定格式和语法的代码。
88 4
聊聊Java设计模式-解释器模式
|
7月前
|
设计模式 SQL 自然语言处理
行为型 解释器模式
行为型 解释器模式
45 0
|
设计模式 SQL Java
设计模式~解释器模式(Interpreter)-19
解释器模式(Interpreter Pattern)提供了评估语言的语法或表达式的方式,它属于行为型模式。这种模式实现了一个表达式接口,该接口解释一个特定的上下文。这种模式被用在 SQL 解析、符号处理引擎等。 目录 (1)优点: (2)缺点: (3)使用场景: (4)注意事项: (5)应用实例: 代码
73 0
|
设计模式 存储 XML
设计模式之解释器模式
设计模式之解释器模式
132 0
设计模式之解释器模式
|
设计模式 算法 Java
设计模式-行为型模式:解释器模式
设计模式-行为型模式:解释器模式
|
设计模式 JavaScript 编译器
我学会了,解释器模式
解释器模式属于行为型模式,这个类型的设计模式总结出了 类、对象之间的经典交互方式,将类、对象的行为和使用解耦了,花式的去使用对象的行为来完成特定场景下的功能。
93 0
我学会了,解释器模式
|
设计模式 Java
Java设计模式 ->解释器模式
Java设计模式 ->解释器模式
90 0
|
设计模式 算法
中介者模式与解释器模式(1)
中介者模式与解释器模式(1)
136 0
中介者模式与解释器模式(1)