MvG*_*MvG 5 grammar parsing antlr context-free-grammar antlr4
我正在为正式语言编写语法。理想情况下,我希望该语法是明确的,但这可能是不可能的。无论哪种情况,我都想在开发语法时了解所有可能的歧义。我怎样才能做到这一点?
到目前为止,当我开发一门语言时,大部分时间我都会求助于 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 */ ;
Run Code Online (Sandbox Code Playgroud)
输入()可以解释为空列表,也可以解释为由单个空元素组成的列表。生成的解析器选择前一种解释,但我希望能够手动验证该选择。
该ANTLRErrorListener.reportAmbiguity方法表明 ANTLR可能能够在运行时执行一些歧义测试。但我想这只会告诉您对给定输入的解析是否有歧义。有什么策略可以利用它来检测所有的歧义,使用一组精心挑选的输入吗?