私の文法の一部では、いくつかのパスの共通部分を証拠に入れ、括弧内にそれらの間で異なるパスの残りの部分を入れることができます。
foo.bar(A;B;woo.C) は、foo.bar.A、foo.bar.B、および foo.bar.woo.C の 3 つのパスの表現です。
funcPathsが与えられた場合、完全なパスを持つこれら3つのノードでASTツリーを作成する必要があるため、そのために次のことを試しました
funcPaths
: f1=field c1=fieldList[$f1.text] -> ^(LIST_PATH $c1)
;
fieldList[String s]
: '(' p+=part[s] ( ';' p+=part[s] )* ')' -> $p+
;
part[String s]
: FIELD_ID -> { new CommonTree(new CommonToken(FIELD_ID, s + "." + $FIELD_ID.text))}
;
field
: FIELD_ID
;
ルートとして LIST_PATH を持ち、タイプが FIELD_ID の foo.bar.A、foo.bar.B、および foo.bar.woo.C の 3 つのサブノードを持つサブツリーを期待しますが、ANTLRWorks では、ルート LIST_PATH だけでツリーを描画します。つまり、これらのサブノードは作成されていませんが、変更すると
part[String s]
: FIELD_ID -> FIELD_ID
;
3 つのサブノードが描画されますが、共通部分を個々の部分に連結するという問題は解決しません。
私の質問は、サブツリーのルートとノードを連結したノードを構築するという問題をどのように解決できるでしょうか? これらのノードを生成できる限り、ハードコーディングされた共通ツリーの作成を必ずしも使用する必要はありません