我正在嘗試使用 FParsec 來決議表單的零個或多個元素的串列,[string]其中中間的字串可以是任何內容(除了]消除字串末尾的歧義)。這是我的代碼:
let parseArgumentList : Parser<string list, unit> =
let parseArgument = (skipChar '[') >>. (manySatisfy (fun x -> x <> ']')) .>> (skipChar ']')
sepBy (parseArgument) (spaces)
[<EntryPoint>]
let main argv =
let parserResult = run parseArgumentList "[testString] [testString]"
printfn "%A" parserResult
0
這里的輸出是:
Failure:
Error in Ln: 1 Col: 26
[testString] [testString]
^
Note: The error occurred at the end of the input stream.
Expecting: '['
就好像決議器期待另一組括號,而不是在 中出現 2 次時終止sepBy。我通過更改spacesto 來測驗它(skipChar ' ') >>. spaces,果然它決議得很好。然而,我不愿意洗掉引數之間沒有空格的選項。任何想法或建議將不勝感激。
uj5u.com熱心網友回復:
我認為使用sepEndBy而不是sepBy會做你想要的:
let parseArgumentList =
sepEndBy parseArgument spaces
來自FParser 檔案:決議器sepEndBy p sep決議零次或多次出現的p分隔和可選的以 sep. (加了重點。)
在您的測驗輸入上運行它會產生預期的結果:
Success: ["testString"; "testString"]
請注意,此解決方案還具有消耗尾隨空格的好處(如果有的話)。例如,當輸入為 時"[testString] [testString] "。
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/317018.html
