%{ /* La structure permet de mémoriser pour chaque noeud de l'arbre * texte : la partie du source correspondante, * hauteur : la longueur de la branche la plus profonde. */ struct info { char *texte; int hauteur; }; #define YYSTYPE struct info /* Les options sont positionnées par les arguments de la ligne de commande * optionHauteur == 1 si la hauteur doit être affichée * optionMarque == 1 si le source doit être normalisé * optionExtraire == i pour extraire la première section Hi * extraction == 1 pendant l'extraction */ int optionHauteur = 0; int optionMarque = 0; int optionExtraire = 0; int extraction = 1; /* Pour éviter des "WARNING" à la compilation */ void yyerror(char *s); int yyparse(void); %} %token HTML_O HTML_F HEAD_O HEAD_F TITLE_O TITLE_F BODY_O BODY_F H1_O H1_F H2_O H2_F H3_O H3_F H4_O H4_F H5_O H5_F H6_O H6_F EM_O EM_F B_O B_F P_O P_F OL_O OL_F LI_O LI_F CHAINE %% Document : HTML_O Entete Corps HTML_F { $$=semantique_TNNT($1,$2,$3,$4); affiche_resultat($$); } Entete : HEAD_O Titre HEAD_F {$$=semantique_TNT($1,$2,$3);} Titre : TITLE_O CHAINE TITLE_F {$$=semantique_TTT($1,$2,$3);} Corps : BODY_O Liste_Sections BODY_F { if (optionExtraire>0 && extraction==1) extraction++; $$=semantique_TNT($1,$2,$3); } Liste_Sections : Entete_De_Section Liste_Sections {$$=semantique_NN($1,$2);} | Texte Liste_Sections {$$=semantique_NN($1,$2);} | {$$=semantique_EPSILON($$);} Entete_De_Section : H1_O CHAINE H1_F {$$=semantique_Hi(1,$1,$2,$3);} | H2_O CHAINE H2_F {$$=semantique_Hi(2,$1,$2,$3);} | H3_O CHAINE H3_F {$$=semantique_Hi(3,$1,$2,$3);} | H4_O CHAINE H4_F {$$=semantique_Hi(4,$1,$2,$3);} | H5_O CHAINE H5_F {$$=semantique_Hi(5,$1,$2,$3);} | H6_O CHAINE H6_F {$$=semantique_Hi(6,$1,$2,$3);} Texte : Element Texte {$$=semantique_NN($1,$2);} | {$$=semantique_EPSILON($$);} Element : CHAINE {$$=semantique_T($1);} | EM_O Texte EM_F {$$=semantique_TNT($1,$2,$3);} | B_O Texte B_F {$$=semantique_TNT($1,$2,$3);} | P_O Texte P_F {$$=semantique_TNT($1,$2,$3);} | P_O Texte {$$=semantique_TN($1,$2,"

");} | OL_O Liste_Ord OL_F {$$=semantique_TNT($1,$2,$3);} Liste_Ord : Liste_Items Liste_Ord {$$=semantique_NN($1,$2);} | {$$=semantique_EPSILON($$);} Liste_Items : LI_O Texte LI_F {$$=semantique_TNT($1,$2,$3);} | LI_O Texte {$$=semantique_TN($1,$2,"");} %% #include #include #include #include "lex.yy.c" int max(int a, int b) { return (a>b) ? a : b; } struct info semantique_TNNT(struct info s1,struct info s2,struct info s3,struct info s4) { struct info ss; if (extraction==1){ int len1 = strlen(s1.texte); int len2 = strlen(s2.texte); int len3 = strlen(s3.texte); ss.texte = malloc(len1+len2+len3+strlen(s4.texte)+1); strcpy(ss.texte,s1.texte); strcpy(ss.texte+len1,s2.texte); strcpy(ss.texte+len1+len2,s3.texte); strcpy(ss.texte+len1+len2+len3,s4.texte); } else { int len2 = strlen(s2.texte); ss.texte = malloc(len2+strlen(s3.texte)+1); strcpy(ss.texte,s2.texte); strcpy(ss.texte+len2,s3.texte); } ss.hauteur = max(s2.hauteur,s3.hauteur)+1; return ss; } struct info semantique_TNT(struct info s1,struct info s2,struct info s3) { struct info ss; if (extraction==1){ int len1 = strlen(s1.texte); int len2 = strlen(s2.texte); ss.texte = malloc(len1+len2+strlen(s3.texte)+1); strcpy(ss.texte,s1.texte); strcpy(ss.texte+len1,s2.texte); strcpy(ss.texte+len1+len2,s3.texte); } else ss.texte = strdup(s2.texte); ss.hauteur = s2.hauteur+1; return ss; } struct info semantique_TN(struct info s1,struct info s2,char *s3) { struct info ss; if (extraction==1){ if (optionMarque){ int len1 = strlen(s1.texte); int len2 = strlen(s2.texte); ss.texte = malloc(len1+len2+strlen(s3)+1); strcpy(ss.texte,s1.texte); strcpy(ss.texte+len1,s2.texte); strcpy(ss.texte+len1+len2,s3); } else { int len1 = strlen(s1.texte); ss.texte = malloc(len1+strlen(s2.texte)+1); strcpy(ss.texte,s1.texte); strcpy(ss.texte+len1,s2.texte); } } else ss.texte = ""; ss.hauteur = s2.hauteur+1; return ss; } struct info semantique_TTT(struct info s1,struct info s2,struct info s3) { struct info ss; if (extraction==1){ int len1 = strlen(s1.texte); int len2 = strlen(s2.texte); ss.texte = malloc(len1+len2+strlen(s3.texte)+1); strcpy(ss.texte,s1.texte); strcpy(ss.texte+len1,s2.texte); strcpy(ss.texte+len1+len2,s3.texte); } else ss.texte = ""; ss.hauteur = 1; return ss; } struct info semantique_NN(struct info s1, struct info s2) { struct info ss; int len1 = strlen(s1.texte); ss.texte = malloc(len1+strlen(s2.texte)+1); strcpy(ss.texte,s1.texte); strcpy(ss.texte+len1,s2.texte); ss.hauteur = max(s1.hauteur,s2.hauteur)+1; return ss; } struct info semantique_T(struct info s1) { struct info ss; if (extraction==1) ss.texte = strdup(s1.texte); else ss.texte = ""; ss.hauteur = 1; return ss; } struct info semantique_EPSILON() { struct info ss; ss.texte = ""; ss.hauteur = 1; return ss; } struct info semantique_Hi(int i,struct info s1,struct info s2,struct info s3) { if (optionExtraire==i || (optionExtraire>i && extraction==1)) extraction++; return semantique_TTT(s1,s2,s3); } void affiche_resultat(struct info ss) { if (optionHauteur) printf("Hauteur %d\n\n",ss.hauteur); if (optionExtraire > 0) if (optionMarque) printf("Premier niveau H%d normalise\n\n%s",optionExtraire,ss.texte); else printf("Premier niveau H%d\n\n%s",optionExtraire,ss.texte); else if (optionMarque) printf("Texte normalise\n\n%s",ss.texte); else printf("Texte\n\n%s",ss.texte); } int main(int argc, char **argv) { int i; for(i=0; i