Come analizzare i commenti con fparsec
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à?
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