1

次のようなレクサールールを定義する方法はありますか?

DESCRIPTOR :   'INIT'(.)*'END';

したがって、DESCRIPTORは2つのラベルINITとENDの間のコンテンツを返しますか?

次のような戻り値を使用できると思います。

DESCRIPTOR returns [String content]
@init {
   content="";
}: 'INIT'(.)*'END';

しかし、私はそのような価値にアクセスする方法がわかりません。

4

1 に答える 1

1

レクサールール(大文字で始まるルール)にはreturns句を含めることができず、パーサールールのみに含めることができることに注意してください。

しかし、ルール:

DESCRIPTOR :   'INIT' (.)* 'END';

うまく動作します。デフォルトでは、ANTLRは不本意ながら(不本意ながら)一致するため.*.+上記のルールは「INIT」に一致し、その後に最初のが0個以上の文字が続きます"END"

編集

ああ、トークンから"INIT"とを削除したい。"END"あなたは次のようにそれを行うことができます:

DESCRIPTOR 
 : 'INIT' .* 'END' {setText($text.substring(4, $text.length() - 3));}
 ;

ここで、$textはの略ですgetText()(つまり、トークンが一致した文字列全体)。

于 2012-07-17T14:31:08.077 に答える