我正在尝试实现一个 LR1 解析器,使用这篇wikipedia 文章中的帮助。我已经为 LR0 项创建了一个闭包函数,当尝试为 LR1 项创建闭包时(关于向 LR0 项添加前瞻的部分),我需要计算 FIRST 和 FOLLOW 集,但是 wiki 提到了2 个 FOLLOW 集,一个接受 LR0 项,另一个只接受项集和非终结符。第二个很容易理解:
pub fn lr0_follow_in_item_set(
rules: &[Rule],
item_set: &[LR0Item],
nt: &NonTerminal,
) -> BTreeSet<Terminal> {
let mut res = BTreeSet::new();
for item in item_set { //
if Some(TerminalOrNonTerminal::NonTerminal(*nt)) == item.next_symbol(rules) { // item in item set where dot is before the desired non terminal
res.extend(lr0_follow(rules, item)); // union of the follow sets
}
}
res
}
但是我找不到 LR0 项 ( lr0_follow(rules, item)
) 的 FOLLOW 实现,它是否与 FOLLOW(nonterminal) 相同,其中 nonterminal 是项点后的非终端(如果有,否则返回空集)?
注意:我的 LR1 解析器不使用 epsilon。
我不知道该尝试什么,因为我找不到此特定 FOLLOW 集的任何资源。