Фактический сценарий ниже составлен.Цель этого вопроса - понять, что здесь делает FParsec.
Я анализирую список строк (w)
и (x)
, разделенных одним или несколькими пробелами ' '
.
Анализатор для моего списка xs
использует sepBy
с анализатором-разделителем isSeparator
.
isSeparator
основан на manySatisfy
и, похоже, правильно использует пробелы.Я полагаю, что это можно увидеть в тестовом выводе ниже, когда он анализирует два начальных пробела, он заканчивается в позиции 3.
Однако он не работает, когда я использую его в xs
, как показано ниже.
Почему это терпит неудачу и каков будет хороший подход для работы с разделителем, который может быть одним или несколькими пробелами?
open FParsec
let test p str =
match run p str with
| Success(result, _, p) -> printfn "Success: %A position = %A" result p
| Failure(errorMsg, _, _) -> printfn "Failure: %s" errorMsg
let str s = pstringCI s
let w = str "(w)"
let z = str "(z)"
let woz = w <|> z
let isSeparator = manySatisfy (fun c -> c = ' ')
let xs = sepBy woz isSeparator
test isSeparator " (w)" // Success: " " position = (Ln: 1, Col: 3)
test xs "(z) (w)" // Failure: Error in Ln: 1 Col: 8
// (z) (w)
// ^
// Note: The error occurred at the end of the input stream.
// Expecting: '(w)' (case-insensitive) or '(z)' (case-insensitive)