代码之家  ›  专栏  ›  技术社区  ›  Sean Kearon

当fparsec未分析所有输入时进行检测

  •  7
  • Sean Kearon  · 技术社区  · 6 年前

    在不分析所有输入的情况下,如何检测fparsec解析器何时停止?

    例如,下面的解析器 p 当它发现意外字符时停止 d 并且不会继续分析输入的其余部分。

    let test p str =
        match run p str with
        | Success(result, _, _)   -> printfn "Success: %A" result
        | Failure(errorMsg, s, _) -> printfn "Failure: %s %A" errorMsg s 
    
    let str s = pstring s
    
    let a = str "a" .>> spaces
    let b = str "b" .>> spaces
    let p = many (a <|> b)
    
    test p "ab a  d bba  " // Success: ["a"; "b"; "a"]
    
    1 回复  |  直到 6 年前
        1
  •  6
  •   Just another metaprogrammer    6 年前

    有一个特殊的解析器 eof 相当于 $ 在Regex中。

    试试这个:

    let p = many (a <|> b) .>> eof
    

    这样可以确保只有在完全使用输入时解析器才会成功。