{ module Whiledo (Token(..), AlexPosn(..), alexScanTokens, token_posn) where {- Scanner fuer die Whiledo-Sprache aus Aufgabenblatt 4, Aufgabe 4.4. (C) Malte J. Wetz -} } %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 }