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無料のモナドを始めるときに、その後のいくつかの利点があります。
私の質問はパーサーコンビネータを使用する理由は何ですか?
データが階層的に構成される傾向があるため、一部のサブ要素用のパーサーを作成し、それぞれパズルの一部を実行するパーサーのカスケードを作成できますか?私。 XMLパーサーの場合、まず属性値を解析するパーサー、次に前のパーサーを使用して 'key =" value "を解析し、そのパーサーを繰り返して任意の数のキー/値ペアを解析し、次に解析するパーサータグを解析し、タグ階層などを解析することができます。 –
ライブラリ関数を再利用でき、BNFベースのアプローチとは異なり、文脈自由文法に制限されていないことに気づくでしょう。 – gallais
ありがとうございます - それを答えに展開してください。 – hawkeye