【发布时间】:2015-05-26 11:05:15
【问题描述】:
我在将以下非 LL(1) 语法转换为 LL(1) 语法时遇到了一些问题。有没有可能变身?
> A ::= B | A ; B
> B ::= C | [ A ]
> C ::= D | C , D
> D ::= x | (C)
其中 ;, x, (, ), [,] 是终结符。
【问题讨论】:
我在将以下非 LL(1) 语法转换为 LL(1) 语法时遇到了一些问题。有没有可能变身?
> A ::= B | A ; B
> B ::= C | [ A ]
> C ::= D | C , D
> D ::= x | (C)
其中 ;, x, (, ), [,] 是终结符。
【问题讨论】:
这里的主要问题是产生式
A → A ;乙
和
C → C, D
是左递归的。在这两种情况下,这些产生式都会生成由某种分隔符分隔的对象字符串(第一种情况是分号,第二种情况是逗号),因此您可以像这样重写它们:
A → B ;一个
C → D, C
这给出了语法
A → B |乙;一个
B → C | [一]
C → D | D、C
D → x | (C)
现在的问题是 A 和 C 的产生式有一个共同的前缀。但这没什么好担心的:我们可以像这样对它们进行左因子:
A → B H
H → ε | ;一个
B → C | [一]
C → D I
我 → ε | C
D → x | (C)
我相信这个语法现在是 LL(1)。
【讨论】: