我想创建一个解析器来解析模块中的数据名称,例如:
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中的错误(如果有)?