{ module Lexer where } %wrapper "posn" $digit = 0-9 $alpha = [a-zA-Z] $special = [\.\;\,\$\|\*\+\?\#\~\-\{\}\(\)\[\]\^\/] $graphic = $printable # $white $eol = [\n] @string = \" ($graphic # \")* \" @escape = ’\\’ ($printable | $digit+) @char = \' ($graphic # $special) \' | \' @escape \' @id = [A-Za-z][A-Z0-9a-z_]* @double = [0-9]+[\.][0-9]+ tokens :- $white+ ; $eol ; "--".* ; $digit+ { tok (\p s -> T (TokenInt) p s) } [\+] { tok (\p s -> T (TokenAdd) p s) } [\-] { tok (\p s -> T (TokenMin) p s) } [\*] { tok (\p s -> T (TokenMul) p s) } [\/] { tok (\p s -> T (TokenDiv) p s) } [\=] { tok (\p s -> T (TokenAssign) p s) } [\\] { tok (\p s -> T (TokenLamVars) p s) } "." { tok (\p s -> T (TokenLamExpr) p s) } "<" { tok (\p s -> T (TokenLT) p s) } "<=" { tok (\p s -> T (TokenLTE) p s) } "==" { tok (\p s -> T (TokenEQ) p s) } "/=" { tok (\p s -> T (TokenNEQ) p s) } ">=" { tok (\p s -> T (TokenGTE) p s) } ">" { tok (\p s -> T (TokenGT) p s) } "&" { tok (\p s -> T (TokenAnd) p s) } "|" { tok (\p s -> T (TokenOr) p s) } let { tok (\p s -> T (TokenLet) p s) } letrec { tok (\p s -> T (TokenLetRec) p s) } in { tok (\p s -> T (TokenIn) p s) } case { tok (\p s -> T (TokenCase) p s) } of { tok (\p s -> T (TokenOf) p s) } "->" { tok (\p s -> T (TokenArrow) p s) } Pack { tok (\p s -> T (TokenPack) p s) } "{" { tok (\p s -> T (TokenLBrace) p s) } "}" { tok (\p s -> T (TokenRBrace) p s) } "(" { tok (\p s -> T (TokenLParen) p s) } ")" { tok (\p s -> T (TokenRParen) p s) } ";" { tok (\p s -> T (TokenSemiColon) p s) } "," { tok (\p s -> T (TokenComma) p s) } @id { tok (\p s -> T (TokenSym) p s) } { tok f p s = f p s data Token = T TokenClass AlexPosn String data TokenClass = TokenInt | TokenSym | TokenAdd | TokenMin | TokenMul | TokenDiv | TokenAssign | TokenLamVars | TokenLamExpr | TokenLT | TokenLTE | TokenEQ | TokenNEQ | TokenGTE | TokenGT | TokenAnd | TokenOr | TokenLet | TokenLetRec | TokenIn | TokenCase | TokenOf | TokenArrow | TokenPack | TokenLBrace | TokenRBrace | TokenLParen | TokenRParen | TokenSemiColon | TokenComma | TokenEOF deriving (Eq, Show) showPos :: AlexPosn -> String showPos (AlexPn _ l c) = "line " ++ show l ++ ":" ++ show c scanTokens :: String -> [Token] scanTokens = alexScanTokens instance Show Token where show (T TokenSym _ s) = s show (T TokenInt _ i) = show i show (T TokenAdd _ _) = "+" show (T TokenMin _ _) = "-" show (T TokenMul _ _) = "*" show (T TokenDiv _ _) = "/" show (T TokenAssign _ _) = "=" show (T TokenLamVars _ _) = "\\" show (T TokenLamExpr _ _) = "." show (T TokenLT _ _) = "<" show (T TokenLTE _ _) = "<=" show (T TokenEQ _ _) = "==" show (T TokenNEQ _ _) = "/=" show (T TokenGTE _ _) = ">=" show (T TokenGT _ _) = ">" show (T TokenAnd _ _) = "&" show (T TokenOr _ _) = "|" show (T TokenLet _ _) = "let" show (T TokenLetRec _ _) = "letrec" show (T TokenIn _ _) = "in" show (T TokenCase _ _) = "case" show (T TokenOf _ _) = "of" show (T TokenArrow _ _) = "->" show (T TokenPack _ _) = "Pack" show (T TokenLBrace _ _) = "{" show (T TokenRBrace _ _) = "}" show (T TokenLParen _ _) = "(" show (T TokenRParen _ _) = ")" show (T TokenSemiColon _ _) = ";" show (T TokenComma _ _) = "," show (T TokenEOF _ _) = "EOF" }