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?
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
@Zubair À quoi sert "5 + x"? – MathematicalOrchid
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