Blame tests/tokens_scan_user.x
|
Packit |
2cbdf3 |
{
|
|
Packit |
2cbdf3 |
module Main (main) where
|
|
Packit |
2cbdf3 |
import System.Exit
|
|
Packit |
2cbdf3 |
}
|
|
Packit |
2cbdf3 |
|
|
Packit |
2cbdf3 |
%wrapper "basic" -- Defines: AlexInput, alexGetByte, alexPrevChar
|
|
Packit |
2cbdf3 |
|
|
Packit |
2cbdf3 |
$digit = 0-9
|
|
Packit |
2cbdf3 |
$alpha = [a-zA-Z]
|
|
Packit |
2cbdf3 |
$ws = [\ \t\n]
|
|
Packit |
2cbdf3 |
|
|
Packit |
2cbdf3 |
tokens :-
|
|
Packit |
2cbdf3 |
|
|
Packit |
2cbdf3 |
5 / {\ u _ibt _l _iat -> u == FiveIsMagic} { \s -> TFive (head s) }
|
|
Packit |
2cbdf3 |
$digit { \s -> TDigit (head s) }
|
|
Packit |
2cbdf3 |
$alpha { \s -> TAlpha (head s) }
|
|
Packit |
2cbdf3 |
$ws { \s -> TWSpace (head s) }
|
|
Packit |
2cbdf3 |
|
|
Packit |
2cbdf3 |
{
|
|
Packit |
2cbdf3 |
|
|
Packit |
2cbdf3 |
data Token = TDigit Char
|
|
Packit |
2cbdf3 |
| TAlpha Char
|
|
Packit |
2cbdf3 |
| TWSpace Char
|
|
Packit |
2cbdf3 |
| TFive Char -- Predicated only
|
|
Packit |
2cbdf3 |
| TLexError
|
|
Packit |
2cbdf3 |
deriving (Eq,Show)
|
|
Packit |
2cbdf3 |
|
|
Packit |
2cbdf3 |
data UserLexerMode = NormalMode
|
|
Packit |
2cbdf3 |
| FiveIsMagic
|
|
Packit |
2cbdf3 |
deriving Eq
|
|
Packit |
2cbdf3 |
|
|
Packit |
2cbdf3 |
main | test1 /= result1 = exitFailure
|
|
Packit |
2cbdf3 |
| test2 /= result2 = exitFailure
|
|
Packit |
2cbdf3 |
-- all succeeded
|
|
Packit |
2cbdf3 |
| otherwise = exitWith ExitSuccess
|
|
Packit |
2cbdf3 |
|
|
Packit |
2cbdf3 |
run_lexer :: UserLexerMode -> String -> [Token]
|
|
Packit |
2cbdf3 |
run_lexer m s = go ('\n', [], s)
|
|
Packit |
2cbdf3 |
where go i@(_,_,s') = case alexScanUser m i 0 of
|
|
Packit |
2cbdf3 |
AlexEOF -> []
|
|
Packit |
2cbdf3 |
AlexError _i -> [TLexError]
|
|
Packit |
2cbdf3 |
AlexSkip i' _len -> go i'
|
|
Packit |
2cbdf3 |
AlexToken i' len t -> t (take len s') : go i'
|
|
Packit |
2cbdf3 |
|
|
Packit |
2cbdf3 |
test1 = run_lexer FiveIsMagic "5 x"
|
|
Packit |
2cbdf3 |
result1 = [TFive '5',TWSpace ' ',TAlpha 'x']
|
|
Packit |
2cbdf3 |
|
|
Packit |
2cbdf3 |
test2 = run_lexer NormalMode "5 x"
|
|
Packit |
2cbdf3 |
result2 = [TDigit '5',TWSpace ' ',TAlpha 'x']
|
|
Packit |
2cbdf3 |
}
|