次のようなレクサールールを定義する方法はありますか?
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()
(つまり、トークンが一致した文字列全体)。