2013-04-19 4 views
10

complique Je vous écris deux analyseur de passe où je scrute d'abord le texte à l'aide de jetons (Alex) puis analyser les jetons (en utilisant Parsec). Tout va bien jusqu'à ce que j'essaie d'ajouter des informations de position aux jetons afin que je puisse écrire un bon message d'erreur.Suivi de position lorsque Tokens analyse Parser

Au départ, j'avais:

data Token = TAtom | TString String | TInt Integer | TFloat [...] 

Il semble que je peux soit ajouter un élément Position à chaque constructeur Token ou créer un nouveau type comme data TokenWithPosition = T Token Position.

J'ai commencé le dernier chemin, mais maintenant j'ai un problème soit d'avoir à créer un TokenWithPosition avec une fausse position quand je veux décrire un jeton dans Parsec, ou je dois déballer le TokenWithPosition chaque fois que je veux faire une comparaison. Bref, ma belle grammaire propre est surchargée de code pour ignorer les informations de position. Donc ma question: Y at-il un moyen propre de suivre les informations de position sans que cela complique l'analyseur dans la deuxième passe? Cela semble être quelque chose qui aurait une solution standard.

Répondre

3

Vous devez utiliser des fonctions de Text.Parsec.Prim (par exemple, tokenPrim) pour implémenter vos propres "analyseurs primitifs".

Ces analyseurs primitifs mettront à jour l'état interne de Parsec avec les informations de position et renverront un Token pur sans la position.