我有以下语法:
A-> AB|CA
B-> Bd | ef
C-> e|f
我删除了左递归,如下所示,我的语法如下所示:
A->CAA'
A'-> BA'
A'-> epsilon
B-> efB'
B'->dB'
B'-> epsilon
C->e
C->f
在为此构建解析表时,我遇到的问题是不明确的。 有人能指出我正确的方向吗? 或者我认为我在计算Parse Table的First和Follow Sets时犯了错误。
答案 0 :(得分:1)
修改强>
Woops。原始语法不会导出任何终端字符串,因此尝试使其成为LL(1)是没有意义的。第一个作品总是生成一个A
的表单,而A
没有其他派生。你有没有跳过某些内容或在帖子中输入错字?
待修复:
你的左递归移除是好的。现在您需要为每个生产预测集:
A->CAA' first(CAA') = { e, f }
A'-> BA' first(BA') = { e }
A'-> epsilon follow(A') = follow(A) = { end of input }
B-> efB' first(efB') = { e }
B'->dB' first(dB') = { d }
B'-> epsilon follow(B') = { end of input }
C->e first(e) = { e }
C->f first(f) = { f }
这里没有歧义,因为对应于任何给定左手侧的每个右手侧的预测集具有零成对交叉点。
你看到了什么含糊不清的地方?