我有這個測試程序:FParsec沒有很多
open FParsec
let test p str =
match run p str with
| Success(result, _, _) -> printfn "Success: %A" result
| Failure(errorMsg, _, _) -> printfn "Failure: %s" errorMsg
let str s = pstring s
let sepPart = skipNewline >>. pstring "-"
let part = manyChars (notFollowedBy sepPart >>. anyChar)
[<EntryPoint>]
let main argv =
let s = "AA 12345\nBB 6789\n-----\nCC 9876\nDD 54321\n-----"
test part s
test (many part) s
0 // return an integer exit code
線{測試部分S}按預期工作,但下一行,{測試(多部分)S}失敗,我不明白我做錯了什麼。
編輯:
爲了澄清,我試圖做的是有{測試(多部分)S}返回[ 「AA 12345 \ NBB 6789」; 「CC 9876 \ nDD 54321」]。換句話說,我所擁有的是由「pars」或「chunk」組成的輸入字符串,並用所有破折號分隔。對於輸出我想要一個數組,其中每個元素是其中一個部分,並且帶有破折號的行只是被丟棄。
這不會取消錯誤,但它不會返回正確的結果。如果您查看第一個解析{test part}所返回的內容,那麼當部分解析器中的manyChars更改爲many1Chars時,您將看到結果更改。 – JonnyBoats
我沒有看到區別,除了'部分'返回一個字符串和'很多部分'返回一個列表中的字符串。你能否更具體一些,並解釋你期望的輸出?你的解析器永遠不會跳過'sepPart',所以你可能想要'many(part。>> sepPart)''。如果你想匹配分隔符的一個或多個破折號,你還必須使用'skipMany1(pstring「 - 」)'或'skipMany1SatisfyL((=)' - ')「' - '」' 'sepPart'的定義。 –
我編輯了這個問題以更好地描述預期的輸出。我認爲沒有更清楚地開始。 – JonnyBoats