Parsing 语法歧义测试

Parsing 语法歧义测试,parsing,antlr,grammar,antlr4,context-free-grammar,Parsing,Antlr,Grammar,Antlr4,Context Free Grammar,我正在为一种正式语言写语法。理想情况下,我希望语法是明确的,但这可能是不可能的。在任何一种情况下,我都想在发展语法的同时了解所有可能的歧义。我该怎么做 到目前为止,在我开发语言的大部分时间里,我会转向Bison,为它编写LR(1)语法,以详细模式运行Bison,并查看它告诉我的所有shift-reduce和reduce冲突。确保我在每种情况下都同意它的选择 但现在我在一个项目中,Bison没有一个用于所需目标语言之一的代码生成器,并且已经在使用ANTLR。另外,语言不是LR(1),将其重写为LR

我正在为一种正式语言写语法。理想情况下,我希望语法是明确的,但这可能是不可能的。在任何一种情况下,我都想在发展语法的同时了解所有可能的歧义。我该怎么做

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

该方法表明,ANTLR可能能够在运行时执行一些模糊性测试。但我想这只会告诉你,对给定输入的解析是否有歧义。有没有什么策略可以让我利用它来检测所有的歧义,使用一组精心挑选的输入?

好吧,据我所知,ANTLR没有真正的选择来检查歧义,除了在编写歧义语法并输入触发歧义的输入时产生的错误。不过,我知道一些可以检查歧义的工具。它们都有不同的语法,我不知道有哪个工具使用ANTLR语法

  • 一个名为KfG的软件有一个名为KfG的工具,可以检查歧义
  • (使用语言近似进行歧义检查)
  • 就个人而言,我觉得工具3最容易使用,但也是最有限的。然而,重要的是要注意,没有一个工具可以100%确定;如果工具说你的语法是不明确的,那么它就是不明确的,但是如果他们说你的语法是明确的,那么它们可能仍然是不明确的,因为它们无法测试你的语言可以被书写的无数种方式


    希望这有帮助。

    3。她很可爱。想知道如果你给它一些大的东西会发生什么+谢谢你告诉我们。@IraBaxter哈哈,我还没试过。如果我写了一个大语法,重写成那个语法将是一个乏味的任务。这个家伙提供了各种大语法和转换它们的方法。可能比手工(容易出错)重写要好。证明语法是明确的是一个“不可分”的问题。检查此项:除非您使用量子计算机?是的,将
    DiagnosticErrorListener
    附加到您的解析器将导致调用
    DiagnosticErrorListener\35; reportfulicity(…)
    。在该方法中,可以获得以下信息:您生产的
    lst
    中的备选方案1和2不明确。