25

私の質問はScalaパーサーについてです:

  • (標準ライブラリ内および外部で)利用可能なものはどれですか、
  • それらの違いは何ですか、
  • それらは共通のAPIを共有していますか
  • 異なるパーサーを組み合わせて1つの入力文字列を解析できますか?

私は少なくともこれらを見つけました:

4

4 に答える 4

12

DanSpiewakによるGLLパーサーコンビネーターの実装もあります。

于 2010-12-15T01:06:54.097 に答える
11

Scalaの標準パーサーコンビネーターはLLではなく、PackratコンビネーターはLALRでもないことに注意してください。パーサーコンビネーターは、無限のバックトラックを伴う再帰下降の一形態です。「LL(*)」のように考えることができます。この手法でサポートされる言語のクラスは、正確には、明確な文脈自由言語のクラス、またはLALR(1)およびPackratと同じクラスです。ただし、文法のクラスはかなり異なり、最も顕著な弱点は左再帰のサポートがないことです。

Packratコンビネータ左再帰をサポートしますが、それでもLALRの他の多くのより微妙な機能をサポートできません。この弱点は、一般に、順序付けられた選択演算子に起因します。これは、いくつかの悪魔のようにトリッキーな文法バグにつながる可能性があり、特定の優れた文法定式化を妨げる可能性があります。これらのバグの最もよく見られる例は、あいまいな選択肢を誤って最短のものとして最初に注文した場合に発生します。その結果、貪欲な一致が発生し、正しいブランチが試行されなくなります。LALRにはこの問題はありません。これは、可能なすべてのブランチを一度に試行し、本番環境が終了するまで決定ポイントを延期するためです。

于 2012-02-06T16:41:09.023 に答える
8

「導関数による解析」として知られる新しいアプローチもあります。ここでは、アプローチについて説明します。DanielSpiewakによるScalaの実装があります。

于 2012-02-06T14:20:13.333 に答える
4

この回答を、parboiled2と呼ばれるパーボイルドプロジェクトの最新のイテレーションへのポインターで更新したかっただけです。

https://github.com/sirthias/parboiled2

parboiled2は(Scala + Javaではなく)Scalaのみを対象とし、Scalaマクロを利用し、非常に積極的に保守されています。

于 2014-03-10T17:39:23.403 に答える