WhiteSpace personnalisé en utilisant Haskell parsec
-
27-09-2019 - |
Question
Je voudrais utiliser le makeTokenParser
de parsec pour construire mon analyseur, mais je veux utiliser ma propre définition de whiteSpace
. Faire les suivants whiteSpace
avec remplace ma définition, mais tous les lexeme
parseurs utilisent encore l'ancienne définition (par exemple P.identifier lexer
utilisera l'ancien whiteSpace).
...
lexer :: P.TokenParser ()
lexer = l { P.whiteSpace = myWhiteSpace }
where l = P.makeTokenParser myLanguageDef
...
En regardant le code makeTokenParser
Je pense que je comprends pourquoi cela fonctionne de cette façon. Je veux savoir s'il y a des solutions de contournement pour éviter de dupliquer complètement le code pour makeTokenParser
?
La solution
Malheureusement, je ne pense pas qu'il y ait un moyen. Les définitions locales utilisées dans makeTokenParser
se réfèrent récursive eux-mêmes, et ainsi, comme vous l'avez remarqué, les utilisations lexeme
whiteSpace
comme il défini, plutôt que l'organe d'enregistrement de whiteSpace
vous remplacez dans votre objet lexer
.
Le code est narguait parce qu'il utilise les mêmes noms que les fonctions locales dans makeTokenParser
et en tant que membres enregistrement du constructeur TokenParser
. Ils sont en fait des entités totalement distinctes.