有一段时间我对ANTLR无法解析以下上下文无关语法规则的事实感到好奇:S→'x'S'x'| 'X'。
这对我来说似乎并不复杂。
据我所知,ANTLR是最强大的LL解析器。 是否有其他类型的解析器生成器(LR或其他)能够为此生成解析器?
GR,
科恩
答案 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很满意:
另一个选择是重构你的语法,以消除引入歧义的替代方法:
grammar fred;
start : sentence
;
sentence : 'x' 'x'('x' 'x')* 'x'
| 'x'
;
我相信,这将为您提供与原始语法相同的解析树(或关闭)。