問題タブ [parsec]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
parsing - 解析中にさまざまなタイプの用語を分割する
異なるタイプの用語に対して2つのパーサーがあります。
これらの用語のシーケンスを表すデータ型があります。
私の入力が一連の混合用語である場合、 sをsからc :: Parser C
分離し、それらの順序を維持するための良い書き方は何ですか?たとえば、次の定義があります。A
B
"abAbBBA"
aAA
シーケンスとを解析しbbBB
ます。使用する必要があると感じていますStateT
が、詳細がわからないため、正しい方向にプッシュする必要があります。
haskell - パーサーは行をスキップします
Jadeのサブセット用の単純なパーサーを作成し、さらに処理するためにいくつかのXmlHtmlを生成したいと考えています。
パーサーは非常に単純ですが、Parsecと同様に少し長くなります。このような長いコードの投稿を許可されているかどうかわからないので、ここに完全な動作例があります。
以前に Parsec に手を出したことがありますが、成功することはめったにありません。今のところ、次の行を飲み込むように見える理由がよくわかりません。たとえば、
でテストするとparseTest tag txt
、次のように返されます。
私のパーサーは、あらゆる種類のネストを処理できるようですが、複数の行を処理することはできません。私は何を取りこぼしたか?
haskell - Parsec.Exprの繰り返しプレフィックス/ポストフィックス演算子はサポートされていません
のドキュメントは次のようにParsec.Expr.buildExpressionParser
述べています。
同じ優先順位のプレフィックス演算子とポストフィックス演算子は1回だけ発生します(つまり、-がプレフィックス否定の場合、-2は許可されません)。
実際、これは私を苦しめています。なぜなら、私が解析しようとしている言語では、接頭辞と接尾辞の演算子を任意に繰り返すことができるからです(のようなC式を考えてみて**a[1][2]
ください)。
では、なぜParsec
この制限を設けるのでしょうか。また、どうすれば回避できますか。
プレフィックス/ポストフィックスパーサーは優先順位が最も高いため、パーサーに移動できると思いますterm
。
すなわち
として解析されます
しかし、次のように解析したい場合はどうすればよいでしょうか。
buildExpressionParser
やりたいことがあれば、テーブル内の演算子の順序を簡単に並べ替えることができます。
注より良い解決策については、ここを参照してください
haskell - Parsecでのタイプエラー
私はParsec3.1.2とGHC7.4.1を使用して、やや毛むくじゃらのデータファイル形式のパーサーを作成しようとしています。かなり些細なケースだと思いますが、タイプエラーが発生します。RealWorldHaskellの適用可能なファンクターの例に従おうとしています。
さて、もともと私は次のタイプエラーを受け取りました:
Trivial parsecの例に基づいて、型エラーが発生しますNoMonomorphismRestriction
。言語プラグマを追加しようとしましたが、これは役に立ちませんでした。
Haskellの経験は少しありますが、Parsecの学習曲線はかなり急であることがわかりました。RealWorldHaskellの本の例がParsec2に基づいていることは役に立ちません。
haskell - Parsecに`read`:: Intを呼び出させるにはどうすればよいですか?
私は次のものを持っています、それはタイプチェックです:
さて、関数名が示すように、私はそれが私にIntを与えることを望みます。しかし、私がこれを行う場合:
このタイプのエラーが発生します:
空白を含む可能性のある整数を解析するためのより簡単でクリーンな方法はありますか?またはこれを修正する方法は?
最終的に、これを次の一部にしたいと思います。
これは、次のような行を解析することです。
したがって、最終的には、これらの値を必要とするBetaPairコンストラクターを呼び出すことができます(一部はInt、一部は[Exposure]やParallelなどの他のタイプ)
(興味があれば、これは、とりわけ、タンパク質の水素結合したベータストランドペアを表すファイル形式のパーサーです。ファイル形式を制御することはできません!)
haskell - パーセク型の問題
特定の計算生物学のファイル形式用のパーサーを作成しているときに、問題が発生しました。
これが私のコードです:
ここで、betaLine の定義をコメント アウトすると、すべてがコンパイルされ、個々のパーサー p_int、p_direction、および p_exposure のテストに成功しました。
しかし、その betaLine 方程式が存在する場合、よく理解できない型エラーが発生します。applicative <*> の私の理解は間違っていますか? 最終的には、これが Int -> Int -> Int -> Int -> Direction -> ExposureList を返すようにしたいので、これを BetaPair のコンストラクターに渡すことができます。
タイプエラーは次のとおりです。
haskell - 行末のパーセクトラブル
私はほとんどアプリケーションスタイルで書いているParsecパーサーを持っています。あるケース(私が使用しているのはsepBy
)で、eol
パーサーに問題があります。まず、いくつかの定義:
注:betaLine
完全に機能します(簡潔にするために、次の定義p_int
などは省略しました。
この他のパーサーで問題が発生しますhmmMatchEmissions
:
ここで<* eol
、パーサー定義からを削除\n
し、行からを削除すると、機能します。
では、なぜeol
機能しているのに機能してbetaLine
いないのhmmMatchEmissions
ですか?
これが私が使用している唯一の場所であることに注意しsepBy
ます; それが手がかりになりますか?
更新:私は次のことを行いましたが、今では別の方法で失敗します:/
そして、ここに失敗があります:
0
10列目の予期しない文字が0.124
トークンの最初の文字であることに注意してください。
haskell - int を処理するための Parsec 先読み
私はやや複雑なデータ ファイル形式を処理するために Parsec パーサーに取り組んでいます (この形式を制御することはできません)。
私は多くの進歩を遂げましたが、現在、次のことで立ち往生しています。
次のような行を解析できる必要があります。
意味的には、4
は nodeNum であり、Floats
と*
は負の対数確率です (したがって、*
確率ゼロの負の対数を表します)。と149
マイナス記号は本当に迷惑なので破棄しても構いませんが、少なくともパーサーを壊さないようにする必要があります。
これが私がこれまでに持っているものです:
これは、私が言及した「ジャンク」を処理します。おそらくもっと単純かもしれませんが、それ自体で機能します。
行のnodeNum
先頭にある は、機能する別のパーサーによって処理されるため、私が入る必要はありません。
問題はp_logProb
、emAnnotationSet
.
のパーサーはp_logProb
次のようになります。
そして最後に、次のようにlogProb
エントリを末尾emAnnotationSet
(整数で始まる) から分離しようとします。
そのp_logProb
ため、数字で始まり、小数点を含み、さらに数字を持つ float でのみ成功します (この制限はファイル形式によって尊重されます)。
小数点以下を解析しない場合try
、定義内のが先頭の数字を消費しないようにすることを望んでいましたが、これは機能していないようです。p_logProb
Parsec は、その整数の数字の後に予期しないスペースがあるとまだ不平を言っていますemAnnotationSet
。
列 196 は、マイナス記号の前の整数の後のスペースに対応しているため、p_logProb
パーサーが整数を消費していることに問題があることは明らかです。p_logProb
パーサーが先読みを正しく使用して、その入力をパーサーに残すようにするにはどうすればよいemAnnotationSet
ですか?
haskell - Haskell パーセク解析から多分
私には解けない素朴な疑問。
文字列を String または Maybe Double として解析したいのですが、空の文字列または "n/a" は Nothing として解析されます。たとえば、次のようなものです。
v_nothing (および先頭とトレーニングの空白) に問題があります。
ありがとう。
編集:
v_nothing に対してあらゆる種類のことを試しましたが、役に立ちませんでした。