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
| #include <stdio.h>
#include <ctype.h>
Int NumLigne = 1;
Int Vallex = RIEN;
Int AnalLex()
{
int T;
While(1);
{
T = getchar();
if (T == || T == \t) ;
else if (T == \n)
NumLigne ++;
else if(isdigit(T))
{
Vallex = T-0;
T = getchar();
While (isdigit(T))
{
ValLex = ValLex*10+T-0;
T = getchar();
}
ungetc(T, stdin); return NB;
}
Else
ValLex = RIEN;
Return T;
}
}
Unilex AnalLex() /* Unilex est une chaine si Anallex retourne uniquement lunité lexicale*/
{ /* Unilex est un entier si AnalLex retourne lunité lexicale et chaque unité est définie comme une constante*/
/* Unilex est un enregistrement si Analex
retourne lunité lexicale et un attribut*/
{
Switch(etat)
{
case 0: Init(Chaine); car = carsuivant();
if(car == || car == \t || car = \n)
{ etat = 0; debutlex ++; }
else if( car == <) etat = 5;
else if (car == =) etat = 9;
else if (car == >) etat = 10;
else if (isletter(car)) Ajouter(car, chaine);
etat = 1;
else if(isdigit(car)) Ajouter(car, chaine);
etat = 3;
else if(car == EOF) etat = 13;
else Erreur();
case 1: car = carsuiv();
if(isletter(car) || isdigit(car))
ajouter(car, chaine);;
else etat = 2;
break;
case 2: Reculer(1); RangerId(); return(UniLexId()); /* cas où lanalyseur lexical retourne uniquement */lunité lexicale sinon, il faut utiliser un enregistrement (symbole)*/
.
case 3: car = carsuiv();
if(isdigit(car)) ajouter(car, chaine);
else etat = 4;
break;
case 4 : Reculer(1); Return(NB); case 6: Return(Oprel);
case 13: Return(EOF);
}
Unilex AnalLex() /* Unilex est une chaine si AnalLex retourne uniquement lunité lexicale*/
{ /* Unilex est un entier si AnalLex retourne lunité lexicale et chaque unité est définie comme une constante*/
/* Unilex est un enregistrement si AnalLex
retourne lunité lexicale et un attribut*/
{
Switch(etat)
{
case 0: Init(Chaine)car = carsuivant();
if(car == || car == \t || car = \n)
{ etat = 0; debutlex ++; }
else if( car == <) etat = 5;
else if (car == =) etat = 9;
else if (car == >) etat = 10;
else if (isletter(car)) etat = 1;
else if(isdigit(car)) etat = 3;
else if(car == EOF) etat = 13;
else Erreur();
case 1: car = carsuiv();
if(isletter(car) || isdigit(car))
ajouter(car, chaine);;
else etat = 2;
break;
case 2: Reculer(1); symbole.att = RangerId(); symbole.UL = UniLexId(); Return(Symbole);
.
case 3: car = carsuiv();
if(isdigit(car)) ajouter(car, chaine);
else etat = 4;
break;
case 4 : Reculer(1); symbole.UL=NB; symbole.Att = toupper(chaine)); Return(symbole);
case 6: symbole.UL = Oprel; symbole.att = PPE; Return(symbole);
case 13: symbole.UL = EOF; symbole.att = 0;
Return(symbole);}
/* On peut retourner des numériques. |
Partager