0

より一般的な種類の質問があります。

私は現在、ANTLR v3.4 を使用してプロジェクトに取り組んでいます。これが私たちのアイデアです。

  • いくつかの入力を解析し、プロセス中にその重要な部分を Map に保存します。
  • 解析された入力をフォームに表示します (このExample Pictureを参照してください)。フォーム フィールドはキーによって名前が付けられ、Map の値が入力されますが、テキスト入力フィールドには入力全体が含まれます。

そのため、ユーザーが下部のテキストを入力/変更すると、マップを作成するパーサー文法のコード アクションにより、フォーム フィールドの内容も変更されます (フォーム フィールドに入力するための入力として使用されます)。

しかし、別の方向も必要です。ユーザーがフォーム フィールドのいずれかで値を変更した場合、それらの変更は下部のテキストに反映される必要があります。

このタスクを達成するために、AST の作成と操作を使用することを考えました。ツリー書き換えルールはすでに文法に追加しています。しかし、Map と AST を接続する方法と、出力を作成する方法がよくわかりません。

私は正しい軌道に乗っていますか?他のアイデアはありますか?

編集

だから私はあなたの提案に従い、リーブノードを変更可能なデータ構造に直接入れました。すべて問題ありません。

しかし今、他に2つの問題があります。

  1. トークンを追加するにはどうすればよいですか? 入力にはオプションの部分があるため、一部のフォーム フィールドが空になる場合があります。フォーム フィールドを特定の値に変更すると、ツリーに新しいノードを作成する必要があります。どうすればいいですか?新しいノードを配置する場所を決定する必要があります...
  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ですか?

4

1 に答える 1

0

これがあなたのケースに直接適しているかどうかはわかりません。ただし、Xtextを使用すると、対応するEMFモデルも取得されます。この場合、ユーザーインターフェイスは基本的に、ビューの上部にあるEMFモデルのフォームであり、ビューの下部にあるEMFモデルのto-text-serialized部分のXtextエディターです。ビューの上部と下部はすべて同じEMFモデルインスタンスに基づいているため、ビューのいずれかの部分での変更を他の部分に反映することができます。Xtextは、下部フォーム部分のテキストの必要な解析とシリアル化を提供します。

ANTLRを使用しているので、ANTLR文法をXtextに移行できます。ただし、これは自動的に達成できるわけではありませんが、それほど難しい作業ではありません。

于 2013-01-04T13:18:20.620 に答える