Я только начинаю работать с FParsec и не могу обернуться вокруг простого анализатора списков.
С учетом ввода
"{
a;b;c
d;
}"
Я хочу получить результат ['a';'b';'c';'d']
Если я делаю
let baseChars = ['0'..'9'] @ ['A'..'Z'] @ ['a'..'z'] @ ['_'; '-']
let chars : Parser<_> = anyOf baseChars
let nameChars : Parser<_> = anyOf (baseChars @ ['.'])
let semiColonList p : Parser<_> = sepBy p (pstring ";")
let pList p : Parser<_> = between (pstring "{") (pstring "}") (semiColonList p)
do """{
a;b;c;
d;
}"""
|> run (parse {
let! data = pList (spaces >>. many1Chars nameChars)
return data
})
|> printfn "%A"
Я получаю ошибку на последнем}, так как он пытается сопоставить это с парсером nameChars перед закрытием парсера между.
Такое ощущение, что есть простое решение, которое я пропускаю, тем более, что если я удаляю последнюю точку с запятой после того, как d все работает как ожидалось.
Любая помощь приветствуется.
[править]
Благодаря Федору Сойкину работают:
let semiColonList p = many (p .>> (pstring ";" >>. spaces))
let pList p : Parser<_> = between (pstring "{") (pstring "}") (semiColonList p)
"""{
a;b;c;
d;
}"""
|> run (parse {
let! data = pList (spaces >>. many1Chars nameChars)
return data
})
|> printfn "%A"