2011-12-06 8 views
6

Estoy intentando analizar comentarios de estilo lisp desde un lenguaje s-expression con FParsec. Obtuve un poco de ayuda con el análisis de comentarios de una sola línea en este hilo anterior - How to convert an FParsec parser to parse whitespaceCómo analizar comentarios con FParsec

Mientras eso se resolvió, todavía necesito analizar comentarios de líneas múltiples. Aquí está el código actual -

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

Desafortunadamente, el análisis multilineComment nunca tiene éxito. Como este es un combinador, no puedo poner puntos de corte ni analizar por qué no funcionará.

¿Alguna idea de por qué no funciona?

Respuesta

4

trate de cambiar el argumento bool para closeMultilineCommentStr en false

(charsTillString closeMultilineCommentStr false System.Int32.MaxValue) 

De lo contrario, pasar por alto la cadena closeMultilineCommentStr.

para que funcione con los comentarios anidados

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, maravilloso! Estaba distraído al pensar que sería un problema profundo del analizador subyacente, ¡pero resulta que era un booleano que especifiqué sin pensar! ¡Gracias! –

+0

Ver la actualización. – Gustavo

+0

¡Holy-moly que parece difícil! ¡Me alegro de haber preguntado! Trataré de asimilar eso hasta que pueda obtenerlo :) ¡Gracias de nuevo! –

Cuestiones relacionadas