如何让 ANTLR 规则消耗所有可能的元素,而不仅仅是第一个?

How to make ANTLR rule consume all possible elements, not only the first one?

这是我的语法:

grammar test;
text: foo EOF;
foo: 'X' | foo tail;
tail: (' ' foo)+;

这是输入:

X X X X

树看起来像这样:

相反,我希望输出树中只存在一个 tail,它必须包含三个 foo 元素。我该怎么做?

通过从 foo: 'X' | foo tail; 中删除左递归,您可以更好地了解为什么得到多个 tail:

foo: 'X' tail*;

这也适用于多个 'X',因为 tail 包含另一个递归(回到 foo)。