{ {-# OPTIONS_GHC -w #-} module Il.Lexer where import Prelude hiding (lex) } %wrapper "posn" $digit = 0-9 $alpha = [a-zA-Z] tokens :- (\n)+ { \p s -> tokenWithPos p TkNewline } ($white # \n)+ ; $digit+ { \p s -> tokenWithPos p (TkInt (read s)) } and { \p s -> tokenWithPos p TkAnd } if { \p s -> tokenWithPos p TkIf } then { \p s -> tokenWithPos p TkThen } else { \p s -> tokenWithPos p TkElse } false { \p s -> tokenWithPos p TkFalse } return { \p s -> tokenWithPos p TkReturn } true { \p s -> tokenWithPos p TkTrue } for { \p s -> tokenWithPos p TkFor } while { \p s -> tokenWithPos p TkWhile } null { \p s -> tokenWithPos p TkNull } or { \p s -> tokenWithPos p TkOr } ds { \p s -> tokenWithPos p TkDs } dselem { \p s -> tokenWithPos p TkDsElem } int { \p s -> tokenWithPos p TkTInt } bool { \p s -> tokenWithPos p TkTBool } void { \p s -> tokenWithPos p TkTVoid } "++" { \p s -> tokenWithPos p TkInc } "+" { \p s -> tokenWithPos p TkPlus } "--" { \p s -> tokenWithPos p TkDec } "-" { \p s -> tokenWithPos p TkMinus } "*" { \p s -> tokenWithPos p TkMul } "/" { \p s -> tokenWithPos p TkDiv } "!" { \p s -> tokenWithPos p TkNot } "," { \p s -> tokenWithPos p TkComma } ";" { \p s -> tokenWithPos p TkSemicolon } "." { \p s -> tokenWithPos p TkDot } "==" { \p s -> tokenWithPos p TkEquals } ">=" { \p s -> tokenWithPos p TkGEqual } "<=" { \p s -> tokenWithPos p TkLEqual } "=" { \p s -> tokenWithPos p TkAssign } "(" { \p s -> tokenWithPos p TkLParen } "{" { \p s -> tokenWithPos p TkLCParen } "[" { \p s -> tokenWithPos p TkLSParen } "<" { \p s -> tokenWithPos p TkLess } ")" { \p s -> tokenWithPos p TkRParen } "}" { \p s -> tokenWithPos p TkRCParen } "]" { \p s -> tokenWithPos p TkRSParen } ">" { \p s -> tokenWithPos p TkGreater } $alpha (_ | $digit | $alpha)* { \p s -> tokenWithPos p (TkName s) } { data BaseToken = TkAnd | TkAssign | TkColon | TkComma | TkDec | TkDiv | TkDot | TkDs | TkDsElem | TkElse | TkEquals | TkFalse | TkFor | TkGEqual | TkGreater | TkIf | TkInc | TkInt Int | TkLAParen | TkLCParen | TkLSParen | TkLEqual | TkLess | TkLParen | TkMinus | TkMul | TkName String | TkNewline | TkNot | TkNull | TkOr | TkPlus | TkReturn | TkRAParen | TkRCParen | TkRSParen | TkRParen | TkSemicolon | TkThen | TkTrue | TkTInt | TkTBool | TkTVoid | TkWhile deriving (Show, Eq) type Token = ((Int,Int), BaseToken) tokenWithPos :: AlexPosn -> BaseToken -> Token tokenWithPos (AlexPn _ line col) t = ((line,col),t) lex = alexScanTokens }