{
module Whiledo (Token(..), AlexPosn(..), alexScanTokens, token_posn) where
{-
Scanner fuer die Whiledo-Sprache aus Aufgabenblatt 4,
Aufgabe 4.4.
(C) Malte J. Wetz <mail@malte-wetz.de>
-}
}
%wrapper "posn"
$digit = 0-9 -- digits
$alpha = [a-zA-Z] -- alphabetic characters
tokens :-
$white+ ;
program { tok (\p s -> Program p) }
var { tok (\p s -> Var p) }
if { tok (\p s -> If p) }
then { tok (\p s -> Then p) }
else { tok (\p s -> Else p) }
while { tok (\p s -> While p) }
do { tok (\p s -> Do p) }
int|bool { tok (\p s -> Type p s) }
true|false { tok (\p s -> BoolVal p s) }
:= { tok (\p s -> Becomes p) }
: { tok (\p s -> Col p) }
\; { tok (\p s -> Sem p) }
\, { tok (\p s -> Comma p) }
\{ { tok (\p s -> CurlyBraceOpen p) }
\} { tok (\p s -> CurlyBraceClose p) }
\( { tok (\p s -> ParenOpen p) }
\) { tok (\p s -> ParenClose p) }
$alpha [$alpha $digit]* { tok (\p s -> Variable p s) }
(\+|\-)?(0|([1-9] $digit*)) { tok (\p s -> NumVal p s) }
\+|\-|\*|\/ { tok (\p s -> ArithOp p s) }
\<=|\>=|\<|\>|!=|= { tok (\p s -> RelOp p s) }
{
main = do s <- getContents
print (alexScanTokens s)
-- Some action helpers:
tok f p s = f p s
-- The token type:
data Token =
Program AlexPosn |
Var AlexPosn |
If AlexPosn |
Then AlexPosn |
Else AlexPosn |
While AlexPosn |
Do AlexPosn |
Type AlexPosn String |
BoolVal AlexPosn String |
Becomes AlexPosn |
Col AlexPosn |
Comma AlexPosn |
Sem AlexPosn |
CurlyBraceOpen AlexPosn |
CurlyBraceClose AlexPosn |
ParenOpen AlexPosn |
ParenClose AlexPosn |
Variable AlexPosn String |
NumVal AlexPosn String |
ArithOp AlexPosn String |
RelOp AlexPosn String
deriving (Eq,Show)
token_posn (Program p) = p
token_posn (Var p) = p
token_posn (If p) = p
token_posn (Then p) = p
token_posn (Else p) = p
token_posn (While p) = p
token_posn (Do p) = p
token_posn (Type p s) = p
token_posn (BoolVal p s) = p
token_posn (Becomes p) = p
token_posn (Col p) = p
token_posn (Comma p) = p
token_posn (Sem p) = p
token_posn (CurlyBraceOpen p) = p
token_posn (CurlyBraceClose p) = p
token_posn (ParenOpen p) = p
token_posn (ParenClose p) = p
token_posn (Variable p s) = p
token_posn (NumVal p s) = p
token_posn (ArithOp p s) = p
token_posn (RelOp p s) = p
}