我有以下语法:
S -> S+S|SS|S*|(S)|a
如何将其转换为LL(1)语法?
我试图消除左递归,所以我得到了
S->(S)S'|aS'
S'->+SS'|SS'|*S'|epsilon
我还尝试过先进行左分解,然后消除左递归,我得到了类似的东西:
S->(S)S"|aS"
S"->S'S"|epsilon
S'->+S|*|S
但是我仍然没有一个完美的答案。我觉得语法仍然不是LL(1)。请帮忙。
最佳答案
尝试编写语法可能会有所帮助,以便您阅读一些完整的术语,然后选择尝试以某种方式扩展它。例如,您可以尝试如下操作:
S→术语
条款→CoreTerm OptMore
CoreTerm→ (术语)
OptMore→ε|条款| +条款| * OptMore
例如,您将a(a + a)* a导出为
小号
⇒学期
⇒CoreTerm OptMore
⇒OptMore
⇒学期
⇒CoreTerm OptMore
⇒一个(CoreTerm OptMore)OptMore
⇒一个(OptMore)OptMore
⇒a(a +项)OptMore
⇒a(a + CoreTerm OptMore)OptMore
⇒a(a +一个OptMore)OptMore
⇒a(a + a)OptMore
⇒a(a + a)* OptMore
⇒a(a + a)*项
⇒a(a + a)* CoreTerm OptMore
⇒a(a + a)*一个OptMore
⇒a(a + a)* a
要看到这是LL(1)语法,这是FIRST集:
以下是FOLLOW集:
现在,我们可以填写解析表:
| a | ( | + | * | ) | $
---------+------------------+------------------+--------+-----------+-----+------
S | Term | Term | | | |
Term | CoreTerm OptMore | CoreTerm OptMore | | | |
CoreTerm | a | (Term) | | | |
OptMore | Term | Term | + Term | * OptMore | eps | eps
因此,该语法确实是LL(1)。