2016-08-31 6 views
1

J'essaie d'écrire ma propre bibliothèque de combinateurs d'analyseurs dans Haskell, et j'ai du mal à analyser les identificateurs. J'ai un type de données défini comme suit qui fera partie de mon AST. Le but de cette expression est de contenir les noms de variables comme je les analyse. L'analyseur est défini comme suit:Combinators Haskell - identificateurs

identifiers :: Parser Expr 
identifiers = do 
    first <- string "_" <|> alphanum 
    rest <- many alphanum 
    guard $ notElem (first:rest) keywords 
    return $ Var (first:rest) 

Je me demandais où dans le parsing prenez-vous en compte la valeur que l'identifiant est lié. Par exemple, si vous aviez number_of_results = 5, l'analyseur analysera le nom de l'identificateur, mais comment faites-vous référence à la valeur de l'identificateur?

Je considérais d'abord redéfinir le type de données comme suit:

data Expr = Var String Value | .... deriving (Show) 

puis, à l'étape de l'analyse syntaxique, jusqu'à ce que je continue à lire à obtenir une valeur.

Cependant, je ne suis pas sûr si je devrais le faire comme ceci ... Quelqu'un pourrait-il suggérer une solution à ce problème?

Répondre

3

Le travail de l'analyseur n'est pas de déterminer quelle est la valeur d'une expression — qui est le travail de l'interpréteur . Le travail de l'analyseur est simplement de transformer un coin de texte en quelque chose de plus facile pour un interprète de travailler avec.

Dans ce cas, vous auriez probablement faire quelque chose comme

data Expr = Assign String Value | Var String | ... 

Vous pouvez ou ne voulez pas faire la distinction entre expressions (qui produisent juste un résultat) et déclarations (qui ne contrôle de flux etc). Cela dépend de la complexité du langage que vous essayez d'analyser.

Vous pouvez également changer cela Assign String Expr, puisque vous pouvez (sans doute?) Affecter le résultat d'une expression arbitraire à une variable, non seulement une constante comme 5.

Une fois que vous avez construit un analyseur qui transforme le texte dans cette structure, puis écrit un interpréteur qui "exécute" le programme comme une autre tâche distincte.

+0

ah je vois, merci. Qs rapide, je me demandais pourquoi dans votre définition pour le type de données Expr, vous avez le constructeur de la valeur Var, à quoi sert-il? J'avais l'impression que si vous aviez une instruction comme x = 5, l'analyseur la convertirait en quelque chose comme (Assign x (Int 5)). Est-ce votre cas de var pour les déclarations de variables qui n'ont pas une liaison initialement, par exemple x; ? – Zubair

+1

@Zubair À quoi sert "5 + x"? – MathematicalOrchid

+1

ah je vois, en supposant que nous avons défini les types de données pertinents, je suppose quelque chose du genre: BinApp Ajouter (Lit Int 5) (Var x), merci pour la clarification. – Zubair