%{
	(* Programme LEX pour l'analyse lexicale du langage
	GALILEO version MIAS2 1999 *)

	(* La procedure ecrirec (Ècrivant un caractËre) n'est pas implantÈe *)

	var   code : integer ;  	(* pour la procÈdure val *)

	function rechercher ( s : string ; var i : integer ) : boolean ;
	var j : integer ;
	begin 
		if length( s ) > 25 then s := copy( s, 1, 25) ;
		for j := 1 to length( s ) do s[j] := upcase( s[j] ) ;
		i := 1 ;
		while ((i <= longueur) and (table[i].nom <> s)) do i := i + 1 ;
		if i <= longueur then rechercher := true
		else begin
			longueur := longueur + 1 ;
			if longueur <= TMax then begin 
				table[longueur].nom := s ;
				rechercher := false
			end
			else begin
				writeln( 'La table est pleine.' ) ;
				halt(1)
			end
		end
	end ;
%}
		(* Le traitement des mots-clefs peut se faire de facon
		plus economique en utilisant une table qui leur est
		propre : voir par exemple le fichier Paslex.l *)

programme	(p|P)(r|R)(o|O)(g|G)(r|R)(a|A)(m|M)(m|M)(e|E)
retourne	(r|R)(e|E)(t|T)(o|O)(u|U)(r|R)(n|N)(e|E)
fin		(f|F)(i|I)(n|N)
variables	(v|V)(a|A)(r|R)(i|I)(a|A)(b|B)(l|L)(e|E)(s|S)
entier		(e|E)(n|N)(t|T)(i|I)(e|E)(r|R)
tableau		(t|T)(a|A)(b|B)(l|L)(e|E)(a|A)(u|U)
si		(s|S)(i|I)
alors		(a|A)(l|L)(o|O)(r|R)(s|S)
sinon		(s|S)(i|I)(n|N)(o|O)(n|N)
tantque		(t|T)(a|A)(n|N)(t|T)(q|Q)(u|U)(e|E)
faire		(f|F)(a|A)(i|I)(r|R)(e|E)
ecrire		(e|E)(c|C)(r|R)(i|I)(r|R)(e|E)
ecrirec		(e|E)(c|C)(r|R)(i|I)(r|R)(e|E)(c|C)
lire		(l|L)(i|I)(r|R)(e|E)
et		(e|E)(t|T)
ou		(o|O)(u|U)
non		(n|N)(o|O)(n|N)

%%

[ \t\n]		;

{programme}	return( programme ) ;

{retourne}	return( retourne ) ;

{fin} 		return( fin ) ;

{variables}	return( variables ) ;

{entier}	return( entier ) ;

{tableau}	return( tableau ) ;

{si}		return( si ) ;

{alors}		return( alors ) ;

{sinon}		return( sinon ) ;

{tantque}	return( tantque ) ;

{faire}		return( faire ) ;

{ecrire}	return( ecrire ) ;

{ecrirec}	return( ecrirec ) ;

{lire}		return( lire ) ;

{et}		begin yylval.yyinteger := ET ; return( opmult ) end ;

"*"		begin yylval.yyinteger := MUL ; return( opmult ) end ;

{ou}		begin yylval.yyinteger := OU ; return( opadd ) end ;

"+"		begin yylval.yyinteger := ADD ; return( opadd ) end ;

{non}		return( non ) ;

"="		begin yylval.yyinteger := EQU ; return( oprel ) end ;

">="		begin yylval.yyinteger := GEQ ; return( oprel ) end ;

"<="		begin yylval.yyinteger := LEQ ; return( oprel ) end ;

"<"		begin yylval.yyinteger := LES ; return( oprel ) end ;

">"		begin yylval.yyinteger := GRT ; return( oprel ) end ;

"<>"		begin yylval.yyinteger := NEQ ; return( oprel ) end ;

":="		return( affect ) ;

[-+]?[0-9]+	begin
			val(yytext, yylval.yyinteger, code ) ;
			if code = 0 then return( nb )
			else begin
				write('Entier non convenable, ligne : ') ;
				writeln(yylineno) ;
				halt(1)
			end
		end ;

[A-Za-z][A-Za-z0-9]*
		if rechercher( yytext, yylval.yyinteger ) = recherche then return( id )
		else begin
			if recherche then write('Indentificateur inconnu : ')
			else	write('Identificateur dÈjý dÈclarÈ : ') ;
			writeln(yytext, ' (ligne : ', yylineno, ')' ) ;
			halt(1)
		end ;

"-"|"("|")"|"["|"]"|":"|";"		
		returnc( yytext[1] ) ;

.		begin
			write('Symbole inconnu : ' , yytext[1] ) ;
			writeln( ' (ligne : ', yylineno, ')' ) ;
			halt(1)
		end ;

%%
