2011-12-05 9 views
12

Estoy tratando de aprender a usar Parsec para escribir un analizador Delphi, pero me estoy atascado en la definición de LanguageDef.Cómo definir el tipo múltiple de bloque de comentarios en Parsec

En Delphi, hay dos tipos de bloques de comentarios, (* comments *) y { comments }. Pero los tipos de commentStart & commentEnd of LanguageDef son String, no [String], así que solo pude poner uno o el otro.

Así que traté de hacer mi propio analizador de whiteSpace, pero no estoy seguro de poder pasarlo al makeTokenParser.

Cualquier ayuda sería apreciada.

Gracias


John y Chris me han ayudado a entender y evitar el problema, pero la solución consiste en reemplazar un gran número de programas de análisis que makeTokenParser permita, por lo que no es exactamente deseable.

Volveré a publicar si pudiera encontrar una solución mejor.

+0

Sé que esto no responde a su pregunta, pero Mike Lischke hecho un analizador de Delphi de código abierto y léxico, conocido como [DCC] (http://www.soft-gems.net/index.php?option=com_content&task=view&id=25&Itemid=33). –

Respuesta

5

Mi lectura del archivo Text.ParserCombinators.Parsec.Language es que esto no se puede hacer directamente usando un LanguageDef.

Creo que está en el camino correcto para escribir su propio analizador whiteSpace. Para utilizarlo con éxito, debe sobrescribir el analizador whiteSpace generado por makeTokenParser. El TokenParser creado por makeTokenParser es un registro con cada campo que contiene un analizador. Podemos crear una nueva copia del registro con uno de esos campos sustituye por el siguiente:

-- ask GCHi for the type actual type signature constraints 
-- Type sig is approx. fixWhiteSpace :: TokenParser -> Parser -> TokenParser 
fixWhiteSpace originalTokenParser myWhiteSpaceParser = 
    originalTokenParser {whiteSpace = myWhiteSpaceParser} 
+0

Lo intenté rápido, no pareció funcionar, pero podría estar haciendo algo diferente. Voy a pasar un poco más de tiempo en eso. Solo para confirmar, si hay otro analizador en 'originalTokenParser' que se define con el' whiteSpace' original, ¿utilizaría este analizador automáticamente 'myWhiteSpaceParser' una vez que haya aplicado' fixWhiteSpace'? – ePak

+1

@epak: No. Todos los valores son inmutables, por lo que definir "newParser = fixWhiteSpace blach" no afecta a originalTokenParser. –

+0

@ChrisKuklewicz: Gracias por aclarar eso y, de hecho, ese es el problema subyacente. El analizador 'lexeme' se define en términos de' whiteSpace' y muchos más analizadores, incluido 'identifier', se definen en términos de' lexeme'. Una vez que haya reemplazado el analizador 'identificador' con mi definición de' lexeme' y 'whiteSpace' como sugirió @John, manejaría varios tipos de bloques de comentarios. – ePak

Cuestiones relacionadas