packages feed

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)
}