Blame tests/tokens_posn_bytestring.x
|
Packit |
2cbdf3 |
{
|
|
Packit |
2cbdf3 |
{-# LANGUAGE OverloadedStrings #-}
|
|
Packit |
2cbdf3 |
module Main (main) where
|
|
Packit |
2cbdf3 |
import System.Exit
|
|
Packit |
2cbdf3 |
import Data.ByteString.Lazy.Char8 (unpack)
|
|
Packit |
2cbdf3 |
}
|
|
Packit |
2cbdf3 |
|
|
Packit |
2cbdf3 |
%wrapper "posn-bytestring"
|
|
Packit |
2cbdf3 |
%encoding "UTF8"
|
|
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 { tok (\p _ -> Let p) }
|
|
Packit |
2cbdf3 |
in { tok (\p _ -> In p) }
|
|
Packit |
2cbdf3 |
$digit+ { tok (\p s -> Int p (read (unpack s))) }
|
|
Packit |
2cbdf3 |
[\=\+\-\*\/\(\)] { tok (\p s -> Sym p (head (unpack s))) }
|
|
Packit |
2cbdf3 |
$alpha [$alpha $digit \_ \']* { tok (\p s -> Var p (unpack s)) }
|
|
Packit |
2cbdf3 |
|
|
Packit |
2cbdf3 |
{
|
|
Packit |
2cbdf3 |
-- Each right-hand side has type :: AlexPosn -> String -> Token
|
|
Packit |
2cbdf3 |
|
|
Packit |
2cbdf3 |
-- Some action helpers:
|
|
Packit |
2cbdf3 |
tok f p s = f p s
|
|
Packit |
2cbdf3 |
|
|
Packit |
2cbdf3 |
-- The token type:
|
|
Packit |
2cbdf3 |
data Token =
|
|
Packit |
2cbdf3 |
Let AlexPosn |
|
|
Packit |
2cbdf3 |
In AlexPosn |
|
|
Packit |
2cbdf3 |
Sym AlexPosn Char |
|
|
Packit |
2cbdf3 |
Var AlexPosn String |
|
|
Packit |
2cbdf3 |
Int AlexPosn Int |
|
|
Packit |
2cbdf3 |
Err AlexPosn
|
|
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 = [Let (AlexPn 2 1 3),In (AlexPn 6 1 7),Int (AlexPn 9 1 10) 12334,Sym (AlexPn 16 2 1) '=',Sym (AlexPn 17 2 2) '+',Sym (AlexPn 18 2 3) '*',Var (AlexPn 19 2 4) "foo",Var (AlexPn 23 2 8) "bar__'"]
|
|
Packit |
2cbdf3 |
|
|
Packit |
2cbdf3 |
|
|
Packit |
2cbdf3 |
}
|