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
}