1

これが背景です。顧客が単純なスクリプトを記述して、mongodb ベースのデータベースにクエリを実行できるようにする DSL を作成しようとしています。DSL を実装するために antlr を選択します。

私の理解では (正しくない場合はお知らせください)、antlr で生成されたパーサーをシステムに統合するには 2 つの方法があります。

  1. 生成されたパーサーを直接使用してデータベースにクエリを実行し、結果を特定の形式 (json エンコードなど) で返すことができるように、文法ファイルにコードを埋め込みます。
  2. パーサーに DSL ファイルをフィードした後、パーサーを純粋なパーサーのままにしておき、生成されたパーサー クラスから AST を取得して、別のクラスでクエリを構築します。

枝角の皆さん、枝角初心者の私が進むべき道はどれだと思いますか? 各アプローチの長所と短所を挙げていただけますか、または他の推奨方法はありますか?

4

1 に答える 1

3

ビジネス ロジックをパーサーに埋め込むべきではありません。これは、メンテナンスの問題が発生する可能性があるためです。生成されたパーサー内でビジネス ロジックをデバッグしなければならないという悪夢のような見通しは言うまでもなく、ビジネス ロジックのバグを修正するために文法を再コンパイルしたくありません。したがって、オプション 1 は、最小のおもちゃのプロジェクト以外では問題外です。

オプション 2 は、複数の方法で実装できます。(A) ANTLR に AST ノードを生成させてツリー パーサーを作成させるか、(B) ツリー パーサーをスキップして、次のアクションで独自の表現を生成することができます。パーサー。Java と C# の両方で、本番プロジェクトで両方のアプローチを試しましたが、どちらのアプローチも非常にうまく機能しました。(A) と (B) のどちらを選択するかは、ビジネス ロジックがパーサーから除外されている限り、主に個人の好みの問題だと思います。

于 2012-06-26T03:11:55.267 に答える