1 { 2 {-# LANGUAGE OverloadedStrings #-} 3 module Main (main) where 4 import System.Exit 5 import Data.ByteString.Lazy.Char8 (unpack) 6 } 7 8 %wrapper "posn-bytestring" 9 %encoding "UTF8" 10 11 $digit = 0-9 -- digits 12 $alpha = [a-zA-Z] -- alphabetic characters 13 14 tokens :- 15 16 $white+ ; 17 "--".* ; 18 let { tok (\p _ -> Let p) } 19 in { tok (\p _ -> In p) } 20 $digit+ { tok (\p s -> Int p (read (unpack s))) } 21 [\=\+\-\*\/\(\)] { tok (\p s -> Sym p (head (unpack s))) } 22 $alpha [$alpha $digit \_ \']* { tok (\p s -> Var p (unpack s)) } 23 24 { 25 -- Each right-hand side has type :: AlexPosn -> String -> Token 26 27 -- Some action helpers: 28 tok f p s = f p s 29 30 -- The token type: 31 data Token = 32 Let AlexPosn | 33 In AlexPosn | 34 Sym AlexPosn Char | 35 Var AlexPosn String | 36 Int AlexPosn Int | 37 Err AlexPosn 38 deriving (Eq,Show) 39 40 main = if test1 /= result1 then exitFailure 41 else exitWith ExitSuccess 42 43 test1 = alexScanTokens " let in 012334\n=+*foo bar__'" 44 result1 = [Let (AlexPn 2 1 3),In (AlexPn 6 1 7),Int (AlexPn 9 1 10) 12334,Sym (AlexPn 16 2 1) '=',Sym (AlexPn 17 2 2) '+',Sym (AlexPn 18 2 3) '*',Var (AlexPn 19 2 4) "foo",Var (AlexPn 23 2 8) "bar__'"] 45 46 47 } 48