|
Packit |
2cbdf3 |
{
|
|
Packit |
2cbdf3 |
|
|
Packit |
2cbdf3 |
module Main (main) where
|
|
Packit |
2cbdf3 |
import System.Exit
|
|
Packit |
2cbdf3 |
import Prelude hiding (lex)
|
|
Packit |
2cbdf3 |
|
|
Packit |
2cbdf3 |
}
|
|
Packit |
2cbdf3 |
|
|
Packit |
2cbdf3 |
%wrapper "gscan"
|
|
Packit |
2cbdf3 |
%token "[Token s]"
|
|
Packit |
2cbdf3 |
%typeclass "Read s"
|
|
Packit |
2cbdf3 |
|
|
Packit |
2cbdf3 |
tokens :-
|
|
Packit |
2cbdf3 |
|
|
Packit |
2cbdf3 |
[a-b]+$ { idtoken 0 }
|
|
Packit |
2cbdf3 |
[c-d]+/"." { idtoken 1 }
|
|
Packit |
2cbdf3 |
[e-f]+/{ tokpred } { idtoken 2 }
|
|
Packit |
2cbdf3 |
^[g-h]+$ { idtoken 3 }
|
|
Packit |
2cbdf3 |
^[i-j]+/"." { idtoken 4 }
|
|
Packit |
2cbdf3 |
^[k-l]+/{ tokpred } { idtoken 5 }
|
|
Packit |
2cbdf3 |
[m-n]+$ { idtoken 6 }
|
|
Packit |
2cbdf3 |
[o-p]+/"." { idtoken 7 }
|
|
Packit |
2cbdf3 |
[q-r]+/{ tokpred } { idtoken 8 }
|
|
Packit |
2cbdf3 |
[0-1]^[s-t]+$ { idtoken 9 }
|
|
Packit |
2cbdf3 |
[2-3]^[u-v]+/"." { idtoken 10 }
|
|
Packit |
2cbdf3 |
[4-5]^[w-x]+/{ tokpred } { idtoken 11 }
|
|
Packit |
2cbdf3 |
[y-z]+ { idtoken 12 }
|
|
Packit |
2cbdf3 |
[A-B]+$ ;
|
|
Packit |
2cbdf3 |
[C-D]+/"." ;
|
|
Packit |
2cbdf3 |
[E-F]+/{ tokpred } ;
|
|
Packit |
2cbdf3 |
^[G-H]+$ ;
|
|
Packit |
2cbdf3 |
^[I-J]+/"." ;
|
|
Packit |
2cbdf3 |
^[K-L]+/{ tokpred } ;
|
|
Packit |
2cbdf3 |
[M-N]+$ ;
|
|
Packit |
2cbdf3 |
[O-P]+/"." ;
|
|
Packit |
2cbdf3 |
[Q-R]+/{ tokpred } ;
|
|
Packit |
2cbdf3 |
[0-1]^[S-T]+$ ;
|
|
Packit |
2cbdf3 |
[2-3]^[U-V]+/"." ;
|
|
Packit |
2cbdf3 |
[4-5]^[W-X]+/{ tokpred } ;
|
|
Packit |
2cbdf3 |
[Y-Z]+ ;
|
|
Packit |
2cbdf3 |
\. ;
|
|
Packit |
2cbdf3 |
[ \n\t\r]+ ;
|
|
Packit |
2cbdf3 |
[0-9] ;
|
|
Packit |
2cbdf3 |
|
|
Packit |
2cbdf3 |
{
|
|
Packit |
2cbdf3 |
|
|
Packit |
2cbdf3 |
tokpred :: () -> AlexInput -> Int -> AlexInput -> Bool
|
|
Packit |
2cbdf3 |
tokpred _ _ _ _ = True
|
|
Packit |
2cbdf3 |
|
|
Packit |
2cbdf3 |
idtoken :: Read s => Int -> AlexPosn -> Char -> String -> Int ->
|
|
Packit |
2cbdf3 |
((Int,state) -> [Token s]) -> (Int,state) -> [Token s]
|
|
Packit |
2cbdf3 |
idtoken n _ _ s len cont st = Id n (read ("\"" ++ take len s ++ "\"")) : cont st
|
|
Packit |
2cbdf3 |
|
|
Packit |
2cbdf3 |
data Token s = Id Int s deriving Eq
|
|
Packit |
2cbdf3 |
|
|
Packit |
2cbdf3 |
lex :: Read s => String -> [Token s]
|
|
Packit |
2cbdf3 |
lex str = alexGScan (\_ _ _ _ -> []) (0 :: Int) str
|
|
Packit |
2cbdf3 |
|
|
Packit |
2cbdf3 |
input = "abab\ndddc.fff\ngh\nijji.\nllmnm\noop.rq0tsst\n3uuvu.5xxw"
|
|
Packit |
2cbdf3 |
|
|
Packit |
2cbdf3 |
tokens = [ Id 0 "abab", Id 1 "dddc", Id 2 "fff", Id 3 "gh", Id 4 "ijji",
|
|
Packit |
2cbdf3 |
Id 5 "ll", Id 6 "mnm", Id 7 "oop", Id 8 "rq", Id 9 "tsst",
|
|
Packit |
2cbdf3 |
Id 10 "uuvu", Id 11 "xxw"]
|
|
Packit |
2cbdf3 |
|
|
Packit |
2cbdf3 |
main :: IO ()
|
|
Packit |
2cbdf3 |
main =
|
|
Packit |
2cbdf3 |
let
|
|
Packit |
2cbdf3 |
result :: [Token String]
|
|
Packit |
2cbdf3 |
result = lex input
|
|
Packit |
2cbdf3 |
in do
|
|
Packit |
2cbdf3 |
if result /= tokens
|
|
Packit |
2cbdf3 |
then exitFailure
|
|
Packit |
2cbdf3 |
else exitWith ExitSuccess
|
|
Packit |
2cbdf3 |
|
|
Packit |
2cbdf3 |
}
|