私はほとんどアプリケーションスタイルで書いているParsecパーサーを持っています。あるケース(私が使用しているのはsepBy
)で、eol
パーサーに問題があります。まず、いくつかの定義:
eol = try (string "\n\r")
<|> try (string "\r\n")
<|> string "\n"
<|> string "\r"
<?> "eol"
betaLine = string "BETA " *> (StrandPair <$> p_int <*> p_int <*> p_int <*> (p_int *> p_direction) <*> p_exposure) <* eol
注:betaLine
完全に機能します(簡潔にするために、次の定義p_int
などは省略しました。
*HmmPlus> parse betaLine "beta" "BETA 6 11 5 24 -1 oiiio\n"
Right (StrandPair {firstStart = 6, secondStart = 11, pairLength = 5, parallel = Antiparallel, exposure = [Exposed,Buried,Buried,Buried,Exposed]})
この他のパーサーで問題が発生しますhmmMatchEmissions
:
hmmMatchEmissions = spaces *> (V.fromList <$> sepBy p_logProb spaces) <* eol <?> "matchEmissions"
*HmmPlus> parse hmmMatchEmissions "me" " 2.61196 4.43481 2.86148 2.75135 3.26990 2.87580 3.69681\n"
Left "me" (line 2, column 1):
unexpected end of input
ここで<* eol
、パーサー定義からを削除\n
し、行からを削除すると、機能します。
*HmmPlus> parse hmmMatchEmissions "me" " 2.61196 4.43481 2.86148 2.75135 3.26990 2.87580 3.69681"
Right (fromList [NonZero 2.61196,NonZero 4.43481,NonZero 2.86148,NonZero 2.75135,NonZero 3.2699,NonZero 2.8758,NonZero 3.69681])
では、なぜeol
機能しているのに機能してbetaLine
いないのhmmMatchEmissions
ですか?
これが私が使用している唯一の場所であることに注意しsepBy
ます; それが手がかりになりますか?
更新:私は次のことを行いましたが、今では別の方法で失敗します:/
reqSpaces = many1 (oneOf " \t")
optSpaces = many (oneOf " \t")
hmmMatchEmissions = optSpaces *> (V.fromList <$> sepBy1 p_logProb reqSpaces) <* eol <?> "matchEmissions"
そして、ここに失敗があります:
*HmmPlus> parse hmmMatchEmissions "me" " 0.123 0.124\n"
Left "me" (line 1, column 10):
unexpected "0"
expecting eol
0
10列目の予期しない文字が0.124
トークンの最初の文字であることに注意してください。