2017-03-04 7 views
3

私はHaskellを初めて使っています。私は、Parsecを使ってJSONパーサーを書くことを試みています。これはほとんどうまくいっています。リストやオブジェクトを比較的小さなコードで解析することもできます。しかし、JSONのために私はまたHaskellのParsec用の "電池"

  • 整数(おそらく符号付き)(おそらくは例えば、「3.4E-8」として科学的表記法を使用して)
  • フロート
  • 例えば付き文字列のようなプリミティブを解析する必要がありますエスケープされた引用符

私は、これらのようなものをパーセルの一部として使う準備ができていることを期待していました。私が得られる最も近いものはParsec.Tokensモジュール(integerと友人を定義します)ですが、それらのパーサーはJSONのような単純なものを解析する必要があるような "言語定義"を必要とします。プログラミング言語用。

だから私の質問は以下のとおりです。

  1. はここに行くための正しい方法Parsec.Tokenで機能していますか?その場合は、適切な言語定義を作成する方法は?

  2. 整数などのための「プリミティブ」パーサーは他に定義されていますか?別のパッケージに入っているのでしょうか?

  3. 私はこれらの種類の低レベルパーサーを自分で書いていますか?私は

が、私はこのサイト上の質問はMegaparsecは、これらのプリミティブが含まれていると言うことに気づいた(曖昧な科学的データ形式など)...頻繁にそれらを再利用し、自分自身を見ることができます[1]が、私はこれらをすることはできませんと仮定parsecで使用されます。

関連質問:

How do I get Parsec to let me call `read` :: Int?

How to parse an Integer with parsec

+0

あなたには当てはまらないオプションのパーザー(私はそれがすべてだと思います)。 – sepp2k

+0

できれば、 'megaparsec'を使ってください。 'parsec'のより現代的な書き直しです(実際には維持されています)。 – Alec

答えて

5

ここに行くための正しい方法Parsec.Tokenで機能していますか?

はい、そうです。

import Text.Parsec 
import qualified Text.Parsec.Token as P 
import Text.Parsec.Language (emptyDef) 

lexer = P.makeTokenParser emptyDef 

integer = P.integer lexer 

あなたが述べたように、これは感じている:あなただけのデフォルトとしてemptyDefを使用し、(つまり、あなたは、このようなidentifier or reserved、それらに依存パーサを、使用する予定はありません)minutiae specified by a language definition気にしないのであればあなたのユースケースに不必要に不器用です。 megaparsecAlec's suggestion参照)は、式典なしで対応するパーサを提供することに言及する価値がある。 (フリップサイドはmegaparsecは、例えば予約語のサポートで焼くしようとしていますが、実際にそれを必要とする場合はそのisn't difficult to implementないということです。)あなたは、単に空の文字列とリストと常に失敗を渡すことができ

関連する問題