我在将以下非LL(1)语法转换为LL(1)语法时遇到了一些问题。有可能被改造吗?
> A ::= B | A ; B
> B ::= C | [ A ]
> C ::= D | C , D
> D ::= x | (C)
其中;,x,(,),[,]是终端。
答案 0 :(得分:0)
这里的主要问题是制作
A→A;乙
和
C→C,D
是左递归的。在这两种情况下,这些产品都会生成一系列由某种分隔符分隔的对象(第一种情况下是分号,第二种情况下是逗号),所以你可以像这样重写它们:
A→B;甲
C→D,C
这给出了语法
A→B | B;甲
B→C | [A]
C→D | D,C
D→x | (C)
现在的问题是A和C的产品有一个共同的前缀。但这没什么值得担心的:我们可以像这样留下因素:
A→B H
H→ε| ;甲
B→C | [A]
C→D I
我→ε| ç
D→x | (C)
我相信这个语法现在是LL(1)。