1

私はこれを理解するのに苦労しています。

したがって、文字列の後に 1 つまたは複数のスペースがなく、1 つまたは複数の改行文字が続く場合、それは行末であり、その行を返します。文字列の後に 1 つまたは複数の改行文字が続き、その後に 1 つまたは複数のスペースが続く場合、それは行の継続であり、スペースのない改行に遭遇するまで続けます。それからそれを返します。

これは私の脳を完全にロックしました。助けてください。

アップデート

上記の説明に混乱がある場合に備えて、例を挙げます

From: John Doe <j.doe@gmail.com>
To: dude@cooldomain.biz
Content-Type: multipart/alternative;
  boundary=047d7b2e4e3cdc627304eb094bfe

上記のテキストを考えると、次のようにさらに処理するために3行を解析できるはずです

["From: John Doe <j.doe@gmail.com>", "To: dude@cooldomain.biz", "Content-Type: multipart/alternative; boundary=047d7b2e4e3cdc627304eb094bfe"]
4

2 に答える 2

1

パーサーを複数のパスに分割することをお勧めします。これにより、式を解析するためのコードが空白処理で乱雑にならなくなります。例:

  • lex :: String -> [Token]

    空白を処理し、入力をトークンに分割します。

  • parse :: Parsec [Token] Expr

    トークンのストリームを式ツリーに変換します。

継続する行を結合するための非常に簡単な方法を次に示します。

-- | For each line with whitespace in front of it,
-- remove it and append it to the preceding line.
joinContinuedLines :: [String] -> [String]
joinContinuedLines [] = []
joinContinuedLines (x0:xs0) = go x0 xs0
  where
    go joinedLine (x : xs)
      | startsWithSpace x = go (joinedLine ++ x) xs
      | otherwise         = joinedLine : go x xs
    go joinedLine [] = [joinedLine]

    startsWithSpace (x:_) = isSpace x
    startsWithSpace ""    = False
于 2013-11-15T06:39:36.557 に答える