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 144
| %{
#include <stdlib.h>
#include <string.h>
#include <stdio.h>
#include "bis.tab.h"
int yyerror (char*);
int nbrligne=1;
typedef struct elem * liste;
typedef struct elem{
char *entite;
char *type;
int ligneA;
liste svt;
}elem;
liste table_symboles = NULL;
/*recherche*/
liste recherche(char *entite) {
liste p;
/* recherche dans la table des symboles */
p = table_symboles;
while (p) {
if ( strcmp( p->entite,entite)==0)
{ printf("Variable '%s' deja declarée à la linge %d\n", entite ,p->ligneA);
return p;
}
p = p->svt;
}
return NULL;
}
/*verification*/
void verif(char *entite){
liste p= recherche(entite);
if (p==NULL)
printf("IDENT INCONNU:%s",entite);
else
printf("IDENT CONNU:%s",entite);
}
/*insert*/
void insert(char *entite,char *type){
liste p= recherche(entite);
/* creation d'un noeud */
if (p == NULL) {
p = (liste) malloc(sizeof(elem));
strncpy(p->entite, entite, 32);
p->entite[31] = '\0'; /* si strlen(entite) > 31 */
strcpy(p->type,type);
p->ligneA=nbrligne;
p->svt=NULL;
/* insertion du noeud en tête de liste (LIFO) */
p->svt = table_symboles;
table_symboles = p;
}
}
/*affichage*/
void afficherts(){
liste p = table_symboles;
printf("table\n");
while(p != NULL){
printf("idf: %s type: %s declaré en ligne :%d",p->entite, p->type,p->ligneA);
printf("\n");
p = p->svt;
}
}
%}
lettre [a-zA-Z]
chiffre [0-9]
IDF (({lettre}+)({lettre}*|{chiffre}*|(-?))({lettre}+|{chiffre}+))
constE ({chiffre}+)
SI "si"
SINON "sinon"
constR {chiffre}"."?{chiffre}+
CHAINE ["](.)+["]
coms [#](.)+
type "INT"|"REAL"|"BOOLEAN"|"CHAR"
mot_cle {type}|"START"|"END"|"CODE"|"si"|"sinon"
%%
[\b\t];
{SI}+" "+{SINON}+" "+{IDF} {printf("si***ligne%d***condition attendue\n",nbrligne); }
{SI}+" "+{IDF}+" "+{SINON} {printf("sinon***ligne%d***condition attendue\n",nbrligne);}
{SI} {printf("MCLEF:%s\n",yytext); return (IF);}
{SINON} {printf("MCLEF:%s\n",yytext); return (ELSE);}
"INT" return (INT);
"REAL" return (REAL);
"BOOLEAN" return (BOOLEAN);
"STRING" return (STRING);
"CHAR" return (CHAR);
"," return(VERGULE);
";" return(POINTVERGULE);
"=" return (EGAL);
"<>" return (DIFF);
":=" return(AFFECT);
"." return (POINT);
"CODE" return(CODE);
"START" return(START);
"END" return(END);
"CONST" return (CONST);
"WHILE" return (WHILE);
"EXECUTE" return (EXECUTE);
"WHENE" return (WHENE);
"DO" return (DO);
"OTHERWISE" return (OTHERWISE);
"+" {printf(" ADD:%s\n",yytext); return (SOM);}
"-" {printf(" SUB:%s\n",yytext); return (SOUS);}
"*" {printf(" MUL:%s\n",yytext); return (MUL);}
"/" {printf(" DIV:%s\n",yytext); return (DIV);}
["](.)+[^"] {printf("oh chaine non terminé ***ligne %d****fin de chaine attendue",nbrligne);}
{CHAINE} {printf(" CHAINE:%s\n",yytext);}
{lettre} {printf("IDENT:%s\n",yytext); return (IDF);}
{lettre}- {printf("erreur ligne %d :un idf ne se termine pas par -\n",nbrligne);}
{IDF} {printf("IDENT:%s\n",yytext); return (IDF) ;}
{IDF}- {yyerror("erreur :un idf ne se termine pas par -\n");}
{constE} {printf("ENTIER:%s\n",yytext); return (CONSTE);}
{constR} {printf("REEL:%s\n",yytext); return (CONSTR);}
{coms} {printf(" COMMENTAIRE:ON IGNORE\n"); return (COMS);}
"-"{IDF} {printf("-****ligne%d*****nombre attendu \n",nbrligne);}
"+"{IDF} {printf("-****ligne%d*****nombre attendu \n",nbrligne);}
{constE}"+" {printf("+****ligne%d*****deuxiéme opérande attendu \n",nbrligne);}
{constR}"+" {printf("+****ligne%d*****deuxiéme opérande attendu \n",nbrligne);}
{constE}"-" {printf("-****ligne%d*****deuxiéme opérande attendu \n",nbrligne);}
{constR}"-" {printf("-****ligne%d*****deuxiéme opérande attendu \n",nbrligne);}
[\n] nbrligne++;
~ { yyterminate();}
%%
int yywrap()
{
return 1;
}
int yyerror ( char* m ) {
printf ( "%s\n", m );
return 2;
} |
Partager