1 { 2 3 module Main (main) where 4 import System.Exit 5 import Prelude hiding (lex) 6 7 } 8 9 %wrapper "posn" 10 %token "Token s" 11 %typeclass "Read s" 12 13 tokens :- 14 15 [a-b]+$ { idtoken 0 } 16 [c-d]+/"." { idtoken 1 } 17 [e-f]+/{ tokpred } { idtoken 2 } 18 ^[g-h]+$ { idtoken 3 } 19 ^[i-j]+/"." { idtoken 4 } 20 ^[k-l]+/{ tokpred } { idtoken 5 } 21 [m-n]+$ { idtoken 6 } 22 [o-p]+/"." { idtoken 7 } 23 [q-r]+/{ tokpred } { idtoken 8 } 24 [0-1]^[s-t]+$ { idtoken 9 } 25 [2-3]^[u-v]+/"." { idtoken 10 } 26 [4-5]^[w-x]+/{ tokpred } { idtoken 11 } 27 [y-z]+ { idtoken 12 } 28 [A-B]+$ ; 29 [C-D]+/"." ; 30 [E-F]+/{ tokpred } ; 31 ^[G-H]+$ ; 32 ^[I-J]+/"." ; 33 ^[K-L]+/{ tokpred } ; 34 [M-N]+$ ; 35 [O-P]+/"." ; 36 [Q-R]+/{ tokpred } ; 37 [0-1]^[S-T]+$ ; 38 [2-3]^[U-V]+/"." ; 39 [4-5]^[W-X]+/{ tokpred } ; 40 [Y-Z]+ ; 41 \. ; 42 [ \n\t\r]+ ; 43 [0-9] ; 44 45 { 46 47 tokpred :: () -> AlexInput -> Int -> AlexInput -> Bool 48 tokpred _ _ _ _ = True 49 50 idtoken :: Read s => Int -> AlexPosn -> String -> Token s 51 idtoken n _ s = Id n (read ("\"" ++ s ++ "\"")) 52 53 data Token s = Id Int s 54 deriving (Show, Ord, Eq) 55 56 lex :: Read s => String -> [Token s] 57 lex = alexScanTokens 58 59 input = "abab\ndddc.fff\ngh\nijji.\nllmnm\noop.rq0tsst\n3uuvu.5xxw" 60 61 tokens = [ Id 0 "abab", Id 1 "dddc", Id 2 "fff", Id 3 "gh", Id 4 "ijji", 62 Id 5 "ll", Id 6 "mnm", Id 7 "oop", Id 8 "rq", Id 9 "tsst", 63 Id 10 "uuvu", Id 11 "xxw"] 64 65 main :: IO () 66 main = 67 let 68 result :: [Token String] 69 result = lex input 70 in do 71 if result /= tokens 72 then exitFailure 73 else exitWith ExitSuccess 74 75 } 76