2010-04-14 15 views
6

Me gustaría utilizar el makeTokenParser de Parsec para construir mi analizador, pero quiero usar mi propia definición de whiteSpace. Hacer lo siguiente reemplaza whiteSpace con mi definición, pero todos los analizadores lexeme todavía usan la definición anterior (por ejemplo, P.identifier lexer usará el viejo whiteSpace).Espacio en blanco personalizado con Haskell Parsec

... 
lexer :: P.TokenParser() 
lexer  = l { P.whiteSpace = myWhiteSpace } 
    where l = P.makeTokenParser myLanguageDef 
... 

Mirando el código para makeTokenParser creo que entiendo por qué funciona de esta manera. Quiero saber si hay alguna solución alternativa para evitar duplicar por completo el código de makeTokenParser?

+0

Relacionados: http://stackoverflow.com/questions/5672142/in-parsec-is-there-a-way-to-prevent-lexeme-from-consuming-newlines –

Respuesta

7

Lamentablemente, no creo que haya una manera. Las definiciones locales utilizadas en makeTokenParser se refieren recíprocamente a sí mismas y, como ha notado, lexeme usa whiteSpace como se define allí, en lugar del miembro de registro whiteSpace que reemplaza en su objeto lexer.

El código es burlón porque utiliza los mismos nombres que las funciones locales en makeTokenParser y como miembros de registro del constructor TokenParser. De hecho, son entidades totalmente distintas.

+2

Ahora si solo se escribió el 'TokenParser' con clases de tipo, estaríamos bien para irnos. – Steve

+1

.. y si pudiera hacer analizadores monádicos (en Parsec 3) en lugar de estar cableados hasta 'Identidad'. –

Cuestiones relacionadas