2017-04-11 7 views
1

fparsec을 사용하여 RFC 2822를 구문 분석하려고하는데 여러 줄의 헤더를 처리 할 수 ​​없습니다. 다음 헤더와 혼동을줍니다. 여기가 최선의 시도입니다. do 너는 어떤 조언이있어?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 " 

나는 기대 얻을 \ t 3,1에서 : 배달 - 대상 : [email protected]

답변

1

은 내가 파서의 순서를 (시도를 사용하여) 역 추적하는 데 필요한과 같은 신경 쓰지 no는 항상 \ t를 기대하지만 대신 다음 헤더를 찾습니다.

keyValueComplex = stringLiteral. (ws >>. pchar ':'). >>. (많은 수 (lineValue 시도)). >>.

이 결과는 다음과 같습니다.

(결과는 다음과 같이 나타납니다) : lastValue | >> (재미 ((((g, h)), d), b)

성공 : [("Return-Path", "<[email protected]> werwe"); ("Delivered-To", "[email protected]")