解释器
用对象表示并求值简单语法。
行为型
说明
适合规则有限的表达式;语法复杂时优先使用成熟解析器。
分析
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())
}继续阅读
- 设计意图与对象责任
- 设计意图与对象责任
- 设计意图与对象责任