测试语法的歧义
我正在写一种正式语言的语法。 理想情况下,我希望该语法是明确的,但这可能是不可能的。 无论哪种情况,我都想在开发语法时了解所有可能的含糊之处。 我怎样才能做到这一点?
到目前为止,在我开发语言的大部分时间里,我会转向Bison,为它写一个LR(1)语法,以详细模式运行Bison并查看所有的shift-reduce和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 */ ;
input ()
可以被解释为空列表,或者它可以被解释为由单个空元素组成的列表。 生成的解析器选择以前的解释,但我希望能够手动验证该选择。
ANTLRErrorListener.reportAmbiguity
方法表明ANTLR可能能够在运行时执行一些歧义测试。 但我想这只是告诉你一个给定输入的解析是否含糊不清。 是否有一些策略可以利用这一点来检测所有歧义,并使用精心挑选的一组输入?
那么,据我所知,ANTLR没有真正的选择来检查歧义,除了它产生的错误,如果你写了一个模棱两可的语法,并提供一个触发歧义的输入。 不过,我知道一些可以检查歧义的工具。 它们都有不同的语法,我不知道使用ANTLR语法的任何工具。
就我个人而言,我发现工具3最容易使用,但也是最受限制的。 然而,重要的是要注意,没有任何工具可以100%确定; 如果这些工具表明你的语法不明确,那么它是模棱两可的,但是如果他们说你的语法是明确的,他们可能仍然是模棱两可的,因为他们无法测试无数种方式,你的语言可能是书面。
希望这可以帮助。
链接地址: http://www.djcxy.com/p/43713.html上一篇: Testing grammar for ambiguities
下一篇: Using ANTLR and Java to create a data binding code generator