所以我有一些语法不适用于自上而下的解析器,因为它有左递归:
L::= A a | B b
A::= L b | a a
B::= b B b | b a
所以为了解决这个问题,我必须删除左递归。为此,我做了一些类似替代的事情:
L::= A a | B b
A::= A a b | B b b | a a (I plugged in the possible values of "L")
A然后转向(我相信):
A::= a a A' | B b b
A'::= a b A' | ε
我相当肯定我是正确的(不过,如果我不是,也不会感到惊讶)。我现在正在苦苦挣扎的地方是从“B b b”中删除左递归。我已经尝试了很多方法,但我认为它们中的任何一个都不起作用。这似乎是最合乎逻辑的,但也很丑陋(因此说它可能是错误的)。从操作 B::= b B b | 开始 巴
B::= b B b | b a
B::= b B' (they both start with b, so maybe i can pull it out?)
B'::= B b | a
B'::= b B' b | a (substituted B's value in)
B'::= b B" | a
B"::= b B" |a B" | ε
所以我想展示最终确定的 B 是什么:
B::= b B'
B'::= b B" | a
B"::= b B" | a B" | ε
这似乎太丑了,不正确。特别是因为我必须将它插入我创建的新“A”终端。
有人可以帮我吗?不知道我是否以正确的方式解决这个问题。之后我应该能够创建一个 LL(1) 解析表(应该能够自己完成那部分)。
谢谢。