我想在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中是否有一个构造以更简洁的方式描述这样的排列?
答案 0 :(得分:6)
不,没有办法在ANTLR中描述生产中的排列。您需要与A
,B
或C
匹配三次,然后使用listener检查所有三个令牌是否恰好匹配一次。
你可以使用自定义代码和谓词在你的语法中完成,但这会使你的语法很难阅读:最好用听众来做。