私の質問はScalaパーサーについてです:
- (標準ライブラリ内および外部で)利用可能なものはどれですか、
- それらの違いは何ですか、
- それらは共通のAPIを共有していますか
- 異なるパーサーを組み合わせて1つの入力文字列を解析できますか?
私は少なくともこれらを見つけました:
- Scalaの「標準」パーサー(LLパーサーのようです)
- ScalaのPackratパーサー(2.8以降はLALRパーサーです)
- パーボイルドパーサー(PEGパーサー?)
- SpiewakのGLLパーサーコンビネーター
私の質問はScalaパーサーについてです:
私は少なくともこれらを見つけました:
DanSpiewakによるGLLパーサーコンビネーターの実装もあります。
Scalaの標準パーサーコンビネーターはLLではなく、PackratコンビネーターはLALRでもないことに注意してください。パーサーコンビネーターは、無限のバックトラックを伴う再帰下降の一形態です。「LL(*)」のように考えることができます。この手法でサポートされる言語のクラスは、正確には、明確な文脈自由言語のクラス、またはLALR(1)およびPackratと同じクラスです。ただし、文法のクラスはかなり異なり、最も顕著な弱点は左再帰のサポートがないことです。
Packratコンビネータは左再帰をサポートしますが、それでもLALRの他の多くのより微妙な機能をサポートできません。この弱点は、一般に、順序付けられた選択演算子に起因します。これは、いくつかの悪魔のようにトリッキーな文法バグにつながる可能性があり、特定の優れた文法定式化を妨げる可能性があります。これらのバグの最もよく見られる例は、あいまいな選択肢を誤って最短のものとして最初に注文した場合に発生します。その結果、貪欲な一致が発生し、正しいブランチが試行されなくなります。LALRにはこの問題はありません。これは、可能なすべてのブランチを一度に試行し、本番環境が終了するまで決定ポイントを延期するためです。
この回答を、parboiled2と呼ばれるパーボイルドプロジェクトの最新のイテレーションへのポインターで更新したかっただけです。
https://github.com/sirthias/parboiled2
parboiled2は(Scala + Javaではなく)Scalaのみを対象とし、Scalaマクロを利用し、非常に積極的に保守されています。