ANTLR4中的无序子产品

ANTLR4中的无序子产品,antlr4,Antlr4,我想在ANTLR中指定一个产品,其子产品的顺序无关紧要。请注意,我希望每个子产品发生一次。实现这一点的蛮力方式如下所示: grammar Foo; r : (A B) | (B A) ; A : 'a' ; B : 'b' ; 随着子产品的增加,排列的数量增加。。。n/(n-k) 显然,上述解决方案并不实用。在ANTLR中是否有一种结构可以更简洁地描述这样的排列 不,在ANTLR中无法描述产品中的排列。您需要将A、B或C匹配三次,然后使用A检查是否所有三个令牌都已精确匹配一次 您可以使用自

我想在ANTLR中指定一个产品,其子产品的顺序无关紧要。请注意,我希望每个子产品发生一次。实现这一点的蛮力方式如下所示:

grammar Foo;

r : (A B) | (B A) ;

A : 'a' ;
B : 'b' ;
随着子产品的增加,排列的数量增加。。。n/(n-k)


显然,上述解决方案并不实用。在ANTLR中是否有一种结构可以更简洁地描述这样的排列

不,在ANTLR中无法描述产品中的排列。您需要将
A
B
C
匹配三次,然后使用A检查是否所有三个令牌都已精确匹配一次

您可以使用自定义代码和谓词在语法内部执行此操作,但这会使您的语法很难阅读:最好使用侦听器执行此操作

grammar Foo2;

r : (A B C) | (A C B) | (B A C) | (B C A) | (C A B) | (C B A) ;

A : 'a' ;
B : 'b' ;
C : 'c' ;