ANTLR4中的无序子产品

hen*_*yau 3 antlr4

我想在ANTLR中指定一个产品,其子产品的顺序无关紧要.请注意,我希望每个子制作都出现一次.实现这一目标的蛮力方式看起来像这样:

grammar Foo;

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

A : 'a' ;
B : 'b' ;
Run Code Online (Sandbox Code Playgroud)

随着更多的子制作被添加,排列的数量增加...... n!/(nk)!

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' ;
Run Code Online (Sandbox Code Playgroud)

显然,上述解决方案并不实用.在ANTLR中是否有一个构造以更简洁的方式描述这样的排列?

Bar*_*ers 6

不,没有办法描述ANTLR中的生产中的排列.您将需要匹配A,BC三次,然后使用监听器来检查所有三个令牌是否已完全匹配一次.

你可以使用自定义代码和谓词在你的语法中完成它,但这会使你的语法很难阅读:最好用听众来做.