expression parser

Hi, Could some one point out what I'm doing wrong below. This is a parser which takes an arithmetic expression built up from single digits. Turns 3*4+2 into (3*4)+2 etc.It giving me the last expression in a do statement or parse error on -> (+++) :: Parser a -> Parser a -> Parser a expr :: term( '+' expr |"") term -> factor('*' term |"") expr :: Parser Int expr = do t <- term do char '+' e <- expr return (t + e) +++ return t term :: Parser Int term = do f <- factor do char '*' t <- term return (f * t) +++ return f factor :: Parser Int factor = do d <- digit return (digitToInt d) +++ do char '(' e <- expr char ')' return e eval :: String -> Int eval xs = fst(head(parse expr xs)) John

Am Dienstag 22 Dezember 2009 21:48:11 schrieb John Moore:
Hi, Could some one point out what I'm doing wrong below. This is a parser which takes an arithmetic expression built up from single digits. Turns 3*4+2 into (3*4)+2 etc.It giving me the last expression in a do statement or parse error on ->
(+++) :: Parser a -> Parser a -> Parser a expr :: term( '+' expr |"") term -> factor('*' term |"")
What's happened here? A part of your grammar seems to have slipped into the code.
expr :: Parser Int expr = do t <- term do char '+' e <- expr return (t + e) +++ return t
term :: Parser Int term = do f <- factor do char '*' t <- term return (f * t) +++ return f
factor :: Parser Int factor = do d <- digit return (digitToInt d) +++ do char '(' e <- expr char ')' return e
eval :: String -> Int eval xs = fst(head(parse expr xs))
Maybe it's just the mail programme, but what arrived here had wrong indentation. In expr, the inner do-block isn't aligned with "t <- term". In term, the "return (f * t)" isn't aligned with "char '*'" and "t <- term" and the whole inner dop-block isn't aligned with "f <- factor". In factor, "return (digitToInt d)" isn't aligned with "d <- digit" and in the second block, "char ')'" and "return e" aren't aligned with "char'('" and "e <- expr". Properly aligned and with an implementation of (+++) instead of grammar productions, it should work.
John
participants (2)
-
Daniel Fischer
-
John Moore