{- Title: Little Parsec Lexer for expression tokens (See Parsec manual ...) Author: Robin Cockett Date: 10 Jan 2006 -} module Exlexer (lexer,Tok,Token(ADD,MUL,LPAR,RPAR,NUM)) where import Text.ParserCombinators.Parsec data Token = ADD|MUL|LPAR|RPAR|NUM Integer deriving (Show,Eq) type Tok = (SourcePos,Token) lexer:: Parser [Tok] lexer = do space -- eat spaces ts <- lexer return ts <|> do p <- getPosition n <- num -- eat numbers ts <- lexer return ((p,n):ts) <|> do p <- getPosition n <- add -- eat and tokenize addition symbol ts <- lexer return ((p,n):ts) <|> do p <- getPosition n <- mul -- eat and tokenize multiplication symbol ts <- lexer return ((p,n):ts) <|> do p <- getPosition n <- lpar -- eat and tokenize left parenthesis symbol ts <- lexer return ((p,n):ts) <|> do p <- getPosition n <- rpar -- eat and tokenize right parenthesis symbol ts <- lexer return ((p,n):ts) <|> do eof return [] where num :: Parser Token num = do d <- digit ds <- digit_more return (NUM (read (d:ds))) "number" digit_more :: Parser String digit_more = do d <- digit ds <- digit_more return (d:ds) <|> return [] add = do char '+' return ADD mul = do char '*' return MUL lpar= do char '(' return LPAR rpar= do char ')' return RPAR