data Expr = Var Char | Tall Int | Sum Expr Expr | Mult Expr Expr | Neg Expr | Let Expr Expr Expr
deriving(Eq, Show)
parseExpr :: String -> (Expr, String)
parseExpr ('*':'(':s) = (Mult x y, s'')
where (x,',':s') = parseExpr s
(y,')':s'') = parseExpr s'
parseExpr ('+':'(':s) = (Sum x y, s'')
where (x,',':s') = parseExpr s
(y,')':s'') = parseExpr s'
parseExpr (x : xs) | isDigit x = (Tall (digitToInt x), xs)
parseExpr (x:s) = (Var x,s)
where x >= 'A' = True
x <= 'Z' = True
Mon analyseur manque de deux choses avant qu'il ne soit complet. A partir du type de données ci-dessus, il manque "Neg Expr" et Let "Expr Expr Expr". La première partie serait quelque chose comme ceci:Problème récursif Haskell, analyseur minuscule. Négation de Expr et laisser des expressions
parseExpr('-'
parseExpr('l':'e':'t':x:'b':'e
Comme dans le type de données, les expressions Let commence par let et prend place dans trois Expr. Je ne sais pas comment écrire ces dernières fonctions. Toute aide sera très appréciée.
J'ai posé une autre question ici sur SO à ce sujet, et here est le lien pour cette question.
Voici un exemple:
parseProg "let X be 4 in let Y be *(2 , X) in let Z be +(Y , X) in
+(+(X , Y) , Z)"
Let (Var 'X') (Tall 4) (Let (Var 'Y') (Mult (Tall 2) (Var 'X')) (Let
(Var 'Z') (Sum (Var 'Y') (Var 'X')) (Sum (Sum (Var 'X') (Var 'Y')) (Var
'Z'))))
En effet, j'ai une fonction pour supprimer les espaces. La fonction de filtre fonctionne très bien. – Algific