もちろん、架空のトークンの後に角かっこを入れて、カスタムテキストを(架空の)ASTノードに配置できます。
tokens {
TEXT;
}
rule
: subrule1 subrule2 -> ^(TEXT["custom text here"] subrule1)
;
ただし、書き換えルール$text
内で一致したすべてのテキストを参照することはできません。書き換えルール内では、で始まるものはすべて、ルール$
のラベル/変数と見なされます。
rule
: text=subrule1 other=subrule2 -> ^($text $other)
;
$text
パーサー(またはレクサー)ルール内でのみ使用して、ルールが一致するすべてのテキストを取得できます。
rule
: subrule1 subrule2 {System.out.println("I matched: " + $text);} -> ^(...)
;
書き換えルール内のテキストを取得するには、次のようにします。
grammar T;
options {
output=AST;
}
tokens {
MY_STATEMENT;
TEXT;
}
statement
: 'blah' subrule ';' -> ^(MY_STATEMENT subrule TEXT[$statement.text])
;
subrule
: Digit Digit
;
Digit
: '0'..'9'
;
"blah78;"
これにより、入力が次のASTに解析されます。