Java ANTLR:多个AST使用相同的歧义语法?

Java ANTLR:多个AST使用相同的歧义语法?,java,antlr,Java,Antlr,我正在为一种小型查询语言构建一个ANTLR解析器。根据定义,查询语言是不明确的,我们需要所有可能的解释(AST)来处理查询 Example: query : CLASSIFIED_TOKEN UNCLASSIFIED_TOKEN | ANY_TOKEN UNCLASSIFIED_TOKEN ; 在这种情况下,如果输入同时匹配两个规则,我需要得到两个具有两种解释的AST。ANTLR将返回第一个匹配的AST 你知道一个简单的方法来获

我正在为一种小型查询语言构建一个ANTLR解析器。根据定义,查询语言是不明确的,我们需要所有可能的解释(AST)来处理查询

Example:

    query   : CLASSIFIED_TOKEN UNCLASSIFIED_TOKEN 
            | ANY_TOKEN UNCLASSIFIED_TOKEN 
            ;
在这种情况下,如果输入同时匹配两个规则,我需要得到两个具有两种解释的AST。ANTLR将返回第一个匹配的AST

你知道一个简单的方法来获得相同语法的所有可能的AST吗?我考虑多次运行解析器,“关闭”迭代之间已经匹配的规则;这看起来很脏。有更好的办法吗?也许其他支持java的lex/parser工具可以做到这一点


谢谢

我怀疑您是否能够让ANTLR在不大规模重写代码的情况下返回多个解析树

我相信您必须将歧义划分为各自的明确语法,并多次运行解析。如果不明确产品的总数很大,则可能会有一组无法管理的不同语法。例如,对于三个二进制歧义(两个选项),您将得到8个不同的语法,尽管如果一个歧义分支消除了一个或多个其他歧义,可能会稍微少一些


祝你好运

如果我是你,我会消除歧义。您通常可以通过使用上下文信息来确定实际触发哪些语法规则。例如,在

C* X;
在C语言中(不是你的语言,但这只是为了说明一点),你无法判断这是一个无意义的乘法(用C写是合法的),还是一个“指向C的指针”类型的变量X的声明。因此,有两种有效的(不明确的)解析。但是,如果您知道C是一个类型声明(从某些上下文,可能是早期的代码声明),那么您可以通过黑客攻击解析器来消除不适当的选择,并最终得到一个“正确”的解析,没有歧义

如果您真的没有上下文,那么您可能需要一个GLR解析器,它可以在最终的树中生成两个解析。我不知道Java有什么可用的

我们的[不是基于Java的产品]具有GLR解析支持,我们一直使用它来解析有歧义的困难语言。我们处理上面的C示例的方法是生成两个解析,因为GLR解析器很乐意这样做,然后如果我们有其他信息(如符号表),对树进行后处理以删除不适当的解析


DMS旨在支持对任意语言(如查询语言)的自定义分析和转换,并使语法的定义变得容易。一旦你有了一个上下文无关的语法(模棱两可与否),DMS就可以解析代码,你可以决定以后做什么。

组合学比这更糟糕。你的语法可能有三个潜在的歧义点,但实例源文本可能在不同的方向上进行任何练习。我不认为你能像你建议的那样合理地把语法分开。请看我在另一个答案中关于组合数学的评论。非常感谢!至少现在我知道我在找什么了,GLR解析器