2016-04-29 8 views
0

ANTLR4文法、一致する入力および生成された解析ツリーを持ちます。どのような種類の量子がその定義に適用されたのか、構文解析木のノードについて調べる方法はありますか?ANTLR4の構文解析ツリーは、文法規則で子が定量化されたかどうか問い合わせます。

例:このような文法を有する:

開始: 'A'( 'B' | 'C')* 'D'。

入力:「ABCD」

入力を解析した後、「スタート」ルールのパースツリーは4端子子供を持つことになります。問題は、第二子と第三子(「b」と「c」)について、彼らが任意であることを知る方法があるかどうかです。オプションの部分項が存在するかどうかを決定する

+0

「オプション」の量指定子は、文法の一部です。したがって、 'b'または 'c'が一致すると見なされると、それらはオプションのサブルールからのものです。私はあなたの問題を理解していません – JavaMan

+0

さて、ここには誤解があります。したがって、目的は、一致する入力で、構文的に正しいままにする必要は必ずしもない部分を見つけることです。つまり、量限定子が?、*、おそらく+の部分を見つけることです。 – Reni

答えて

0

簡単な方法は、ラベルを使用することである

start : 'a' op+=('b' | 'c')* 'd' ; 

これはない、nullの場合StartContextフィールド

List<TerminalNode> op; 

を有する解析ツリーのコンテキストになりbまたはcが一致しました。そうでない場合、opには、一致した順序でbcのインスタンスのリストが含まれます。

更新

標識は、その後も情報が不完全になりますけれども、部分項はオプションであるものにとヒントを提供するために、解析ツリー構造を可能にします。

ラベルなしでは、構文解析ツリーは一致するものとその順序のみを識別しますが、関連する可能性のある任意の修飾子は識別しません。

(1)文法自体をANTLR's own grammarを使用して解析し、特定のサブタームに適用される実際のオプションの修飾子を直接決定することができます。または(2)入力を適切にあいまいにして、結果的に生成された構文木が何であれ、オプションのサブ文を最終的に推論し、修飾する。

+0

ご返信ありがとうございます。不幸にも私は文法(あるいは解析されるべきテストケース)を変更することはできません。期待されるのは、任意の文法と一致する入力を受け取り、構文エラーを引き起こすことなく省略された可能性のある入力のすべてのparsetreeを見つける解決策です。 – Reni

+0

最後に、ANTLRベースのソリューションを選択しました。ターゲット文法のオプションルールを特定した後、この情報を訪問者の助けを借りて解析ツリーに戻しました。誰かが興味を持っている場合、実装はgrammar_analyzerとhdd_tree_builderモジュールのhttps://github.com/renatahodovan/picireny/tree/master/picireny/antlr4で利用できます。 – Reni

関連する問題