%{
/* 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