
Am Sunday 10 January 2010 21:24:40 schrieben Sie:
Hi Daniel, I want to add a let expression to the program so as I can enter let x = y in z or something to that effect. I was going along the lines of using prefix as I cant use infix so I thought I would make it easier by using prefix notation. Probably a bad idea.
John
If you want only one binding per let, I think letExpr = do keyword "let" -- implementation of keyword is left as an exercise bind <- variable -- binding patterns like (x,y) is left for later -- maybe check for "=" ? rhs <- expression keyword "in" use <- expression return (Let bind rhs use) expression = letExpr <|> expr factor = between (char '(') (char ')') expression <|> atom atom = variable <|> number would work (untested).
On Sun, Jan 10, 2010 at 8:14 PM, Daniel Fischer
Am Sonntag 10 Januar 2010 20:33:40 schrieb John Moore:
Hi, Can anyone explain how to turn the code from infix to Prefix. I want to include a let statement below. I not sure of how prefix works.
Can you elaborate? I don't understand what it is you want to do. Do you want to parse expressions in prefix notation (aka Polish notation), such as +(3,4) (or, more Lispy, (+ 3 4))? That'd be simple, but you wouldn't use buldExpressionParser for that (in Polish notation, neither associativity nor precedence have a meaning). Or do you want to add a parser for let-expressions to expr?
expr :: Parser Expr expr = buildExpressionParser table factor <?> "expression" table :: [[Operator Char st Expr]] table = [[op "*" Mul AssocLeft, op "/" Div AssocLeft] ,[op "+" Add AssocLeft, op "-" Sub AssocLeft] ] where op s f assoc = Infix (do{ string s; return f}) assoc factor :: Parser Expr factor = do{ char '(' ; x <- expr ; char ')' ; return x } <|> number <?> "simple expression" number :: Parser Expr number = do{ ds <- many1 alphaNum ; return (Val $ read ds) }
John
participants (1)
-
Daniel Fischer