Skip to content
← 返回设计模式列表
设计意图与对象责任

解释器 ​

用对象表示并求值简单语法。

行为型

说明 ​

适合规则有限的表达式;语法复杂时优先使用成熟解析器。

分析 ​

Number 是终结表达式,Add 是由两个子表达式组成的复合表达式。调用 Eval 时,复合节点递归求值并组合结果,这对应一棵简单语法树。

此处输入已是表达式树,不包含从字符串生成树的词法或语法分析。Add 求值先取得两个子节点的值,再相加得到 5;扩展乘法可增加节点类型。若直接接受用户构造的深层表达式,应限制深度与节点数;循环引用会让递归无法结束,整数溢出也不会因使用模式而消失。

查看图表代码

适用前提与边界 ​

规则一旦出现优先级、变量和错误恢复等需求,就应使用正式解析器。 交互流程很短且稳定时,直接调用通常更容易理解。

示例输入与调用 ​

go
expression := Add{Left: Number(2), Right: Number(3)}
	fmt.Println(expression.Eval())

运行输出 ​

text
5

完整 Go 示例 ​

go
package main

import "fmt"

type Expr interface{ Eval() int }
type Number int

func (n Number) Eval() int {
	return int(n)
}

type Add struct{ Left, Right Expr }

func (a Add) Eval() int {
	return a.Left.Eval() + a.Right.Eval()
}

func main() {
	expression := Add{Left: Number(2), Right: Number(3)}
	fmt.Println(expression.Eval())
}

继续阅读