用 coroutine/goroutine 做 lexer
某天在读 dgraph 代码中解析 rdf 的 lexer 时,无意间发现了如下一段代码结构
type StateFn func(*Lexer) StateFn
func (l *Lexer) Run(f StateFn) *Lexer {
for state := f; state != nil; {
state = state(l)
}
return l
}
搜索了下,发现了2011年题为 “Lexical Scanning with Go” 的video, slide 阐述了这种 lexer 的形式
相对于传统的状态机函数在不同的 state 之间跳转,并采取对应的 action, stateFn 将两者组合了起来: 执行 action, 返回下一个 state, 从而使得代码更加清晰.
slide 中有一句话说得挺好
Concurrency is not about parallelism. Concurrency is a design approach