より一般的な種類の質問があります。
私は現在、ANTLR v3.4 を使用してプロジェクトに取り組んでいます。これが私たちのアイデアです。
- いくつかの入力を解析し、プロセス中にその重要な部分を Map に保存します。
- 解析された入力をフォームに表示します (このExample Pictureを参照してください)。フォーム フィールドはキーによって名前が付けられ、Map の値が入力されますが、テキスト入力フィールドには入力全体が含まれます。
そのため、ユーザーが下部のテキストを入力/変更すると、マップを作成するパーサー文法のコード アクションにより、フォーム フィールドの内容も変更されます (フォーム フィールドに入力するための入力として使用されます)。
しかし、別の方向も必要です。ユーザーがフォーム フィールドのいずれかで値を変更した場合、それらの変更は下部のテキストに反映される必要があります。
このタスクを達成するために、AST の作成と操作を使用することを考えました。ツリー書き換えルールはすでに文法に追加しています。しかし、Map と AST を接続する方法と、出力を作成する方法がよくわかりません。
私は正しい軌道に乗っていますか?他のアイデアはありますか?
編集
だから私はあなたの提案に従い、リーブノードを変更可能なデータ構造に直接入れました。すべて問題ありません。
しかし今、他に2つの問題があります。
- トークンを追加するにはどうすればよいですか? 入力にはオプションの部分があるため、一部のフォーム フィールドが空になる場合があります。フォーム フィールドを特定の値に変更すると、ツリーに新しいノードを作成する必要があります。どうすればいいですか?新しいノードを配置する場所を決定する必要があります...
- トークンを削除するにはどうすればよいですか? そのため、フォーム フィールドの値を「空」に変更すると、関連するノードを削除する必要がありますが、これは周囲のノードに影響を与える可能性があります (リストでは、各トークンの後にコンマがあるように)。これを行う方法が本当にわかりません。
これが私の現在の文法です:
parser grammar TestASTParser;
options {
language = Java;
tokenVocab = TestASTLexer;
output = AST;
}
...
entry
:
lemma=phrase
(lgrammatt=grammatts)? (lsemantic=semantics)? (lsubsemantic=subsemantics)?
SEP
translat=phrase
(tgrammatt=grammatts )? (tsemantic=semantics)? (tsubsemantic=subsemantics)?
EOF
-> ^(ENTRY
^(LEMMA ^(LEMMA_TEXT $lemma) ^(LEMMA_GRAMM $lgrammatt)?
^(LEMMA_SEM $lsemantic)? ^(LEMMA_SUBSEM $lsubsemantic)?)
^(SEPARATOR SEP)
^(TRANSLATION
^(TRANSLAT_TEXT $translat) ^(TRANSLAT_GRAMM $tgrammatt)?
^(TRANSLAT_SEM $tsemantic)? ^(TRANSLAT_SUBSEM $tsubsemantic)?)
)
;
phrase
:
t=((options{ greedy = false; }:.)+)
-> PHRASE[$phrase.text]
;
grammatts
:
OPEN_BRACKET grammlist CLOSE_BRACKET
;
semantics:
LEFT_CURLY phrase RIGHT_CURLY
;
subsemantics:
D_LEFT_CURLY phrase D_RIGHT_CURLY
;
grammlist
:
grammatt (COMMA grammatt)*
;
grammatt:
(GENUS | GRAMMATT)
;
したがって、テスト入力の結果のツリー
Angeber(in) [f] {Großkotz} {{xyz}} <> baterlunza(a) [m(f), refl] {boeser buba}
次のようになります(黄色のノードは常に存在し、それ以外はすべてオプションです)。そのため、フォーム フィールドで「refl」を「」に変更すると、ノード「refl」だけでなく、その前の「,」も消えるはずです。下の「f」を削除するLEMMA_GRAMM
と、サブツリー全体が消える必要があります(リストを空にすることはできないため)。または、サブセマンティクスを に追加したい場合はTRANSLATION
、対応するノードTRANSLAT_SUBSEM
と中括弧{{
およびの子ノードを作成する必要があり}}
ます。
どこから始めればいいのか本当にわかりません。私のツリー構造はこれにも適していますか? 独自の実装が必要BaseTree
ですか? それとも単なるJavaですか?