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?

Était-ce utile?

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.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top