int i,n,ii; char sym; /** current symbol **/ char input[100]; /** input string **/ char stack[100]; /** history stack **/ int spoint=0; /** stack pointer **/ out(){ for(ii=0;ii<=spoint;ii++)printf("%c ",stack[ii]); for(ii=spoint+1;ii<=5;ii++)printf("%c ",' '); for(ii=1;ii<=i-1;ii++)printf("%c ",' '); for(ii=i;ii<=n;ii++)printf("%c ",input[ii]); for(ii=1;ii<=3;ii++)printf("%c ",' '); } push(char x){ printf("enter %c",x); getchar(); spoint++; stack[spoint]=x; out(); } pop(char x){ printf("exit from %c",x); getchar(); spoint--; out(); } error(){}; getsym(){ if(i!=0)printf("consume %c ",sym); getchar(); i++; sym=input[i]; out(); } X(){ push('X'); S(); if(sym=='!')getsym(); else error(); pop('X'); } S(){ push('S'); if(sym=='('){getsym(); S(); if(sym==')')getsym(); else error(); S();} /** change here **/ else if(sym=='#'); else error(); /** change here **/ // else printf("( expected\n"); /** change here **/ pop('S'); } main(){ printf("Input string followed by !\n"); ii=0; do {ii++; scanf("%c",&input[ii]);} while(input[ii]!='!'); n=ii; printf("Keep hitting return key\n"); getchar(); stack[0]='#'; i=0; getsym(); X(); if(spoint==0)printf("accept\n"); else printf("reject\n"); } /*** sample session, # stack bottom, ! string end marker a.out Input string followed by ! (())! Keep hitting return key # ( ( ) ) ! enter X # X ( ( ) ) ! enter S # X S ( ( ) ) ! consume ( # X S ( ) ) ! enter S # X S S ( ) ) ! consume ( # X S S ) ) ! enter S # X S S S ) ) ! exit from S # X S S ) ) ! consume ) # X S S ) ! enter S # X S S S ) ! exit from S # X S S ) ! exit from S # X S ) ! consume ) # X S ! enter S # X S S ! exit from S # X S ! exit from S # X ! consume ! # X exit from X # accept */