Как преобразовать парсер FParsec в парсинг пробелов - PullRequest
1 голос
/ 06 декабря 2011

Я реализую синтаксический анализатор, который обрабатывает комментарии как пробелы в FParsec Кажется, что это требует тривиального преобразования парсера, но я пока не знаю, как это реализовать.

Вот код, который я пытаюсь получить для проверки типов -

let whitespaceTextChars = " \t\r\n"

/// Read whitespace characters.
let whitespaceText = many (anyOf whitespaceTextChars)

/// Read a line comment.
let lineComment = pchar lineCommentChar >>. restOfLine true

/// Skip any white space characters.
let skipWhitespace = skipMany (lineComment <|> whitespaceText)

/// Skip at least one white space character.
let skipWhitespace1 = skipMany1 (lineComment <|> whitespaceText)

Ошибка на втором аргументе обоих операторов <|> (более whitespaceText). Ошибки -

Error   1   Type mismatch. Expecting a     Parser<string,'a>     but given a     Parser<char list,'a>     The type 'string' does not match the type 'char list'
Error   2   Type mismatch. Expecting a     Parser<string,'a>     but given a     Parser<char list,'a>     The type 'string' does not match the type 'char list'

Кажется, мне нужно преобразовать Parser<char list, 'a> в Parser<string, 'a>. Или, поскольку я просто их пропускаю, я могу преобразовать их в Parser<unit, 'a>. Однако я не знаю, как написать этот код. Это простое лямбда-выражение?

ура!

1 Ответ

2 голосов
/ 06 декабря 2011

let whitespaceText = manyChars (anyOf whitespaceTextChars)

или

let whitespaceText = many (anyOf whitespaceTextChars) |>> fun cs -> System.String (Array.ofList cs)

...