7

実行時に AST/parse ツリーを生成するパーサーはありますか? EBNF文法の文字列または類似のものを受け入れてデータ構造を吐き出すライブラリのようなものですか?

  • 私はantlr、jlex、およびそれらの同類を認識しています。彼らはこれを行うことができるソース コードを生成します。(コンパイルステップをスキップしたい)
  • 私はBoost::Spiritを知っています.C++構文でいくつかの黒魔術を使用して、実行時にそのようなものを生成します(間違いなく私が望むものにはるかに近いですが、C++に関しては私は困っています.そして、それはまだいくらかです.文法がハードコードされているため、制限されます)
  • PythonやRubyについては何も知りませんが、コンパイラコンパイラはそのような言語で非常に効果的かもしれません...

今、私はパーサーコンビネーターを認識しています。(ありがとう、ジョナス) そしていくつかのライブラリ (ありがとう、エリベン)

ついでに、 Parsing Expression Grammarsにも最近気付きました。誰かがそれを実装するとクールに聞こえます (彼らは Perl 6 にはそれがあると言っていますが、Perl は私の理解を回避しています)。

4

7 に答える 7

5

役立つと思われるパーサーコンビネーターをご覧ください。この手法を使用して、実行時にパーサーを作成することができます。人気のあるパーサー コンビネーターの 1 つは、ホスト言語としてHaskellを使用するParsecです。パーセクのドキュメントから:

Combinator パーサーは、プログラムの残りの部分と同じプログラミング言語内で作成および使用されます。文法形式 (Yacc) と実際に使用されるプログラミング言語 (C) の間にギャップはありません。

パーサーは、言語内の第一級の値です。それらはリストに入れられ、パラメーターとして渡され、値として返されます。特定の問題に特化したカスタムメイドのパーサーを使用して、使用可能なパーサーのセットを簡単に拡張できます

.NET を使用している場合は、F# のパーサー コンビネーター ライブラリを参照してください。

于 2008-10-14T12:58:52.263 に答える
4

Java の方が適している場合は、Haskell Parsec ライブラリの移植版であるJParsecがあります。ドキュメンテーションは良くありませんが、非常に強力です。

単純な lex を実行してから解析フェーズを実行するように強制することもできますが、動的字句解析と動的文法を使用していくつかの興味深いことを行うこともできます。

首をかしげるもの。

それはすべて Java で行われるため (パーサーは POJO です)、リファクタリングや TDD の実行など、Java で慣れていることは何でも実行できます。これは、従来の ANTLR/JavaCC/JJTree アプローチの大きな利点です。

于 2008-12-02T17:01:19.383 に答える
3

はい、もちろん !

すべての動的言語では、実行時にコードを簡単に生成して評価できるため、これを実現するのは非常に簡単です。2 つの選択肢をお勧めします。

  • Perl では、Parse::RecDescent を使用します。文字列から文法を取得し、実行時に新しい文字列から新しいパーサーを生成するように要求できます。
  • Python では、PLY を検討してください。実行時にdocstringを使用して関数を簡単に生成し、PLYを実行できます。

個人的には Python オプションをお勧めしますが、Perl は知っていても Python は知らない場合は関係ないかもしれません。

完全を期すために、Lex と Yacc でも同様に実行できることに注意してください。実行時に文法から Lex / Yacc ファイルを生成し、C にコンパイルし、それを共有ライブラリにコンパイルして、実行時にロードする必要があります。これはサイエンス フィクションのように聞こえますが、効率と動的性の複雑なニーズに対して実際にこれを行うツールもあります。

幸運を。

于 2008-10-09T06:03:31.990 に答える
3

Lambda the Ultimate は、構文拡張を可能にするパーサーについて説明しました。

私は、構文拡張 (ある種のコンパイル時のメタプログラミング) を可能にするコンパイラーを作成することを計画しています。私は非常に強力なシステムを持ちたくないので、次のものを用意することを考えました:

{syntax: while (condition) do code}
while (condition, code) => // actual execution

構文に一致するすべてのパターンを関数の呼び出しに置き換えます。ただし、Flex/Bison や ANTLR (C# でコンパイラを作成したい) などの通常のツールではこれが許可されていないように見えるため、レクサーとパーサーを実行するためにどこから始めればよいかわかりません。

次にどこへ行くべきか、何か指示をいただけますか?また、Scheme または Haskell がこのタスクを達成するためのより優れた言語になる可能性があることも読みました。そしてもちろん、それらを実装するための実際のアイデアについて、どんな提案も歓迎します。

于 2008-10-09T02:02:47.860 に答える
1

何を解析しますか?C または C++ では、実行時にパーサーがないため、追加のライブラリがないと使用できません。ただし、多くのプログラミング言語ではこれが当てはまります。

すべてのパーサーは、実装時にデフォルトで「動的」になります。Cでも。

解析しようとしている言語が独自のものである場合: パーサーの作成は独学で習得する必要があります。パーサージェネレーターを使用しても、それ自体が作業です。ただし、それを学んだ後は、非常に簡単になります。ただし、インデントされた構文などの特殊なトリックは依然として扱いにくいため、パーサーが目的どおりに機能することを確認するには、優れた広範なテストが必要になります。私はパーサーを書いたので知っています。

于 2008-10-14T14:18:41.463 に答える
1

[Dropincc.java] http://pfmiles.github.com/blog/dropincc-dot-java-the-ultimate-tool-to-create-dsls-in-java/ "Dropincc.java は純粋な Java の動的パーサー ジェネレーターです。 "。

これにより、Java プログラミング言語で文法規則を定義することができ、追加の表記法を学ぶ必要はありません。他のコマンドライン ツールを使用する必要はありません。純粋な Java で新しく定義した言語を定義、コンパイル、および「評価」することができます。

詳細については、そこにあるリンクを参照してください。

【プロジェクトのホームページ】https://github.com/pfmiles/dropincc.java

于 2012-08-04T13:02:28.520 に答える
1

JLex Java 拡張機能であるJFlexを使用すると、ランタイム コンパイルを実行できますが、かなり複雑です。

于 2008-10-09T14:00:08.970 に答える