是否有一个解析器生成器能够生成一个解析器,可以解析它:S→'x'S'x'| 'X'

时间:2011-02-16 14:42:14

标签: parsing antlr generator

有一段时间我对ANTLR无法解析以下上下文无关语法规则的事实感到好奇:S→'x'S'x'| 'X'。

这对我来说似乎并不复杂。

据我所知,ANTLR是最强大的LL解析器。 是否有其他类型的解析器生成器(LR或其他)能够为此生成解析器?

GR,

科恩

2 个答案:

答案 0 :(得分:5)

对于任何n,我认为你的语法不是LL(n)或LALR(n)或LR(n)。证明:修复任何n。您的输入流以n x个字符开头,后跟另一个字符。 此时,没有任何进一步的预测,你需要上下移动吗?

由于标准的解析器生成器只能处理其中一个类中的语言(并且很多只用于n的小值),因此您找不到处理输入的语言就不足为奇了。你可能想重新考虑你的语法是否真的需要看它的样子;对于你给出的简化例子,你也可以有S→'x''x'S |例如'x'。

答案 1 :(得分:2)

在Antlr中,您需要添加一个句法谓词来解决歧义,如下所示:

grammar fred;

sentence : ( 'x' 'x' 'x' ) => 'x' sentence 'x'
         |                    'x'
         ;

我认为这不应该需要超过1个额外的前瞻标记。语义谓词说“如果你看到'x'后跟另一个'x',请尝试第一种选择。

Antlr 3.3 / Antlrworks 1.4.2很满意: enter image description here

另一个选择是重构你的语法,以消除引入歧义的替代方法:

grammar fred;

start    : sentence
         ;

sentence : 'x'  'x'('x' 'x')*  'x'
         |      'x'
         ;

enter image description here

我相信,这将为您提供与原始语法相同的解析树(或关闭)。