All pastes #30728 Raw Edit

mjw

public text v1 · immutable
#30728 ·published 2005-11-23 21:56 UTC
rendered paste body
{
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

}