%{ uses lexlib; Const Max=100; Type Classes = ( recherche, (*classe ''à déterminer'' *) article, nom, pronom, verbe, adjectif, conjonction, (* et, mais, ou, car, donc, ...*) preposition (* a (à), en, de, ...*) ); MotCl = record mot : string ; (* le mot *) classe : Classes; (* sa classe *) end; Var mode : Classes ; table : array[1..Max] of MotCl ; ltable : integer ; (* longueur effective de la table <= Max *) (* déclarations Turbo Pascal utilisées dans yylex *) procedure ranger( var c : Classes ; var m : string ) ; (* tente de ranger le le mot m de classe c dans la table. Ce mot peut être : - nouveau, - déjà dans la table mais dans une autre classe, - déjà dans la table et dans la même classe. Dans ce dernier cas, la table n'est pas modifiée, sinon, il faut effectivement y ranger le couple c, m. *) function est_dans_table(m:string;c:classes):boolean; var trouve:boolean; i:integer; begin trouve:=false; i:=1; while (i<=ltable) and (not trouve) do begin if ((table[i].mot=m) and (table[i].classe=c)) then trouve:=true else begin trouve:=false; i:=i+1; end; end; est_dans_table:=trouve; end; begin if ltable=0 then begin ltable:=1; table[1].classe:=c; table[1].mot:=m; end else if not(est_dans_table(m,c)) then begin ltable:=ltable+1; table[ltable].classe:=c; table[ltable].mot:=m; end; end; procedure rechercher( m : string ) ; (* recherche le mot m dans la table, l'affiche ainsi que les classes auxquelles il appartient ou la mention inconnu lorsque m ne figure pas dans la table. *) var i:integer; classe0:string; ok,first:boolean; begin first:=true; ok:=false; classe0:=''; i:=1; while (i<=ltable) do begin if table[i].mot=m then begin case table[i].classe of article: classe0:='article'; nom: classe0:='nom'; pronom: classe0:='pronom'; verbe: classe0:='verbe'; adjectif: classe0:='adjectif'; conjonction: classe0:='conjonction'; preposition: classe0:='preposition'; end; if first then begin write(table[i].mot,' : ',classe0); first:=false; end else begin write(' ',classe0); end; ok:=true; i:=i+1; end else i:=i+1; end; writeln; if not ok then writeln(m,' : inconnu'); end; %} %% Q begin writeln('Bye bye...C''est FINI !!');halt end; ^article mode := article ; ^nom mode:= nom; ^pronom mode:=pronom; ^verbe mode:=verbe; ^adjectif mode:=adjectif; ^conjonction mode:=conjonction; ^preposition mode:=preposition; [a-z]+ if mode = recherche then rechercher( yytext ) else ranger( mode , yytext ) ; \n mode := recherche ; %% begin writeln(' TP Lex numero 3 : sans pointeurs '); writeln; writeln('**********************************************'); writeln('| Entrez d''abord le type du mot que |'); writeln('| vous voulez stocker dans le tableau |'); writeln('| (que des minuscules) : verbe, nom, |'); writeln('| adjectif, pronom, conjonction, prepostion, |'); writeln('| article. Ensuite tapez la phrase a analyser|'); writeln('| Q : pour quitter. |'); writeln('**********************************************'); writeln; ltable:=0; mode:= recherche ; yylex end.