Parsing 语法歧义测试
我正在为一种正式语言写语法。理想情况下,我希望语法是明确的,但这可能是不可能的。在任何一种情况下,我都想在发展语法的同时了解所有可能的歧义。我该怎么做 到目前为止,在我开发语言的大部分时间里,我会转向Bison,为它编写LR(1)语法,以详细模式运行Bison,并查看它告诉我的所有shift-reduce和reduce冲突。确保我在每种情况下都同意它的选择 但现在我在一个项目中,Bison没有一个用于所需目标语言之一的代码生成器,并且已经在使用ANTLR。另外,语言不是LR(1),将其重写为LR(1)将需要在解析器完成后进行额外的语法检查,从而降低语法作为描述语言工具的表达能力 所以我现在和ANTLR一起工作,把我的语法教给它,一切似乎都很好。但ANTLR似乎并没有在编译时检查歧义。例如,以下语法不明确: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
grammar test;
lst: '(' ')' {System.out.println("a");}
| '(' elts ')' {System.out.println("b");} ;
elts: elt (',' elt)* ;
elt: 'x' | /* empty */ ;
输入()
可以解释为空列表,也可以解释为由单个空元素组成的列表。生成的解析器选择前一种解释,但我希望能够手动验证该选择
- 有没有命令行开关可以让ANTLR告诉我歧义
- 或者我可以在语法文件中设置一个选项
- 或者我应该使用其他工具来检查语法是否有歧义
- 如果是这样的话,是否有一个已经可以读取ANTLR语法,或者我必须去掉所有的操作并将其归结为BNF
该方法表明,ANTLR可能能够在运行时执行一些模糊性测试。但我想这只会告诉你,对给定输入的解析是否有歧义。有没有什么策略可以让我利用它来检测所有的歧义,使用一组精心挑选的输入?好吧,据我所知,ANTLR没有真正的选择来检查歧义,除了在编写歧义语法并输入触发歧义的输入时产生的错误。不过,我知道一些可以检查歧义的工具。它们都有不同的语法,我不知道有哪个工具使用ANTLR语法
希望这有帮助。3。她很可爱。想知道如果你给它一些大的东西会发生什么+谢谢你告诉我们。@IraBaxter哈哈,我还没试过。如果我写了一个大语法,重写成那个语法将是一个乏味的任务。这个家伙提供了各种大语法和转换它们的方法。可能比手工(容易出错)重写要好。证明语法是明确的是一个“不可分”的问题。检查此项:除非您使用量子计算机?是的,将
DiagnosticErrorListener
附加到您的解析器将导致调用DiagnosticErrorListener\35; reportfulicity(…)
。在该方法中,可以获得以下信息:您生产的lst
中的备选方案1和2不明确。