Parsing 消除LL 1语法中的间接优先冲突

Parsing 消除LL 1语法中的间接优先冲突,parsing,context-free-grammar,parser-generator,Parsing,Context Free Grammar,Parser Generator,我正试图编写一个LL(1)解析器生成器,我遇到了一个语法问题,我知道它是LL(1),但我不能正确地考虑它们 例如,考虑语法: S -> As Ao As -> a As As -> Ɛ Ao -> a Ao -> Ɛ 现在这个语法在中有一个first-follow冲突,因此我执行Ɛ消去,并有: S -> As Ao S -> Ao As -> a As As -> a Ao -> a Ao -> Ɛ 在S和As中有第一个冲突的

我正试图编写一个LL(1)解析器生成器,我遇到了一个语法问题,我知道它是LL(1),但我不能正确地考虑它们

例如,考虑语法:

S -> As Ao
As -> a As
As -> Ɛ
Ao -> a
Ao -> Ɛ
现在这个语法在
中有一个first-follow冲突,因此我执行Ɛ消去,并有:

S -> As Ao
S -> Ao
As -> a As
As -> a
Ao -> a
Ao -> Ɛ
S
As
中有第一个冲突的。将
中的冲突解决为
会产生:

S -> As Ao
S -> Ao
As -> a As'
As' -> As
As' -> Ɛ 
Ao -> a
Ao -> Ɛ
它在
中有一个首跟冲突,如“
所述,当消除该冲突时,它只是循环。此外,
S
中的冲突无法通过左因子分解解决

我认为问题在于,如果我知道如何证明这一点,我相信问题会消失,因为初始语法可以转换为:

S -> As
As -> a As
As -> Ɛ
是否有解决此类冲突的标准技术

编辑: 我意识到上面的语法是模棱两可的。我真正感兴趣的语法是:

S -> a As Ao
As -> , a AS
As -> Ɛ
Ao -> ,
Ao -> Ɛ

例如,
a
的逗号分隔列表,带有可选的尾随逗号。

原始语法不明确,因此无法生成确定性解析器

当然,您可以很容易地消除歧义,因为该语言只是“零或更多
a
s”:

但问题大概是简化了一些更复杂的语法,
Ao
a
不同,但是
FIRST(as)
FIRST(Ao)
有一些共同的元素


一般来说,为这类语言编写LL(1)语法是困难的,而且这类语言确实可能不存在这样的语法。为了更详细地回答这个问题,有必要理解语法被称为LL(1)的说法的含义。

我正在生成一个解析器生成器,它可以使用python的语法。根据他们的文件,这是LL(1)。你猜我的语法是简化的是正确的。我遇到的问题是:
S->NUMBER(,NUMBER)*[,]
,这并不含糊。@altf4:这有帮助吗:我想可能是这样。我使用了从EBNF到BNF的不同转换。
S  ⇒ As
As ⇒ a As
As ⇒ Ɛ