3

私はText.ParserCombinators.ParsecText.XHtmlを使用して、次のような入力を解析しています。

これは最初の段落の例です\n
2 行\n
\n
これが 2 番目の段落です\n

そして、私の出力は次のようになります。

<p>This is the first paragraph example\n with two lines\n</p> <p>And this is the second paragraph\n</p>

私は定義しました:


line= do{
        ;t<-manyTill (anyChar) newline
        ;return t
        }

paragraph = do{
        t<-many1 (line) 
        ;return ( p << t )
    }

しかし、次のように返されます。

<p>This is the first paragraph example\n with two lines\n\n And this is the second paragraph\n</p>

なにが問題ですか?何か案は?

ありがとう!

4

2 に答える 2

5

manyTill のドキュメントから、最初の引数を0 回以上実行するため、2 つの改行が連続して有効であり、lineパーサーが失敗することはありません。

あなたはおそらくmany1Till(like many1vs many) のようなものを探しているでしょうが、Parsec ライブラリには存在しないようです。完全にテストされていません)

many1Till p end = do
    first <- p
    rest  <- p `manyTill` end
    return (first : rest)

またはより簡潔な方法:

many1Till p end = liftM2 (:) p (p `manyTill` end)
于 2010-04-28T20:37:09.237 に答える
2

ドキュメンテーションによると、コンビネータmanyTill最初の引数 の0 回以上の出現に一致lineするため、空白行を喜んで受け入れmany1 lineます。あなたが意図した。

于 2010-04-28T20:35:46.650 に答える