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
}