%{


		{* DESBIENDRAS Anne et BULTELLE Cedric , groupe 3 *}

	var code : integer ;

	function rechercher ( s : string ; var place : integer ) : boolean ;
        {*fonction qui recherche la chaine de caractere s dans la table*}
	   var i : integer ;
               res : boolean ;
	begin
		i := 0 ;
                res := false ;
		while i <= longueur do
			begin
			if s = table [i].nom then begin
				res := true;
				place := i;
			end;
			i := i + 1 ;
		end;
                rechercher := res ;
	end;


	function ranger ( s : string ) : boolean ;
        {*fonction qui range la chaine de caractere s dans la table*}
	var i : integer ;
	begin
		if rechercher ( s , i ) then ranger := false
		else
			begin
			longueur := longueur + 1;
			table [longueur].nom := s ;
			ranger := true ;
		end;
	end;



%}

%%

[ \t\n]			;
programme		return ( programme );
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 );
lire                    return ( lire );
retourne                return ( retourne );
fin			return ( fin );

ou			begin yylval.yyinteger := OU ; return ( opadd ); end;
et			begin yylval.yyinteger := ET  ;return ( opmult  );end;
non                     begin yylval.yyinteger := LNEG  ;return ( non );end;
"+"			begin yylval.yyinteger := ADD ; return ( opadd ); end;
"*"			begin yylval.yyinteger := MUL  ;return ( opmult  );end;

"="			begin yylval.yyinteger := EQU  ;return ( oprel  );end;
"<="			begin yylval.yyinteger := LEQ  ;return ( oprel  );end;
">="			begin yylval.yyinteger := GEQ  ;return ( oprel  );end;
"<"			begin yylval.yyinteger := LES  ;return ( oprel  );end;
">"			begin yylval.yyinteger := GRT  ;return ( oprel  );end;
"<>"			begin yylval.yyinteger := NEQ  ;return ( oprel  );end;



[+-]?[0-9]+		begin
				val ( yytext , yylval.yyinteger , code );
				if code = 0 then return ( nb )
				else begin
                                        writeln(yytext,' : erreur ,ceci n est pas un entier  ( ligne n ',yylineno, ' )');halt
				end;
			end;

[A-Za-z][A-Za-z0-9]*    begin
				if recherche then begin
					if rechercher ( yytext , yylval.yyinteger ) then return ( id )
					else begin
                                                writeln( yytext ,' :  Identificateur inconnu (ligne : ' , yylineno ,' )');halt
					end;
				end
				else begin
                                        if ranger ( yytext ) then begin
					   yylval.yyinteger := longueur ;
                                           return ( id );
                                        end
					else begin
                                             writeln(yytext,' : Identificateur duplique ( ligne n ', yylineno,' )');halt
					end;
				end;
			end;

":="                    return( affect );

"-"|"("|")"|"["|"]"|":"|";"	 returnc ( yytext[1] );

.                       begin   writeln(' Fin de fichier inattendue ( ligne n ',yylineno,' )');halt end;

%%
