10

ocamlyacc現在、BNF 文法 (優先順位と結合性を持つファイル)から Scala コードを生成するレクサー/パーサーを探しています。それを行う方法についてほとんど何も見つけられなかったので、私はかなり混乱しています。

解析のために、私はscala-bison(私が扱うのに多くの問題を抱えていることを)発見しました。他のすべてのツールは、Scala にインポートされた単なる Java パーサーです ( などANTLR)。

字句解析については、何も見つかりませんでした。

Scala の有名なパーサー コンビネーターも見つけましたが (間違っていたら訂正してください)、それらが非常に魅力的であっても、主にバックトラッキングが原因で多くの時間とメモリを消費します。

だから私は2つの主な質問があります:

  • 人々が _parser コンビネータだけに集中しているように見えるのはなぜですか?
  • Scala で使用する最適なレクサー/パーサー ジェネレーターの提案は何ですか?
4

3 に答える 3

8

ScalaBison 論文の著者の 1 人として、私はこの問題に何度か遭遇しました。:-) Scala でスキャンするために通常行うことは、JFlexを使用することです。これは ScalaBison と驚くほどうまく機能し、すべてのベンチマークはその組み合わせを使用して行われました。不幸な欠点は、Java ソースを生成するため、コンパイルに多少の工夫が必要なことです。John Boyland (論文の主執筆者) が JFlex 用の Scala 出力モードを開発したと思いますが、公開されていないと思います。

私自身の開発のために、私はスキャナーレス解析技術を使って多くの作業をしてきました。Scala 2.8 の packrat パーサー コンビネータは非常に優れていますが、まだ一般化されていません。パーサー コンビネーター フレームワーク内で一般化された解析を実装する実験的なライブラリを構築しました。その漸近境界は、従来のパーサー コンビネーターよりもはるかに優れていますが、実際には一定時間のオーバーヘッドが高くなります (私はまだ取り組んでいます)。

于 2010-06-22T16:54:21.553 に答える
3

Scala 2.8 には packrat パーサーがあります。ここの API ドキュメントから引用します。

Packrat 解析は、バックトラッキングの再帰降下パーサーを実装するための手法であり、無制限の先読みと線形解析時間を保証するという利点があります。この手法を使用すると、左再帰文法も受け入れることができます。

于 2010-06-22T16:01:51.207 に答える
3

この質問が古いことは知っていますが、Scala コードを出力するレクサー ジェネレーターをまだ探している人のために、対応する Maven および sbt プラグインを含む、Java ではなくScala を発行する JFlex のフォークを作成しました。すべて Maven Central で利用できるようになりました。

現在、 FACTORIEの自然言語処理パイプラインの一部として英語のテキストをトークン化するために (Maven/sbt プラグインを含めて) 使用しています ( Scala を含む .flex ファイルの例はこちら) 。

于 2015-04-08T22:21:42.267 に答える