2011-12-06 11 views
6

Sto tentando di analizzare commenti in stile Lisp da un linguaggio di espressione S con FParsec. Ho avuto un po 'di aiuto con l'analisi dei commenti a riga singola in questo thread precedente - How to convert an FParsec parser to parse whitespaceCome analizzare i commenti con FParsec

Mentre ciò è stato risolto, devo ancora analizzare i commenti multilinea. 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, il parsing multilineComment non ha mai esito positivo. Poiché si tratta di un combinatore, non posso inserire punti di interruzione o analizzare perché non funzionerà.

Qualche idea sul perché non funziona?

risposta

4

provare a cambiare l'argomento bool per closeMultilineCommentStr false

(charsTillString closeMultilineCommentStr false System.Int32.MaxValue) 

Altrimenti saltare la corda closeMultilineCommentStr.

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 
+0

Ah, meraviglioso! Sono stato distratto pensando che sarebbe stato un problema di parser profondo, ma si è scoperto che era un booleano che ho specificato senza pensieri! Grazie! –

+0

Vedere l'aggiornamento. – Gustavo

+0

Holy-moly che sembra difficile! Sono contento di averlo chiesto! Cercherò di farlo finché non riuscirò a ottenerlo :) Grazie ancora! –

Problemi correlati