我正在为正式语言编写语法。理想情况下,我希望这种语法是明确的,但这可能是不可能的。在任何一种情况下,我都想在开发语法时了解所有可能的含糊之处。我怎么能这样做?
到目前为止,在我开发语言的大部分时间里,我转向Bison,为它编写LR(1)语法,以详细模式运行Bison并查看所有shift-reduce和reduce - 减少它告诉我的冲突。确保我同意每种情况下的选择。
但现在我正处于一个项目中,Bison没有为所需的目标语言之一提供代码生成器,并且已经在使用ANTLR。此外,语言不是LR(1),并且将其重写为LR(1)将需要在解析器完成后进行额外的语法检查,从而降低语法作为描述语言的工具的表现力。
所以我现在正在使用ANTLR,用我的语法喂它,所有似乎都运行良好。但是ANTLR似乎并没有在编译时检查模糊性。例如,以下语法含糊不清:
grammar test;
lst: '(' ')' {System.out.println("a");}
| '(' elts ')' {System.out.println("b");} ;
elts: elt (',' elt)* ;
elt: 'x' | /* empty */ ;
输入()
可以解释为空列表,也可以解释为由单个空元素组成的列表。生成的解析器选择前一种解释,但我希望能够手动验证该选择。
ANTLRErrorListener.reportAmbiguity
方法表明ANTLR 可能能够在运行时执行一些模糊度测试。但我想这只会告诉你给定输入的解析是否含糊不清。是否有一些策略如何利用这一点来检测所有歧义,使用一组精心选择的输入?
答案 0 :(得分:3)
嗯,据我所知,ANTLR没有真正的选项可以检查歧义,除了它产生的错误,如果你写了一个含糊不清的语法并提供一个触发歧义的输入。我知道,但是我知道一些可以检查歧义的工具。它们都有不同的语法,我不知道任何使用ANTLR语法的工具。
就个人而言,我发现工具3最容易使用,但也是最受限制的。然而,重要的是要注意,没有一个工具可以100%确定;如果工具说你的语法含糊不清,那就不明确了,但是如果他们说你的语法是明确的,他们可能仍然含糊不清,因为他们无法测试无数种方式,你的语言可能是写入。
希望这有帮助。