ANTLR4中的无序子产品

时间:2014-09-16 18:54:29

标签: antlr4

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

grammar Foo;

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

A : 'a' ;
B : 'b' ;

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

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' ;

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

1 个答案:

答案 0 :(得分:6)

不,没有办法在ANTLR中描述生产中的排列。您需要与ABC匹配三次,然后使用listener检查所有三个令牌是否恰好匹配一次。

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