如何使用递归使 ANTLR 消耗所有可用元素?

How to make ANTLR consume all available elements using recursion?

这是我的语法:

grammar test;

text: foo EOF;

foo:
    'X'
    |
    '('
    foo
    ')'
    |
    foo
    '!'
    |
    foo
    tail
    ;

tail: (' ' foo)+;

这是它完美解析的输入:

X (X! (X)! (X X X)!!!) X

但是,正如我之前解释的 ,输出树有太多 tail 个元素。有可能解决这个问题吗?

感谢@kaby76,找到解决方案:

foo:  
  'X' tail? 
  | 
  '(' foo ')' tail? 
  | 
  foo '!' tail? 
  ; 
tail: 
  (
    ' ' 'X' 
    | 
    ' ' '(' foo ')' 
    | 
    ' ' foo '!'
  )+ 
  ;