1

一致したルールの全文をASTノードに含めようとしています。やってみる

statement: 'blah' subrule ';' -> ^(MY_STATEMENT subrule $text);

動作しません。戻ってきたCommonTreeのインスタンスを見ていますが、startIndexフィールドとstopIndexフィールドが含まれていますが、トークンストリームへのインデックスのようであり、そこから一致したテキストを再アセンブルする明確な方法がわかりません。これはとても明白なことのように思えます、それはできますか?

4

1 に答える 1

1

もちろん、架空のトークンの後に角かっこを入れて、カスタムテキストを(架空の)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に解析されます。

ここに画像の説明を入力してください

于 2012-05-22T07:16:33.763 に答える