%option noyywrap #define ident 1 #define constante 2 #define mult 3 #define plus 4 #define parg 5 #define pard 6 #define pointvirgule 7 #define divi 8 #define moins 9 #define eof 10 int token; %% [0-9]+([.][0-9]+)?([eE][+\-]?[0-9]+)? return(constante); [a-zA-Z][a-zA-Z0-9]* return(ident); "*" return(mult); "/" return(divi); "+" return(plus); "-" return(moins); "(" return(parg); ")" return(pard); ; return(pointvirgule); . return 0; <> return eof; %% char symbole[eof+1]=" *+();/- "; /* L'ordre correspond à celui des #define */ int facteur(int registre) /* Ici et dans les autres fonctions, le paramètre "registre" est le nombre du premier registre disponible.*/ { int op_unaire=0, para=0; /* bonne expression en parenthèses trouvée? */ token=yylex(); if (token==plus || token==moins) { op_unaire=token; token=yylex(); } if (token==parg) {if (expression(registre)) para=token==pard;} else printf(" %s (Reg %i)",yytext,registre); if (op_unaire) printf(" %c unaire (Reg %i)",symbole[op_unaire],registre); return para || token==ident || token==constante; } int produit(int registre) { int premier=1, op; do { if (!facteur(registre+!premier)) return 0; if (premier) premier=0; else printf(" %c (Reg %i)",symbole[op],registre); op=token=yylex(); if (token==pointvirgule || token==eof || token==plus || token==moins || token==pard) return 1; } while (token==mult || token==divi); return 0; } int expression(int registre) { int premier=1, op; do { op=token; if (!produit(registre+!premier)) return 0; if (premier) premier=0; else printf(" %c (Reg %i)",symbole[op],registre); if (token==pointvirgule || token==eof || token==pard) return 1; } while (token==plus || token==moins); return 0; } main() { do printf(": (%s)\n",expression(0)?"oui":"non"); while (token==pointvirgule); }