%token NUM %{ int macro[100]; %} %% file: /* empty */ | file linea ; linea: assegnazione ';' | error ';' { yyerrok; } ; assegnazione: '%' '[' espressione ']' '=' espressione { if( $3>99 ) printf("== indice fuori rango =="); else macro[$3]=$6; } ; espressione: addendo { $$=$1; } | espressione '+' addendo { $$=$1+$3; } ; addendo: fattore { $$=$1; } | addendo '*' fattore { $$=$1*$3; } ; fattore: NUM { $$=$1; } | '(' espressione ')' { $$=$2; } | '%' '[' espressione ']' { $$=macro[$3]; } ; %% /* funzione di errore */ int yyerror( char *s ) { printf("== %s ==",s); } /* main */ main () { int i; int massimo, minimo; /* inizializza il vettore */ for( i=0; i<100; i++ ) macro[i]=0; yyparse(); /* parsing */ /* stampa gli elementi del vettore diversi da 0 */ printf("\nElementi diversi da 0: "); for( i=0; i<100; i++ ) if( macro[i]!=0 ) printf(" %%[%d]=%d ",i,macro[i]); /* trova il minimo e il massimo */ massimo=macro[0]; minimo=macro[0]; for( i=1; i<100; i++ ) { if( macro[i]>massimo ) massimo=macro[i]; if( macro[i]