1 module ArithParser where
9 import Text.ParserCombinators.Parsec
10 import qualified Text.ParserCombinators.Parsec.Token as P
11 import Text.ParserCombinators.Parsec.Language
12 import Text.ParserCombinators.Parsec.Expr
14 lexer :: P.TokenParser ()
15 lexer = P.makeTokenParser
17 { reservedOpNames = ["*","/","+","-"]
20 statement :: Parser Stmt
21 statement = do s <- statement'
25 statement' :: Parser Stmt
26 statement' = try((do [i] <- identifier
28 then fail "character a-z expected"
32 return $ Assign i e) <?> "assignment")
37 cmd = try (do symbol ":help"
39 <|> try (do symbol ":verbose"
41 <|> (do symbol ":quit"
45 expr = buildExpressionParser table factor
48 table = [[op "*" Mul AssocLeft, op "/" Div AssocLeft]
49 ,[op "+" Add AssocLeft, op "-" Sub AssocLeft]
53 = Infix (do{ reservedOp s; return f} <?> "operator") assoc
56 <|> liftM (Lit . fromInteger) natural
57 <|> (do [i] <- identifier
59 then fail "character a-z expected"
62 <?> "simple expression"
64 whiteSpace= P.whiteSpace lexer
65 lexeme = P.lexeme lexer
66 symbol = P.symbol lexer
67 natural = P.natural lexer
68 parens = P.parens lexer
70 identifier= P.identifier lexer
71 reserved = P.reserved lexer
72 reservedOp= P.reservedOp lexer