-- -- Copyright (c) 2005 Don Stewart - http://www.cse.unsw.edu.au/~dons -- GPL version 2 or later (see http://www.gnu.org/copyleft/gpl.html) -- -- Lexer for ICFP 05 msgs { module Lexer ( scan, showPos, Token(..), Tkn(..) ) where } %wrapper "posn" $digit = [0-9] $large = [A-Z] $small = [a-z \_] $other = [\-\#\(\)] $alpha = [$small $large $digit $other] -- names @decimal = $digit+ @name = $alpha+ messages :- " " ; ":" { \p s -> T p Colon } "\" { \p s -> T p BackSlash } "/" { \p s -> T p FwdSlash } \r?\n { \p s -> T p EOL } @name { \p s -> T p (NameT s) } { data Token = T AlexPosn Tkn deriving (Show) data Tkn = NameT String | Colon | BackSlash | FwdSlash | EOL deriving (Show) showPos :: AlexPosn -> String showPos (AlexPn _ l c) = "line " ++ show l ++ ":" ++ show c scan :: String -> [Token] scan str = go (alexStartPos,'\n',str) where go inp@(pos,_,str) = case alexScan inp 0 of AlexEOF -> [] AlexError (p,_,s) -> error $ "Lexer: " ++ showPos p ++ " `" ++ [head s] ++ "'" AlexSkip inp' len -> go inp' AlexToken inp' len act -> act pos (take len str) : go inp' }