2

私はほとんどアプリケーションスタイルで書いている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

010列目の予期しない文字が0.124トークンの最初の文字であることに注意してください。

4

1 に答える 1

4

問題は、p_logProbパーサーが空白を消費することです。したがって、これは解析中に発生することです。

  0.123  0.124\n
[]               optSpaces
  [-----]        p_logProb
         {       trying reqSpaces
         {       trying eol
                 failure: expecting eol

パーサーは、p_logProb解析するもの、つまり実際の数値のみを消費する必要があります。これにより、意図した解析が行われます。

  0.123  0.124\n
[]               optSpaces
  [---]          p_logProb
       []        reqSpaces
         [---]   p_logProb
              {  trying reqSpaces
              #  eol
于 2012-05-24T19:42:00.247 に答える