我正在尝试匹配这样的语法,
a in (1, 2, 3)
所以我写道:
| Identifier IN '(' ( inner = (StringLiteral | IntegerLiteral) ','? )+ ')'
{
/// print what?
}
匹配,但如何检索所有$inner.text
并在外部块中使用它们?
看起来'(' ( inner = (StringLiteral | IntegerLiteral) ','? )+ ')'
无法像词法分析器规则那样返回用户定义的值,我错了吗?
答案 0 :(得分:0)
查看手册的这一部分:https://theantlrguy.atlassian.net/wiki/display/ANTLR4/Parser+Rules#ParserRules-RuleElementLabels
基本上,您需要inner += Literal
,内部将被定义为List<Literal>
,并添加了所有元素。
另请注意,由于您的逗号是可选的(','?
),a in (1 2 3)
和a in (1 2, 3,)
也是有效输入。像这样:
array : '{' el+=INT (',' el+=INT)* '}' ;
(来自上面的链接)可能更接近你想要的。