检查解析器序列的最后结果是否对应于谓词-FParsec

时间:2019-03-23 19:44:53

标签: f# fparsec

我想创建一个解析器来解析模块中的数据名称,例如:

lo_element

为此,我想分析所有由点分隔的标识符。问题是我可以对所有这些解析器应用谓词,但是我不知道哪个将是序列中的最后一个,在这种情况下,我希望最后一个标识符以小写字母开头。 这是我的代码:

MyModule.myData // (a module name and a member of the module)

如果我对谓词进行后续分析(如下面的代码),则在出现错误的情况下,不可能返回(例如,使用简单的FParsec'fail'):

type QualName = (string list) * string

let rec identifierP predicate =
    many1Satisfy
        (fun c -> isLetter c || isDigit c || c = ''') >>=
    fun id ->
        if isDigit id.[0]
        then fail "Error: starts by a number"
        else
            if predicate id
            then preturn id
            else fail "Error: identifier don't match with the predicate"

and private idP_capitalized (id: string) = System.Char.IsUpper id.[0]
and private idP_lowered (id: string) = System.Char.IsLower id.[0]
and private idP_nospecified (_: string) = true

and private qualName lastPredicate =
    (sepBy1 (identifierP idP_capitalized (* => from module(s) *)) (pstring "."))
    |>> fun lst -> (lst |> List.rev |> List.tail |> List.rev, lst.Last())

如何分析FParsec中的错误(如果有)?

0 个答案:

没有答案