%wrapper "posn"
tokens :-
$white+ ;
"program" { tok (\p s -> Program p) }
"var" { tok (\p s -> Var p) }
"print" { tok (\p s -> Print p) }
"if" { tok (\p s -> If p) }
"then" { tok (\p s -> Then p) }
"else" { tok (\p s -> Else p) }
"do" { tok (\p s -> Do p) }
"while" { tok (\p s -> While p) }
"int" | "bool" { tok (\p s -> Type p s) }
"True" | "False" { tok (\p s -> BoolVal p s) }
[a-zA-Z] ( [a-zA-Z0-9] )* { tok (\p s -> Variable p s) }
[ \+ \- ]? ( 0 | [1-9] [0-9]* ) { tok (\p s -> NumVal p s) }
[ \+ \- \* \/ ] { tok (\p s -> ArithOp p s) }
\= | \!\= | \< | \<\= | \> | \>\= { tok (\p s -> RelOp p s) }
[ \{ ] { tok (\p s -> CurlyBeg p) }
[ \} ] { tok (\p s -> CurlyEnd p) }
[ \( ] { tok (\p s -> ParBeg p) }
[ \) ] { tok (\p s -> ParEnd p) }
":=" { tok (\p s -> Becomes p) }
[ \; ] { tok (\p s -> Sem p) }
[ \: ] { tok (\p s -> Col p) }
[ \, ] { tok (\p s -> Comma p) }
{
-- Some action helpers:
tok f (AlexPn posInStr line column) s = f line s
data Token =
Program Int |
Var Int |
Print Int |
If Int |
Then Int |
Else Int |
Do Int |
While Int |
Type Int String |
BoolVal Int String |
Variable Int String |
NumVal Int String |
ArithOp Int String |
RelOp Int String |
CurlyBeg Int |
CurlyEnd Int |
ParBeg Int |
ParEnd Int |
Becomes Int |
Sem Int |
Col Int |
Comma Int
deriving ( Eq , Show )
scan :: String -> [Token]
scan str = alexScanTokens str
testprg :: String
testprg =
"program Fakultaet {" ++
" var x,y:int; bool=bool ;" ++
" bool:=False;" ++
" x:=3; y:=1;" ++
" while ( x > 0) do " ++
" y := y*x;" ++
" bool:=True;" ++
" x:=x+1" ++
" ;" ++
" if bool = False then y = 0 ;" ++
" print y" ++
"}"
}