「ブロック」と呼ばれる構造を持つテンプレート (jinja、Twig など) 言語のリンター プログラムを作成しています。
テンプレート言語におけるブロックの概念については、ご存知の方も多いと思います。現在、これらのブロックを含むテンプレートは、ブロックに同じ名前を持ち、独自のコンテンツと機能を定義する別のテンプレート (子テンプレート) によってオーバーライドできます。
そのため、特定のソース コードを (スコープ チェックのために) 評価するときの要件は、最初に子テンプレート内のすべてのブロックを個別に評価することです。次に、ルート テンプレートで定義された場所にブロックを配置する必要があります。ルート テンプレートのテンプレート スコープ属性 (変数、マクロなど) の違反をチェックするために、再度評価を行う必要があります。
まず、ANTLR4 を使用して子テンプレートにアクセスしました。ANTLR では、ブロックをヒットし、そこで評価してから、ルート テンプレートの解析ツリーで別のビジターを呼び出します。
しかし、評価のために子ブロックのコンテンツをルート テンプレートに配置するにはどうすればよいでしょうか。ANTLR4 にはツリーの変更/突然変異はありません。私はこのコンパイラとパーサーのパラダイム全体に不慣れです。私の要件を考慮して、ここから取るべき最善のアプローチを誰かが提案できますか? また、質問が漠然としすぎている、または十分な情報を提供していないと思われる場合に備えて、他の質問にも答える準備ができています.