2010-04-14 12 views
6

Vorrei utilizzare Parsec makeTokenParser per generare il mio parser, ma voglio utilizzare la mia definizione di whiteSpace. La seguente sostituzione sostituisce whiteSpace con la mia definizione, ma tutti i parser lexeme utilizzano ancora la vecchia definizione (ad esempio, P.identifier lexer utilizzerà il vecchio whiteSpace).WhiteSpace personalizzato utilizzando Haskell Parsec

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

Guardando il codice per makeTokenParser credo di capire perché funziona in questo modo. Voglio sapere se esistono soluzioni alternative per evitare la duplicazione completa del codice per makeTokenParser?

+0

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

risposta

7

Purtroppo, non penso ci sia un modo. Le definizioni locali utilizzate in makeTokenParser si riferiscono in modo ricorsivo a se stesse e pertanto, come hai notato, lexeme utilizza whiteSpace come definito qui, anziché il membro record whiteSpace da sostituire nell'oggetto lexer.

Il codice è beffardo perché utilizza lo stesso nome di entrambe le funzioni locali in makeTokenParser e come membri record del costruttore TokenParser. Sono in realtà entità completamente distinte.

+2

Ora se solo il 'TokenParser' è stato scritto con le lezioni di tipo, saremmo a posto. – Steve

+1

.. e se potesse fare parser monadici (in Parsec 3) piuttosto che essere cablati fino a 'Identity'. –

Problemi correlati