测试含糊不清的语法

时间:2016-03-10 10:57:57

标签: parsing antlr grammar antlr4 context-free-grammar

我正在为正式语言编写语法。理想情况下,我希望这种语法是明确的,但这可能是不可能的。在任何一种情况下,我都想在开发语法时了解所有可能的含糊之处。我怎么能这样做?

到目前为止,在我开发语言的大部分时间里,我转向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 */ ;

输入()可以解释为空列表,也可以解释为由单个空元素组成的列表。生成的解析器选择前一种解释,但我希望能够手动验证该选择。

  • 我是否可以使用命令行开关让ANTLR告诉我歧义?
  • 或许我可以在语法文件中设置一个选项?
  • 或者我应该使用其他工具检查歧义的语法?
  • 如果是这样,是否有一个已经可以阅读ANTLR语法,或者我是否必须删除所有操作并将其归结为BNF?

ANTLRErrorListener.reportAmbiguity方法表明ANTLR 可能能够在运行时执行一些模糊度测试。但我想这只会告诉你给定输入的解析是否含糊不清。是否有一些策略如何利用这一点来检测所有歧义,使用一组精心选择的输入?

1 个答案:

答案 0 :(得分:3)

嗯,据我所知,ANTLR没有真正的选项可以检查歧义,除了它产生的错误,如果你写了一个含糊不清的语法并提供一个触发歧义的输入。我知道,但是我知道一些可以检查歧义的工具。它们都有不同的语法,我不知道任何使用ANTLR语法的工具。

  1. 一个名为AtoCC的软件有一个名为KfG的工具,可以检查模糊性。
  2. ACLA(使用语言近似检查歧义)。
  3. Context Free Grammar Tool
  4. 就个人而言,我发现工具3最容易使用,但也是最受限制的。然而,重要的是要注意,没有一个工具可以100%确定;如果工具说你的语法含糊不清,那就不明确了,但是如果他们说你的语法是明确的,他们可能仍然含糊不清,因为他们无法测试无数种方式,你的语言可能是写入。

    希望这有帮助。