2017-04-12 14 views
0

現在、テキストスプレッドシートを入力として扱うAntlr v4の文法を実装しようとしています(各 'セル'はタブで区切られています)。文法は、算術式で使用される参照を含む、他のセルへの参照をサポートしています。出力は入力と同じですが、すべての式が完了し、各参照は参照されているセルの整数値で置き換えられます。Antlr:まだ解析されていないデータへの参照

例入力:

1 9 5 
    4 3 A3 
    =A2+C3 6 

と出力:

1 9 5 
    4 3 5 
    15 

私はJavaアプリケーションでパーサを実装する方法がわからないと思います。セルにはまだパースされていないセルへの参照が含まれている可能性があるため、文法は式を評価する前にセルの解析を終了しなければなりません。私の理解から、文法訪問者は解析中に値を返すことができますが、まだ解析されていないセルへの参照を含む式を評価することはできません。

これにはどのような方法が最適ですか?私が判断できた唯一の解決策は、文法を2つのより小さな文法に分割することでした。文法は、セルを解析し、文法をセル内で解析します。しかし、私はむしろ1つの解析プロセスで単純にしておきます。

1つの文で、Antlr4では、まだ解析されていないデータへの参照を処理する最善の方法は何ですか?

答えて

3

解析実行中に式を評価する必要はありません。プロセス全体を2つのステップで行います。まず入力を解析して解析ツリーを取得し、ビジターを使用して評価します。ステップ1の後、すべてのセルが解析ツリーに解析されるため、評価ステップで解決できます。

+0

+1 IMHO自分のモデルを使用して評価するのは良い考えです。 antlrによって生成された* Contextオブジェクトではありません。 – Yevgeniy

+0

私は初めてこれを見たときにこの答えを誤解しました。 Antlrではどのようにして評価ステップをどのように実装するのですか?私の理解から、訪問者は深さ優先のトラバーサルを行います。私が必要とするのは、まずセルの幅が広がり、次にセルの中の式の深度が最初です。 – bgregor

+0

別の歩行戦略が必要な場合は、独自のビジタークラスを作成します。 AbstractParseTreeVisitorのすべてをオーバーライドすることができます。独自の 'visitChildren()'メソッドを実装しました。 –

関連する問題