まず、タイトルが少し奇妙に聞こえるかもしれませんが、それ以外の呼び方がわかりません。誰かが私よりも優れたアイデアを得る場合は、編集してください。
さて、問題:
- 私はかなり古い文法を持っているので、新しいリクエストに適応する必要があります
古いフォームは次のようになります。
"最初のテキスト" * "2 番目のテキスト";
これは基本的にテキスト操作を行っています。何でも構いません。テキストを連結するとしましょう。これは、テキストをリーフとして、演算子をルートとして持つかなり基本的なツリーを生成しています
現在、新しい要求は、連結する必要がある文字数を指定して、連結操作を「パラメーター化」することです。新しいフォームは次のようになります。
"最初のテキスト" *(3) "2 番目のテキスト";
つまり、 から最初の 3 文字を取得し、 から最初の 3 文字を取得する必要がありますfirst text
。second text
- また、新しい文法は古い形式とも互換性がある必要があります (パラメーター/括弧は必須ではありません)。
CommonTreeAdaptor
ノードごとに独自のクラス ( ) のインスタンスを生成するクラスを実装しましたQNode
。みたいな工場。オペレーターを処理するように指定されたオブジェクトに新しいプロパティを追加できます。だとしましょうQNodeStar
。文法は次のようになります。
文法 QGrammar;
トークン { COMPUTEOP = '*'; }
...
public topexpr : expr SEMI -> ^(ROOT expr) ;
expr : CRIT (COMPUTE^ CRIT)* ;
フラグメント CRIT : '"' ('a'..'z'|'A'..'Z'|'0'..'9')+ '"';
COMPUTE : (COMPUTEOP | COMPUTEOP LPAREN! INT RPAREN!) ;
もちろん、これはこれよりも複雑で、私が持っているものについてのアイデアを提供するために何かをここに置くだけです.
それで、私の質問は、ツリー レイアウトを変更せずに文法定義ファイルからだけで、INT パラメータを COMPUTE 定義から「非表示」move
にし、基準ノード ( ) に自動的に追加するにはどうすればよいかということです。QNodeStar
更新:木を取得する方法の例:
1: "a" * "b"
* / \ 「あ」「ば」
- 今のツリーはこんな感じ。これにより、物事は非常に単純になります。値は常に葉です。
2: "c" *(3) "d"?
* / \ "CD"
- ツリーが「古いもの」(#1) と同じに見えることはわかっています。
if (node == 'star') traverse1() else traverse2()
2 つの理由でこのようにしたい: 下位互換性 (パラメーターのデフォルト値は 1) と、ツリー内のノードを反復している間などの条件を回避するために、このオペレーターのためだけにツリーの実行方法を変更したくない。私はいくつかの方法があると考えていました - 私はまだ特定できませんでした - パラメーター ( ) を「食べ」、同様の方法で検証メソッドのルートのオブジェクトに3
値として渡します。QNodeStar
ツリーをばかげたもののように見せることに成功しましたが、これはあまり役に立ちません。
* / | \ "c" 3 "d"