2017-04-11 12 views
1

fparsecを使用してRFC 2822を解析しようとしていますが、複数行のヘッダーを処理できません:(次のヘッダーと混同します) 何かヒントはありますか?複数のヘッダー行を解析するfparsec rfc2822

let str (s:string) = pstring s 

let stringLiteral = 
    manySatisfy (fun c -> c <> ':' && c <> '\r' && c <> '\n') 

let ws = many (pchar ' ') 

let keyValueSimple = stringLiteral .>>. (ws >>. str ":" >>. ws >>. stringLiteral) .>>. pchar '\n' |>> (fun (a,b) -> a) 

let lineValue = ws >>. stringLiteral .>>. (pchar '\n' .>>. (pchar '\t')) |>> (fun (a,b) -> a) 

let lastValue = ws >>. stringLiteral .>>. (pchar '\n' .>> notFollowedBy (pchar '\t')) |>> (fun (a,b) -> a) 

let keyValueComplex = stringLiteral .>>. (ws >>. pchar ':') .>>. (many lineValue) .>>. lastValue |>> (fun (((f),d),b) -> (f,f))      

let headers = many1 (keyValueComplex) 

let parse (fileName:string) = 
    test headers "Return-Path: <[email protected]>\n\twerwe\nDelivered-To: [email protected]\n " 

私は期待してます\トン3,1で:配信-TO:[email protected]

答えて

1

はそれが私はパーサのために(試みを使用して)バックトラックするために必要なように見える気にしませんnoは常に\ tを期待するが、代わりに次のヘッダを探す。

はkeyValueComplex = stringLiteralてみましょう。>>。 (ws >>。pchar ':')。 (多く(試行lineValue))。

これで今度は:

が返されます(これは次のようになります):lastValue | >>(fun(((g、h))、d)、b)

成功:[( "リターンパスを"、 "<[email protected]> werwe"); ( "配信先"、 "[email protected]")]

関連する問題