YON CISE

LR(0) 和 SLR(1) 的区别

按照网上的说法,两者主要区别就是 SLR(1) lookahead 了一个 token,LR(0) 是 0 个 token。但这里有一个点一开始让我很疑惑,LR(0) 在 Parse 的时候也是要看当前的 input 来决定状态怎么变化的,这不也是 lookahead 了一个 token 了嘛?后来看了 stackoverflow[1] 上的一个答案才恍然大悟,这里 lookahead 一个 token 的意思是说当状态机出现 shift/reduce 或者 reduce/reduce 冲突的时候通过 lookahead 一个 token 来解决冲突。LR(0) 之所以是 0 是因为它的状态机不存在 shift/reduce 或者 reduce/reduce 冲突,所以不需要通过 lookahead 一个 token 来解决冲突。

另外,SLR(1)、Canonical LR(1) 和 LALR(1) 都是 lookahead 一个 token 来解决状态机冲突,区别在于不同的 Parser 基于时间与空间的考量构建了不同的 Parsing table,所以这个 lookahead 的 token 决定的解决冲突的方式是不一样的。

[1] What is the difference between LR(0) and SLR parsing?