[英]FParsec failing on optional parser
我目前正在學習 FParsec 庫,但遇到了一個問題。 當我想解析一個可選字符串並在之后繼續正常解析時,FParsec 將在可選解析器上返回一個致命錯誤,而不是像我期望的那樣返回None
。 下面的工作代碼示例說明了我的觀點:
open System
open FParsec
type AccountEntity =
| Default
| Entity of string
let pEntity =
let isEntityFirstChar c = isLetter c
let isEntityChar c = isLetter c || isDigit c
(many1Satisfy2L isEntityFirstChar isEntityChar "entity") .>> skipString "/"
let pOptEntity =
opt pEntity
|>> (fun optEntity ->
match optEntity with
| Some entity -> Entity entity
| None -> Default)
[<EntryPoint>]
let main argv =
printfn "%A" (run pOptEntity "test/account:subaccount") //works
printfn "%A" (run pOptEntity "account:subaccount") //crashes
Console.ReadLine() |> ignore
0 // return an integer exit code
我期望的行為是pOptEntity
在未提供實體時返回Default
實體。 但是,相反,我收到以下錯誤:
Failure:
Error in Ln: 1 Col: 8
account:subaccount
^
Expecting: '/'
不應該opt
提供我所描述的行為並繼續正常解析帳戶字符串,還是我以不正確的方式處理此問題? 我看了一下attempt
但是,我將無法提供我想要的默認實體行為。
非常感謝您的幫助,謝謝。
opt
組合器遵循與<|>
相同的規則; 如果您查看<|>
文檔,它會提到如果第一個解析器失敗而未更改解析器狀態,則會嘗試使用第二個解析器。 http://www.quanttec.com/fparsec/users-guide/parsing-alternatives.html更詳細。
在這里, .>>?
組合器是您想要在pEntity
解析器中使用的。 將.>>
替換為.>>?
並且您將擁有一個pEntity
解析器,如果它后面沒有跟/
,則會回溯到它嘗試的內容的開頭並且不消耗輸入。 這將允許opt
組合器按設計運行。
PS我對此進行了測試,並且有效。 將.>>
替換為.>>?
在pEntity
,然后運行您的代碼產生以下輸出:
Success: Entity "test"
Success: Default
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.