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