簡體   English   中英

FParsec 在可選解析器上失敗

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM