18/05/05se info2 - s. l'haire unige1 lecture cha î ne caract è res un document html est...
TRANSCRIPT
18/05/05 SE Info2 - S. L'haire UNIGE 1
Lecture chaîne caractères Un document HTML est composé de balises Une balise est composée de caractères
entre <> (ex: <HTML> A chaque balise correspond une balise
fermante (ex: </HTML> Lire et valider un document HTML bien
formé Si même nombre de balises ouvrantes et
fermantes même niveau
18/05/05 SE Info2 - S. L'haire UNIGE 2
Un document à valider
<HTML><BODY>
<H4>Je suis un document</H4></BODY>
</HTML>
18/05/05 SE Info2 - S. L'haire UNIGE 3
Technique des automates Automates à états finis: un algorithme
simple de traitement de chaines Processus de traitement avec
Un vocabulaire de symboles finis (p.ex. des caractères ou groupes de caractères)
Un ensemble d'états (e0, e1… en) Un ensemble de transitions d'un état à un autre
étant donné la lecture d'un symbole transition(symbole, état) = nouvel état A chaque transition, on peut associer des actions
Un état initial (par convention e0) Un ou plusieurs états finaux
18/05/05 SE Info2 - S. L'haire UNIGE 4
Automate simplifié pour le HTML Vocabulaire:
< > / espace autres (any car)
Etats e0, e1, e2, e3, e4
Etat initial e0 Etat final e4
<HTML><BODY>
<H4>Je suis un document</H4></BODY>
</HTML>
18/05/05 SE Info2 - S. L'haire UNIGE 5
Transitions pour le HTML
e0e4
<HTML><BODY>
<H4>Je suis un document</H4></BODY>
</HTML>
e1
e2
<
any carespace
e3
/
>any car
any car
any car
any car+ espace
<
18/05/05 SE Info2 - S. L'haire UNIGE 6
Actions But: placer la balise lue dans une chaîne
et changer de niveaux Actions liées à l'état courant et état
précédent Si e3 on ajoute un caractère à la balise
Si on était en e1 on ajoute un niveau Si on était en e2 on enlève un niveau
Si e4 on ferme chaîne balise, on met indice à 0 et on écrit
Dans tous les autres cas on ne fait rien
18/05/05 SE Info2 - S. L'haire UNIGE 7
Objet automateTransitionsTab = POINTER TO ARRAY OF ARRAY OF INTEGER;
Automate* = POINTER TO ABSTRACT RECORDtabTrans : TransitionsTab;etatPrecedent, etatCourant, nbEtats,nbSymboles, numSymbole : INTEGER;finalStates: SET;
END; Pour plus de comodités, les différents symboles reçoivent un
numéro (< = 1; / = 2; > = 3; espace = 4; autres cars = 0) Un nombre élevé (1000) fait office d'état d'échec
18/05/05 SE Info2 - S. L'haire UNIGE 8
Objet (suite) Des méthodes permettent d'accéder aux
propriétés privées(a: Automate) EtatFinal (): BOOLEAN, NEW;(a: Automate) GetCurrentState (): INTEGER, NEW;(a: Automate) GetEtatCourant (): INTEGER, NEW;(a: Automate) GetNbEtats (): INTEGER, NEW;(a: Automate) GetNbSymboles (): INTEGER, NEW;(a: Automate) GetNumSymbole (): INTEGER, NEW;(a: Automate) GetPrevState (): INTEGER, NEW;(a: Automate) SetNumSymbole (num: INTEGER), NEW;(a: Automate) SetTrans (state, sym, newstate: INTEGER),
NEW
18/05/05 SE Info2 - S. L'haire UNIGE 9
Initialisation Au niveau objet génériquePROCEDURE (a: Automate)Initialiser*(nbEtats, nbSymboles : INTEGER;
finis : SET), NEW;VAR i, j : INTEGER;BEGIN
ASSERT(finis # {}); ASSERT(nbEtats > 1); ASSERT(nbSymboles > 1);a.finalStates := finis; a.nbEtats := nbEtats; a.nbSymboles := nbSymboles;a.etatCourant := 0; a.etatPrecedent := 0;NEW(a.tabTrans, nbEtats, nbSymboles);FOR i := 0 TO nbEtats -1 DO
FOR j := 0 TO nbSymboles -1 DOa.tabTrans[i,j] := errorTrans;
END;END;
END Initialiser;
18/05/05 SE Info2 - S. L'haire UNIGE 10
Effectuer une transition Niveau génériquePROCEDURE (a: Automate) EffectuerTransition*(symbole :
CHAR): BOOLEAN, NEW;VAR numSymbole : INTEGER;
BEGINa.SetNumSymbole(a.LireSymbole(symbole));a.etatPrecedent := a.etatCourant;a.etatCourant :=
a.tabTrans[a.etatCourant, a.numSymbole];IF (a.etatCourant # errorTrans) THEN RETURN TRUEELSE RETURN FALSE END;
END EffectuerTransition;
18/05/05 SE Info2 - S. L'haire UNIGE 11
Au niveau spécifique
AutomateHTML* = POINTER TO RECORD (LhaireInfo2Automates.Automate)
niveau : INTEGER;indBalise : INTEGER;
balise* : ARRAY 100 OF CHAR;END;
18/05/05 SE Info2 - S. L'haire UNIGE 12
Lecture d'un symbole Niveau spécifiquePROCEDURE (a: AutomateHTML)LireSymbole*(s:
CHAR):INTEGER;BEGIN
CASE s OF '<' : RETURN 1;| '/' : RETURN 2;| '>' : RETURN 3;| ' ' : RETURN 4;ELSERETURN 0END;
END LireSymbole;
18/05/05 SE Info2 - S. L'haire UNIGE 13
Initialiser les transitions Au niveau spécifique Le tableau des transitions est initialisé à
l'état "erreur" à la construction de l'objet (niveau générique)
Il n'y a plus qu'à initialiser les états corrects au niveau spécifique
PROCEDURE (a: AutomateHTML)InitialiserTrans*;BEGIN
a.SetTrans(0, 0, 0);a.SetTrans(0, 1,1);a.SetTrans(0,4,0); …
18/05/05 SE Info2 - S. L'haire UNIGE 14
Effectuer une action Niveau spécifiquePROCEDURE (a: AutomateHTML) EffectuerAction* (symbole:
CHAR): BOOLEAN;BEGIN
CASE a.GetCurrentState() OF 0 : RETURN TRUE;| 1 : RETURN TRUE;| 2 :RETURN TRUE;| 3 : a.balise[a.indBalise] := symbole; INC(a.indBalise);IF a.GetPrevState() = 1 THENINC(a.niveau);ELSIF a.GetPrevState() = 2 THEN DEC(a.niveau); END;RETURN TRUE;| 4: a.balise[a.indBalise] := 0X; a.indBalise := 0; …
18/05/05 SE Info2 - S. L'haire UNIGE 15
Lecture de chaînePROCEDURE (a: AutomateHTML) LireChaine(IN chaine : ARRAY
OF CHAR), NEW;VAR i : INTEGER;BEGIN
i:= 0;WHILE (chaine[i] # 0X) & (a.EffectuerTransition(chaine[i])) DO
IF a.EffectuerAction(chaine[i]) THENécrire log… INC(i);
ENDEND;IF (a.EtatFinal()) & (a.niveau =0) THEN
StdLog.String("Succès lecture"); StdLog.LnELSE HALT(33) END;
END LireChaine;
18/05/05 SE Info2 - S. L'haire UNIGE 16
Pour le TP 10 Plus simple de construire un élément du
graphe par un automate Le vocabulaire des automates est
espace délimiteurs: ! " ( ) , .- : ; [ ] < > apostrophe caractères alphanumériques sinon erreur
Vous pouvez réutiliser le code de l'exemple