#include #include #include # define INT 300 # define FLOAT 301 # define ID 302 # define QUIT 303 /* les macros sont des blocs : pas de ';' apres */ #define AVANCER {jeton=yylex(); } #define TEST_AVANCE(prevu) {if (jeton==(prevu)) AVANCER else ERREUR_SYNTAXE} #define ERREUR_SYNTAXE {printf("\nMot non reconnu : erreur de syntaxe sur le jeton %d \n",jeton); exit(1);} #define INVITE "Veuillez une déclaration (q pour quitter) : " /* déclarations en avant des fonctions */ void decl(); void type(); int lparam(); int param(); int rparam(); int valeur; int jeton; int erreur; int yylex(); void decl(){ int r; if ((jeton==INT)||(jeton==FLOAT)){ type(); TEST_AVANCE(ID); TEST_AVANCE('('); r=lparam(); TEST_AVANCE(')'); TEST_AVANCE(';'); printf("%d paramètres\n",r); } else{ ERREUR_SYNTAXE} } void type(){ if ((jeton==INT)||(jeton==FLOAT)){ AVANCER; return ; } else ERREUR_SYNTAXE; } int lparam(){ if ((jeton==INT)||(jeton==FLOAT)){ int r=param(); int r2=rparam(); return r+r2; } else if (jeton==')') /*regle lpara -> eps*/ return 0; else ERREUR_SYNTAXE; } int param(){ if ((jeton==INT)||(jeton==FLOAT)){ type(); TEST_AVANCE(ID); return 1; } else ERREUR_SYNTAXE; } int rparam(){ if (jeton==','){ AVANCER; int r=param(); int r2=rparam(); return r+r2; } else if (jeton==')') /*regle rpara -> eps*/ return 0; else ERREUR_SYNTAXE; } int main(){ printf(INVITE); numcar=0; AVANCER; decl(); return 0; /* ne retourne jamais que par X */ }