我应该如何 运行 针对 "expression+" 模式采取行动?

How should I run actions against "expression+" pattern?

我正在尝试匹配并收集以下语法中的所有 "fields":

fields a b c d e ...

我将使用字符串数组来包含所有这些 a b c d e 个字符:

fields
    : FIELDS fieldsExpression
    {  
        // always zero
        System.out.println ($fieldsExpression.value.size());
    }
    ;

fieldsExpression  returns [List<String> value]
    @{ $value = new ArrayList<String> (); }
    : Identifier
    { $value.add ($Identifier.text); }
    | Identifier fieldsExpression
    { $value.addAll ($fieldsExpression.value); }
    ;

现在,如果我这样做,我将得到一个空数组。有什么问题吗?

另外,我想知道如何匹配这个?

field
   : FIELDS Identifier+
   { ... }

这个 Identifier+ 将 return 多个 Identifier 但我不知道如何 "match" 它们和 "run actions" 它们。

有什么想法吗?

尝试:

fieldsExpression  returns [List<String> value] 
  : { $value = new ArrayList<String> (); }
    (Identifier { $value.add ($Identifier.text); })+
  ;

如果您调整第二个备选方案,您的示例也应该有效

| Identifier fieldsExpression
{ $value.add($Identifier.text);$value.addAll ($fieldsExpression.value); }