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

Я пытаюсь проанализировать комментарии в стиле lisp из языка s-выражений с помощью FParsec.Мне немного помогли с разбором однострочных комментариев в этой предыдущей теме - Как преобразовать синтаксический анализатор FParsec для разбора пробелов

Пока это решено, мне все еще нужно разобрать многострочные комментарии,Вот текущий код -

/// Read whitespace character as a string.
let spaceAsStr = anyOf whitespaceChars |>> fun chr -> string chr

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

/// Read a multiline comment.
/// TODO: make multiline comments nest.
let multilineComment =
    between
        (pstring openMultilineCommentStr)
        (pstring closeMultilineCommentStr)
        (charsTillString closeMultilineCommentStr true System.Int32.MaxValue)

/// Read whitespace text.
let whitespace =
    lineComment <|>
    multilineComment <|>
    spaceAsStr

/// Skip any white space characters.
let skipWhitespace = skipMany whitespace

/// Skip at least one white space character.
let skipWhitespace1 = skipMany1 whitespace

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

Есть идеи, почему он не работает?

1 Ответ

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

Попробуйте изменить аргумент bool для closeMultilineCommentStr на false

(charsTillString closeMultilineCommentStr false System.Int32.MaxValue)

В противном случае он пропустит строку closeMultilineCommentStr.

Для работы с вложенными комментариями

let rec multilineComment o=
    let ign x = charsTillString x false System.Int32.MaxValue
    between
        (pstring openMultilineCommentStr)
        (pstring closeMultilineCommentStr)
        (attempt (ign openMultilineCommentStr >>. multilineComment >>. ign closeMultilineCommentStr) <|> 
        ign closeMultilineCommentStr) <|o
...