5

2つのANTLR文法を使用した次のシナリオを想定します。

1)

expr     : antExp+;
antExpr  : '{' T '}' ;
T        : 'foo';

2)

expr     : antExpr; 
antExpr  : '{' T* '}' ;
T        : 'bar';

どちらの場合も、antExp+とT*を反復処理する方法を知る必要があります。これは、それらの各要素のArrayListを生成する必要があるためです。もちろん私の文法はもっと複雑ですが、この例は私が必要としているものを説明するはずだと思います。ありがとうございました!

4

1 に答える 1

6

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]
于 2012-04-30T17:25:03.527 に答える