Java 如何在ANTLR中迭代生产

Java 如何在ANTLR中迭代生产,java,parsing,antlr,rules,production,Java,Parsing,Antlr,Rules,Production,让我们假设具有2个ANTLR语法的以下场景: (一) (二) 在这两种情况下,我都需要知道如何迭代antExp+和T*,因为我需要为它们的每个元素生成一个ArrayList。当然,我的语法更复杂,但我认为这个例子应该解释我需要什么。谢谢大家! ANTLR中的产生式规则可以有一个或多个返回类型,您可以在循环中引用它们(a(…)*或(…)+)。那么,假设您想要打印T的每个文本,而antExp规则匹配。可以这样做: expr : (antExp {System.out.println($antExp

让我们假设具有2个ANTLR语法的以下场景:

(一)

(二)


在这两种情况下,我都需要知道如何迭代antExp+和T*,因为我需要为它们的每个元素生成一个ArrayList。当然,我的语法更复杂,但我认为这个例子应该解释我需要什么。谢谢大家!

ANTLR中的产生式规则可以有一个或多个返回类型,您可以在循环中引用它们(a
(…)*
(…)+
)。那么,假设您想要打印
T
的每个文本,而
antExp
规则匹配。可以这样做:

expr
 : (antExp {System.out.println($antExp.str);} )+
 ;

antExpr returns [String str]
 : '{' T '}' {$str = $T.text;}
 ;

T : 'foo';
同样的原则适用于语法#2:

编辑 请注意,您不限于返回单个引用。运行由以下内容生成的解析器:

grammar T;  

parse
 : ids {System.out.println($ids.firstId + "\n" + $ids.allIds);}
 ;

ids returns [String firstId, List<String> allIds]
@init{$allIds = new ArrayList<String>();}
@after{$firstId = $allIds.get(0);}
 : (ID {$allIds.add($ID.text);})+
 ;

ID    : ('a'..'z' | 'A'..'Z')+;
SPACE : ' ' {skip();};

非常感谢你,巴特!我不知道我可以这样做。请注意,您可以在规则中的@init中创建ArrayList,并可以使用“expr returns[List value]从规则中返回它。
expr
 : (antExp {System.out.println($antExp.str);} )+
 ;

antExpr returns [String str]
 : '{' T '}' {$str = $T.text;}
 ;

T : 'foo';
expr     : antExpr; 
antExpr  : '{' (T {System.out.println($T.text);} )* '}' ;
T        : 'bar';
grammar T;  

parse
 : ids {System.out.println($ids.firstId + "\n" + $ids.allIds);}
 ;

ids returns [String firstId, List<String> allIds]
@init{$allIds = new ArrayList<String>();}
@after{$firstId = $allIds.get(0);}
 : (ID {$allIds.add($ID.text);})+
 ;

ID    : ('a'..'z' | 'A'..'Z')+;
SPACE : ' ' {skip();};
aaa
[aaa, bbb, ccc]