测试语法的歧义

我正在写一种正式语言的语法。 理想情况下,我希望该语法是明确的,但这可能是不可能的。 无论哪种情况,我都想在开发语法时了解所有可能的含糊之处。 我怎样才能做到这一点?

到目前为止,在我开发语言的大部分时间里,我会转向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 ()可以被解释为空列表,或者它可以被解释为由单个空元素组成的列表。 生成的解析器选择以前的解释,但我希望能够手动验证该选择。

  • 有没有命令行开关可以让ANTLR告诉我有关歧义的问题?
  • 或者我可以在语法文件中设置一个选项?
  • 或者我应该使用其他工具来检查语法是否有歧义?
  • 如果是这样,是否有一个已经可以读取ANTLR语法,或者我是否必须删除所有的动作,并将其归结为BNF自己?
  • ANTLRErrorListener.reportAmbiguity方法表明ANTLR可能能够在运行时执行一些歧义测试。 但我想这只是告诉你一个给定输入的解析是否含糊不清。 是否有一些策略可以利用这一点来检测所有歧义,并使用精心挑选的一组输入?


    那么,据我所知,ANTLR没有真正的选择来检查歧义,除了它产生的错误,如果你写了一个模棱两可的语法,并提供一个触发歧义的输入。 不过,我知道一些可以检查歧义的工具。 它们都有不同的语法,我不知道使用ANTLR语法的任何工具。

  • 名为AtoCC的软件有一个名为KfG的工具,可以检查模糊性。
  • ACLA(使用语言近似的歧义检查)。
  • 上下文免费语法工具。
  • 就我个人而言,我发现工具3最容易使用,但也是最受限制的。 然而,重要的是要注意,没有任何工具可以100%确定; 如果这些工具表明你的语法不明确,那么它是模棱两可的,但是如果他们说你的语法是明确的,他们可能仍然是模棱两可的,因为他们无法测试无数种方式,你的语言可能是书面。

    希望这可以帮助。

    链接地址: http://www.djcxy.com/p/43713.html

    上一篇: Testing grammar for ambiguities

    下一篇: Using ANTLR and Java to create a data binding code generator