packages feed

data-structure-inferrer-1.0: Il/Lexer.x

{
{-# 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
}