我应该如何 运行 针对 "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); }
我正在尝试匹配并收集以下语法中的所有 "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); }