1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143
| %{
/* Analyseur lexical pouvant etre utiliser par un analyseur syntaxique
*/
#include "y.tab.h"
#define LOOKUP 0
int state;
int ajouter_mot (int type, char *word);
int rechercher_mot (char *word);
%}
%%
/* Fin de ligne retour a l'etat par defaut */
\n {state = LOOKUP;}
/* Fin de phrase */
\.\n {state = LOOKUP;
return 0;
}
/* A chaque fois que la ligne commence par un nom reserve du langage */
/* On va definir les mots de ce type */
^verb {state = VERBE;}
^adj {state = ADJECTIF;}
^adv {state = ADVERBE;}
^nom {state = NOM;}
^prep {state = PREPOSITION;}
^pron {state = PRONOM;}
^conj {state = CONJONCTION;}
/* un mot normal , on le defini ou on le recherche */
[a-zA-Z]+ {
if (state != LOOKUP)
{
ajouter_mot (state, yytext);
}
else
{
switch (rechercher_mot (yytext))
{
case VERBE:
return VERBE;
case ADJECTIF:
return ADJECTIF;
case ADVERBE:
return ADVERBE;
case NOM:
return NOM;
case PREPOSITION:
return PREPOSITION;
case PRONOM:
return PRONOM;
case CONJONCTION:
return CONJONCTION;
default:
/* ne rien retourner, ignorer le mot */
printf ("%s : inconnu\n", yytext);
}
}
}
. ; /* Ignorer le reste */
%%
/* On defini une liste chainee de mots et types */
struct word
{
char *word_name;
int type;
struct word *p_suivant;
};
/* On declare le premier element de la liste */
struct word *p_word_list = NULL;
extern void *malloc ();
/* -----------------------------------------------------------------------
ajouter_mot ()
-----------------------------------------------------------------------
Role : ajoute un mot dans la liste (seulement si il n'y est pas deja)
-----------------------------------------------------------------------
*/
int ajouter_mot (int type, char *word)
{
struct word *p_word = NULL;
/* On verifie d'abord que le mot ne se trouve pas deja dans la liste */
if (rechercher_mot (word) != LOOKUP)
{
printf ("!!! WARNING %s existe deja \n", word);
return 0;
}
/* On alloue un espace memoire */
p_word = malloc (sizeof *p_word);
if (p_word != NULL)
{
p_word->p_suivant = p_word_list;
p_word->type = type;
/* On alloue l'espace memoire pour la chaine de caractere */
p_word->word_name = malloc ((strlen (word) + 1) * sizeof (char));
if (p_word->word_name != NULL)
{
strcpy (p_word->word_name, word);
}
p_word_list = p_word;
}
return 1;
}
/* ------------------------------------------------------------------------
rechercher_mot ()
------------------------------------------------------------------------
Role : Retourne le type du mot dans une liste chainne (LOOKUP si le mot
n'existe pas)
------------------------------------------------------------------------
*/
int rechercher_mot (char *word)
{
struct word *p_tmp = p_word_list;
while (p_tmp != NULL)
{
if (strcmp (p_tmp->word_name, word) == 0)
{
return p_tmp->type;
}
p_tmp = p_tmp->p_suivant;
}
return LOOKUP;
} |
Partager