次のようなレクサールールを定義する方法はありますか?
DESCRIPTOR : 'INIT'(.)*'END';
したがって、DESCRIPTORは2つのラベルINITとENDの間のコンテンツを返しますか?
次のような戻り値を使用できると思います。
DESCRIPTOR returns [String content]
@init {
content="";
}: 'INIT'(.)*'END';
しかし、私はそのような価値にアクセスする方法がわかりません。
レクサールール(大文字で始まるルール)にはreturns句を含めることができず、パーサールールのみに含めることができることに注意してください。
しかし、ルール:
DESCRIPTOR : 'INIT' (.)* 'END';
うまく動作します。デフォルトでは、ANTLRは不本意ながら(不本意ながら)一致するため.*、.+上記のルールは「INIT」に一致し、その後に最初のが0個以上の文字が続きます"END"。
ああ、トークンから"INIT"とを削除したい。"END"あなたは次のようにそれを行うことができます:
DESCRIPTOR
: 'INIT' .* 'END' {setText($text.substring(4, $text.length() - 3));}
;
ここで、$textはの略ですgetText()(つまり、トークンが一致した文字列全体)。