Domanda

Sto tentando di analizzare commenti in stile LISP da un linguaggio di espressione S con FPARSEC. Ho ricevuto un po 'di aiuto con l'analisi dei commenti a linea singola in questo thread precedente - Come convertire un parser fparsec per analizzare lo spazio bianco

Mentre è stato risolto, ho ancora bisogno di analizzare i commenti multilinei. Ecco il codice corrente -

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

Sfortunatamente, lo slancio multilinecomment non riesce mai. Dal momento che questo è un combinatori, non posso mettere i punti di interruzione o analizzare il motivo per cui non funzionerà.

Qualche idea per cui non funzionerà?

È stato utile?

Soluzione

Prova a cambiare l'argomento bool per closeMultilineCommentStr a false

(charsTillString closeMultilineCommentStr false System.Int32.MaxValue)

Altrimenti salterà il closeMultilineCommentStr corda.

Per farlo funzionare con commenti nidificati

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
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top