2

ここ数週間、私はSQLステートメントを解析して扱いやすいものにするという美しい世界に飛び込んできましたが、許可されたすべてのトークン/フォーマットを適切に処理するには、おそらく完全なレクサー/パーサーが必要になることがわかりました。同じこと。

私は主に create table ステートメントに興味がありますが、完全な汎用パーサーはさらに優れているでしょう。これは、Web 上の誰もまだこれを持っていないようです。

私はコンピューターの卒業生ではありませんが、独学なので、これは私にとってかなりの学習曲線です。私が取った手順は次のとおりです。

  1. 正規表現でSQLを解析する
  2. 失敗しました。正規表現を修正してください
  3. さらに悪いことに、SQLite ソースを掘り下げて、SQLite 固有のプロジェクトである Lemon パーサーを使用していることを確認します。
  4. 手動でjsに変換できると考えて、Lemon + PHPパーサーを機能させてみてください。(失敗した)
  5. Emscripten に、Lemon で生成された C のパーサーを動作させるようにしてください (依存関係の地獄、失敗しました)。
  6. 他のパーサー/レクサー ジェネレーターを検索します。ANTLR3 に注意してください。
  7. 出力形式を変更し、エラーをバックトレースすることによって、 Sqljet 言語ファイルを JavaScript に変換するために昼夜を問わず試みます。

私は優れたAntlrWorks GUI を使用して何が問題なのかを突き止めようとしましたが、壊れているのが Javascript スタックなのか、Java スタックなのか、それとも .g 形式が v2 の古い形式なのかはわかりません。

適切な再利用可能な Sqlite パーサーを生成するための正しい方向性を教えてくれるパーサー/レクサー ジェネレーターの経験を持つ人はいますか? mysql と pl/sql の両方のパーサーを JavaScript で生成できるようです。それは、sqlite .g 形式を更新する必要があるということですか?

4

1 に答える 1

1

JavaScript ターゲットで文法を使用できるようにするには、次のことを行う必要があります。

  • optionsブロック内のターゲット言語を変更します。options { language=JavaScript; }
  • .g文法ファイル ( と の間のもの)に埋め込まれたすべてのコードを JavaScript コードで変更します。ANTLR は、 '値で定義する内容に応じてこのコードを変換しないことに注意してください。自分で行う必要があります。{}optionslanguage
  • パーサーを生成するときは、ANTLRWorks を使用せずにコマンド ラインで実行し、Java の-Xmx引数で大量のヒープを使用します。SQL 文法は、大量のメモリを必要とする巨大な獣です。

ANTLR で生成されたパーサーを JavaScript ターゲットと組み合わせて使用​​ (および実行) する方法を示す以前の Q&A を次に示します: antlr3 - 解析ツリーの生成

HTH

于 2012-08-06T16:04:06.983 に答える