次の単純で無意味な文法があるとします。
propagate : what^ where*;
what : CHAR^;
where : NUMBER -> ^(PLUS NUMBER);
NUMBER : '0'..'9';
CHAR : 'a'..'z';
PLUS : '+';
のような文字列を解析すると、a123456789
次のような AST が生成されます。
私がやろうとしているのは、によって解析されたトークンを渡して、what
(where
同じ入力に対して) AST を作成することです。
私は次の方法で試しました:
propagate : w=what^ where[$w.text]*;
what : CHAR^;
where[String s] : NUMBER -> ^(PLUS CHAR[s] NUMBER);
NUMBER : '0'..'9';
CHAR : 'a'..'z';
PLUS : '+';
トークンが 1 つの場合は機能what
しますが、ツリーの場合はどうでしょうか。これは正しいアプローチですか?