|
Packit |
2cbdf3 |
{
|
|
Packit |
2cbdf3 |
module Main (main) where
|
|
Packit |
2cbdf3 |
import System.Exit
|
|
Packit |
2cbdf3 |
}
|
|
Packit |
2cbdf3 |
|
|
Packit |
2cbdf3 |
%wrapper "basic"
|
|
Packit |
2cbdf3 |
|
|
Packit |
2cbdf3 |
$digit=0-9 -- digits
|
|
Packit |
2cbdf3 |
$alpha = [a-zA-Z] -- alphabetic characters
|
|
Packit |
2cbdf3 |
|
|
Packit |
2cbdf3 |
tokens :-
|
|
Packit |
2cbdf3 |
|
|
Packit |
2cbdf3 |
$white+ ;
|
|
Packit |
2cbdf3 |
"--".* ;
|
|
Packit |
2cbdf3 |
let { \_ -> Let }
|
|
Packit |
2cbdf3 |
in { \_ -> In }
|
|
Packit |
2cbdf3 |
$digit+ { \s -> Int (read s) }
|
|
Packit |
2cbdf3 |
[\=\+\-\*\/\(\)] { \s -> Sym (head s) }
|
|
Packit |
2cbdf3 |
$alpha [$alpha $digit \_ \']* { \s -> Var s }
|
|
Packit |
2cbdf3 |
|
|
Packit |
2cbdf3 |
-- a left-context pattern for testing
|
|
Packit |
2cbdf3 |
^ \# ;
|
|
Packit |
2cbdf3 |
|
|
Packit |
2cbdf3 |
{
|
|
Packit |
2cbdf3 |
-- Each right-hand side has type :: String -> Token
|
|
Packit |
2cbdf3 |
|
|
Packit |
2cbdf3 |
-- The token type:
|
|
Packit |
2cbdf3 |
data Token =
|
|
Packit |
2cbdf3 |
Let |
|
|
Packit |
2cbdf3 |
In |
|
|
Packit |
2cbdf3 |
Sym Char |
|
|
Packit |
2cbdf3 |
Var String |
|
|
Packit |
2cbdf3 |
Int Int |
|
|
Packit |
2cbdf3 |
Err
|
|
Packit |
2cbdf3 |
deriving (Eq,Show)
|
|
Packit |
2cbdf3 |
|
|
Packit |
2cbdf3 |
main = if test1 /= result1 then exitFailure
|
|
Packit |
2cbdf3 |
else exitWith ExitSuccess
|
|
Packit |
2cbdf3 |
|
|
Packit |
2cbdf3 |
test1 = alexScanTokens " let in 012334\n=+*foo bar__'"
|
|
Packit |
2cbdf3 |
result1 = identifierWithLotsOfQuotes''
|
|
Packit |
2cbdf3 |
|
|
Packit |
2cbdf3 |
identifierWithLotsOfQuotes'' :: [Token]
|
|
Packit |
2cbdf3 |
identifierWithLotsOfQuotes'' =
|
|
Packit |
2cbdf3 |
[Let,In,Int 12334,Sym '=',Sym '+',Sym '*',Var "foo",Var "bar__'"]
|
|
Packit |
2cbdf3 |
|
|
Packit |
2cbdf3 |
}
|