2017-12-06 32 views
4

私はfollowing approachをHaskellのパーサーコンビネータを使用して調べています。仕様へパーサーコンビネータを使用する理由は何ですか?

  • 簡単には(私はこれに同意する)読んで
  • 同様の形式:

    windSpeed :: String -> Maybe Int 
    windSpeed windInfo = 
        parseMaybe windSpeedParser windInfo 
    
    windSpeedParser :: ReadP Int 
    windSpeedParser = do 
        direction <- numbers 3 
        speed <- numbers 2 <|> numbers 3 
        unit <- string "KT" <|> string "MPS" 
        return speed 
    

    著者は、このアプローチのために次のような理由を与える:著者はパーサコンビネータの次の例を示しますつまり、パーサー自体は基本的に解析する内容の説明です(私はこれに同意します)。

私は選択の理由のいくつかを逃しているパーサーコンビネータ。いずれかの利点のいずれかusingハスケル、コンパイル時guarantees,実行時エラーです。または、あなたがparsing DSLs and using無料のモナドを始めるときに、その後のいくつかの利点があります。

私の質問はパーサーコンビネータを使用する理由は何ですか?

+1

データが階層的に構成される傾向があるため、一部のサブ要素用のパーサーを作成し、それぞれパズルの一部を実行するパーサーのカスケードを作成できますか?私。 XMLパーサーの場合、まず属性値を解析するパーサー、次に前のパーサーを使用して 'key =" value "を解析し、そのパーサーを繰り返して任意の数のキー/値ペアを解析し、次に解析するパーサータグを解析し、タグ階層などを解析することができます。 –

+1

ライブラリ関数を再利用でき、BNFベースのアプローチとは異なり、文脈自由文法に制限されていないことに気づくでしょう。 – gallais

+0

ありがとうございます - それを答えに展開してください。 – hawkeye

答えて

2

私はパーサコンビネータを使用して、いくつかの利点を参照してください。

  • パーサコンビネータは、手書きのトップダウンパーサの一般化されています。パーサを手書きで書く場合は、パーサーコンビネータを使用して共通パターンを抽象化します。
  • パーサージェネレーターとは異なり、パーサーコンビネーターは潜在的に動的であり、実行時の決定を可能にします。この側面は、言語の文法が入力に基づいて再定義される場合に有用です。
  • パーサーはファーストクラスのオブジェクトです。
関連する問題