ewe-0.1.0.23: src/Language/EWE/Scanner.x
{
module Language.EWE.Scanner(Alex(..),
AlexPosn(..),
alexMonadScan,
alexExec,
runAlex,
alexGetInput,
getPosn
) where
import Language.EWE.Token(Tkns,Tkn(..))
}
%wrapper "monad"
$alpha = [a-zA-Z]
$digit = [0-9]
$nozerodigit = [1-9]
$graphic = $printable
$eol = [\n]
@string = \" (graphic # \")* \"
tokens :-
$white+ ;
\#.* ;
$eol { returnEOL }
\:\= { returnAssgn }
\: { returnColon }
[\*\+\-\/\%] { returnOper }
\( { returnLPar}
\) { returnRPar }
\[ { returnLBrk }
\] { returnRBrk }
\, { returnComma }
(\>|\>\=|\<|\<\=|\=|\<\>) { returnCond }
"M" { returnResWrd }
"PC" { returnResWrd }
"readInt" { returnResWrd }
"writeInt" { returnResWrd }
"readStr" { returnResWrd }
"writeStr" { returnResWrd }
"goto" { returnResWrd }
"if" { returnResWrd }
"then" { returnResWrd }
"halt" { returnResWrd }
"break" { returnResWrd }
"equ" { returnResWrd }
\" [^\"]* \" { returnStr }
(($nozerodigit $digit*)| 0) { returnInt }
-- $alpha [$alpha $digit]*\: { returnLabel }
$alpha [$alpha $digit]* { returnId }
{
returnEOL :: AlexInput -> Int -> Alex Tkn
returnEOL = returnTkn $ TknEOL
returnAssgn :: AlexInput -> Int -> Alex Tkn
returnAssgn = returnTkn $ TknAssgn
returnColon :: AlexInput -> Int -> Alex Tkn
returnColon = returnTkn $ TknColon
returnTkn :: Tkn -> AlexInput -> Int -> Alex Tkn
returnTkn tkn _ _ = return $ tkn
returnLPar :: AlexInput -> Int -> Alex Tkn
returnLPar = returnTkn $ TknLPar
returnRPar :: AlexInput -> Int -> Alex Tkn
returnRPar = returnTkn $ TknRPar
returnLBrk :: AlexInput -> Int -> Alex Tkn
returnLBrk = returnTkn $ TknLBrk
returnRBrk :: AlexInput -> Int -> Alex Tkn
returnRBrk = returnTkn $ TknRBrk
returnComma :: AlexInput -> Int -> Alex Tkn
returnComma = returnTkn $ TknComma
returnOper :: AlexInput -> Int -> Alex Tkn
returnOper = returnFunction (TknOper . head)
returnCond :: AlexInput -> Int -> Alex Tkn
returnCond = returnFunction TknCond
returnStr :: AlexInput -> Int -> Alex Tkn
returnStr = returnFunction (TknStr . read)
returnInt :: AlexInput -> Int -> Alex Tkn
returnInt = returnFunction (TknInt . read)
-- returnLabel :: AlexInput -> Int -> Alex Tkn
-- returnLabel = returnFunction (TknLabel . init)
returnId :: AlexInput -> Int -> Alex Tkn
returnId = returnFunction TknId
returnResWrd :: AlexInput -> Int -> Alex Tkn
returnResWrd = returnFunction TknResWrd
returnFunction :: (String -> Tkn) -> AlexInput -> Int -> Alex Tkn
returnFunction f (_,_,_,s) i = return $ f (take i s)
alexEOF :: Alex Tkn
alexEOF = return $ TknEOF
alexExec :: Alex Tkns
alexExec = do
t <- alexMonadScan
case t of
TknEOF -> return $ [t]
_ -> do ts <- alexExec
return (t:ts)
getPosn :: Alex (Int,Int)
getPosn = do
(AlexPn _ l c,_,_,_) <- alexGetInput
return (l,c)
}