ANTLRのプロダクションルールには、ループ内で参照できる1つ以上のリターンタイプ(a(...)*
または(...)+
)を含めることができます。したがって、ルールが一致する各T
テキストを印刷するとします。antExp
これは次のように行うことができます:
expr
: (antExp {System.out.println($antExp.str);} )+
;
antExpr returns [String str]
: '{' T '}' {$str = $T.text;}
;
T : 'foo';
同じ原則が、たとえば文法#2にも当てはまります。
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 bbb ccc"
に次のように出力されます。
aaa
[aaa, bbb, ccc]