我使用过一些解析器(Yacc、Bison 和 Menhir)。如果我没记错的话,它们都允许规则为空。这是我使用 Menhir 的一个例子,它是我用得最多的一个。
some_list:
| {[]}
| some_non_empty_list { $1 }
some_non_empty_list:
| SEMICOLON some_list { $2 }
| element { [$1] }
| element some_non_empty_list { $1 :: $2 }
重要的部分是 some_list 可以减少虚无。
我目前对构建解析表的算法的理解(构建 NFA,从 NFA 构建 DFA,最小化)使我认为这会导致整个地方的移位/减少冲突。但它显然没有,因为我的代码当时有效。
那么如何构建一个可以接受那些空规则的解析表呢?