2010-12-12 12 views
25

私の質問は、Scalaのパーサについてです:ものは、彼らが共通のAPIを共有し、 ん Scala Parsers:可用性、相違性および結合性?

  • 、両者の差に何
  • 、(標準ライブラリに外)用意されてい

    • 異なるパーサーを組み合わせて1つの入力文字列を解析できますか?

    私は、少なくともこれらが見つかりました:

    • Scalaの "標準" パーサは(LLパーサのようです)
    • ScalaのPackrat parser(2.8以降、LALR法である)
    • Parboiled parserを(PEGパーサ?)
    • スピーバックのGLL parserコンビネータ
  • +1

    Parboiled、https://github.com/sirthias/parboiled/wikiを参照してください。 –

    +0

    最近jparsec(http://jparsec.codehaus.org/)を使用しました。これはJavaプロジェクトではうれしいです。これはJavaライブラリですが、Scalaでうまく見ることができるいくつかの暗黙的な変換があると思います...ちょうど5セント... – tenshi

    答えて

    4

    ちょうどparboiled2と呼ばれるパーボイルドプロジェクトの最新の反復へのポインタ、とこの答えを更新したい:

    https://github.com/sirthias/parboiled2

    parboiled2目標のみスカラ(スカラ+ Javaのではなく)、を使用していますScalaマクロであり、非常に積極的に管理されています。

    8

    「派生物で解析する」という新しいアプローチもあります。このアプローチはhereと記載されています。 Daniel Spiewakのimplementation in Scalaがあります。

    11

    Scalaの標準的なパーサーコンビネータはLLではなく、PackatコンビネータLALRでもありません。パーサー結合子は、無限のバックトラックを伴う再帰的な降下の形式です。あなたはそれらを「LL(*)」のように少し考えることができます。この手法でサポートされる言語のクラスは、まったく明確なコンテキストフリー言語のクラス、またはLALR(1)およびPackratと同じクラスです。しかし、の文法のクラスはかなり異なっており、最も顕著な弱点は左回帰の非サポートです。

    Packrat結合子doは左回帰をサポートしていますが、LALRの他の多くの微妙な機能をサポートしていません。この弱点は一般に順序付けられた選択演算子に由来します。これは、ある種の巧妙な文法的なバグを引き起こす可能性があります。最も頻繁に見られるこれらのバグの例は、誤ってあいまいな選択肢を最短のものとして順番に並べると、正しいブランチが試されるのを防ぐ欲張りな一致が発生したときに発生します。 LALRにはこの問題はありません。単純にすべての分岐を一度に試行し、決定が終わるまで決定点を延期するからです。

    関連する問題