%token VARIABILE %token NUMERO %token IF %token THEN %token PRINT %{ int variabili[10]; int ignore=0; %} %% file: /* empty */ | file istruzione ';' | file error ';' { yyerrok; } ; istruzione: assegnazione | condizionale | stampa ; assegnazione: VARIABILE '=' NUMERO { if( ignore==0 ) variabili[$1]=$3; } ; /* Questa e' la cosa complessa, cioe' la istruzione condizionale. Questo richiede un contatore ignore per ricordare il numero di istruzioni if false nidificate che sono state incontrate finora. Nota che *non* si poteva fare if( var[]==0 ) then ignore--, perche' se la condizione era vera e metteva a 0 la variabile, si otteneva ignore=1- */ condizionale: IF VARIABILE THEN { $$=ignore; if( variabili[$2]==0 ) ignore++; } istruzione { ignore=$4; } ; stampa: PRINT VARIABILE { if( ignore==0 ) printf("$%d=%d\n",$2,variabili[$2]); } ; %% int yyerror( char *s ) { printf("-- %s --",s); } main() { int i; yyparse(); printf("\n"); for( i=0; i<10; i++ ) printf("$%d=%d ",i,variabili[i]); printf("\n"); return 0; }