如何使用FParsec解析注释

Bry*_*dds 7 f# fparsec

我正在尝试使用FParsec从s表达式语言解析lisp样式的注释.我在前一个线程中解析单行注释得到了一些帮助 - 如何将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
Run Code Online (Sandbox Code Playgroud)

不幸的是,multilineComment解析永远不会成功.由于这是一个组合器,我不能放断点或分析为什么它不起作用.

任何想法为什么它不起作用?

Gus*_*Gus 5

尝试将bool参数更改为closeMultilineCommentStrfalse

(charsTillString closeMultilineCommentStr false System.Int32.MaxValue)
Run Code Online (Sandbox Code Playgroud)

否则,它将跳过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
Run Code Online (Sandbox Code Playgroud)