Hoe commentaar te ontleden met FParsec

I'm attempting to parse lisp-style comments from an s-expression language with FParsec. I got a bit of help with parsing single-line comments in this previous thread - How to convert an FParsec parser to parse whitespace

Terwijl dat was opgelost, moet ik nog steeds opmerkingen van meerdere regels parsen. Hier is de huidige code -

/// 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

Helaas slaagt de multilineComment-analyse nooit. Omdat dit een combinator is, kan ik geen breekpunten plaatsen of analyseren waarom het niet werkt.

Om het even welke ideeën waarom het niet zal werken?

7

1 antwoord

Probeer het bool-argument voor closeMultilineCommentStr in false te wijzigen

(charsTillString closeMultilineCommentStr false System.Int32.MaxValue)

Anders wordt de tekenreeks closeMultilineCommentStr overgeslagen.

Om het te laten werken met geneste opmerkingen

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
4
toegevoegd
Zie de update.
toegevoegd de auteur Gustavo, de bron
Ah, geweldig! Ik was afgeleid door te denken dat het een diepe onderliggende parser-kwestie zou zijn, maar het bleek dat het een boolean was die ik gedachteloos had gespecificeerd! Dank je!
toegevoegd de auteur Bryan Edds, de bron
Holy-moly dat ziet er moeilijk uit! Ik ben blij dat ik het vroeg! Ik zal proberen te laten groeten totdat ik het kan krijgen :) Nogmaals bedankt!
toegevoegd de auteur Bryan Edds, de bron