解释器模式(Interpreter Pattern)是一种行为型设计模式,用于对一个语言的语法或表达式进行解释。它定义了一个表达式的文法,并且实现了一个解释器来处理这种语法。通常适用于需要解析和执行简单语言或表达式的情况。
抽象表达式(Abstract Expression):声明解释器的接口。
终结符表达式(Terminal Expression):表示文法中的终结符。
非终结符表达式(Nonterminal Expression):表示文法中的非终结符,通常由多个终结符或非终结符组合而成。
上下文(Context):包含解释器之外的一些全局信息。
解析复杂规则:将复杂的规则分解为简单的表达式,并通过递归或组合的方式解释这些规则。
扩展性:可以通过增加新的表达式类来扩展解释器的功能。
分离语法与逻辑:将语法结构与具体的业务逻辑分离,便于维护和扩展。
小型语言解析:如配置文件、DSL(领域特定语言)等。
算术表达式求值:如计算器程序。
查询语言:如 SQL 查询的简单解析。
规则引擎:基于规则的系统中,动态解析规则并执行。
以下是一个简单的例子,展示如何使用解释器模式解析和计算算术表达式(如 1 + 2 或 3 - 1)。
package main
import (
"fmt"
"strconv"
)
// 抽象表达式接口
type Expression interface {
Interpret() int
}
// 终结符表达式(数字)
type NumberExpression struct {
value int
}
func (ne *NumberExpression) Interpret() int {
return ne.value
}
// 非终结符表达式(加法)
type AddExpression struct {
left Expression
right Expression
}
func (ae *AddExpression) Interpret() int {
return ae.left.Interpret() + ae.right.Interpret()
}
// 非终结符表达式(减法)
type SubtractExpression struct {
left Expression
right Expression
}
func (se *SubtractExpression) Interpret() int {
return se.left.Interpret() - se.right.Interpret()
}
// 上下文:解析输入字符串并构建表达式树
type Context struct {
input string
index int
}
func (c *Context) Parse() Expression {
var left, right Expression
var op rune
// 解析左操作数
num, _ := strconv.Atoi(c.input[:c.index])
left = &NumberExpression{value: num}
// 解析操作符
op = rune(c.input[c.index])
c.index++
// 解析右操作数
num, _ = strconv.Atoi(c.input[c.index:])
right = &NumberExpression{value: num}
// 根据操作符创建表达式
if op == '+' {
return &AddExpression{left: left, right: right}
} else if op == '-' {
return &SubtractExpression{left: left, right: right}
}
return nil
}
func main() {
// 示例输入
expressions := []string{"1+2", "5-3", "1+7"}
for _, expr := range expressions {
context := &Context{
input: expr,
index: 1, // 操作符位置
}
// 构建表达式树
expression := context.Parse()
// 计算结果
result := expression.Interpret()
fmt.Printf("%s = %d\n", expr, result)
}
}