1*792Speter /* Copyright (c) 1979 Regents of the University of California */ 2*792Speter 3*792Speter static char sccsid[] = "@(#)yyprint.c 1.1 08/27/80"; 4*792Speter 5*792Speter #include "whoami.h" 6*792Speter #include "0.h" 7*792Speter #include "yy.h" 8*792Speter 9*792Speter char *tokname(); 10*792Speter 11*792Speter STATIC bool bounce; 12*792Speter 13*792Speter /* 14*792Speter * Printing representation of a 15*792Speter * "character" - a lexical token 16*792Speter * not in a yytok structure. 17*792Speter * 'which' indicates which char * you want 18*792Speter * should always be called as "charname(...,0),charname(...,1)" 19*792Speter */ 20*792Speter char * 21*792Speter charname(ch , which ) 22*792Speter int ch; 23*792Speter int which; 24*792Speter { 25*792Speter struct yytok Ych; 26*792Speter 27*792Speter Ych.Yychar = ch; 28*792Speter Ych.Yylval = nullsem(ch); 29*792Speter return (tokname(&Ych , which )); 30*792Speter } 31*792Speter 32*792Speter /* 33*792Speter * Printing representation of a token 34*792Speter * 'which' as above. 35*792Speter */ 36*792Speter char * 37*792Speter tokname(tp , which ) 38*792Speter register struct yytok *tp; 39*792Speter int which; 40*792Speter { 41*792Speter register char *cp; 42*792Speter register struct kwtab *kp; 43*792Speter char *cp2; 44*792Speter 45*792Speter cp2 = ""; 46*792Speter switch (tp->Yychar) { 47*792Speter case YCASELAB: 48*792Speter cp = "case-label"; 49*792Speter break; 50*792Speter case YEOF: 51*792Speter cp = "end-of-file"; 52*792Speter break; 53*792Speter case YILLCH: 54*792Speter cp = "illegal character"; 55*792Speter break; 56*792Speter case 256: 57*792Speter /* error token */ 58*792Speter cp = "error"; 59*792Speter break; 60*792Speter case YID: 61*792Speter cp = "identifier"; 62*792Speter break; 63*792Speter case YNUMB: 64*792Speter cp = "real number"; 65*792Speter break; 66*792Speter case YINT: 67*792Speter case YBINT: 68*792Speter cp = "number"; 69*792Speter break; 70*792Speter case YSTRING: 71*792Speter cp = tp->Yylval; 72*792Speter cp = cp == NIL || cp[1] == 0 ? "character" : "string"; 73*792Speter break; 74*792Speter case YDOTDOT: 75*792Speter cp = "'..'"; 76*792Speter break; 77*792Speter default: 78*792Speter if (tp->Yychar < 256) { 79*792Speter cp = "'x'\0'x'\0'x'\0'x'"; 80*792Speter /* 81*792Speter * for four times reentrant code! 82*792Speter * used to be: 83*792Speter * if (bounce = ((bounce + 1) & 1)) 84*792Speter * cp += 4; 85*792Speter */ 86*792Speter bounce = ( bounce + 1 ) % 4; 87*792Speter cp += (4 * bounce); /* 'x'\0 is 4 chars */ 88*792Speter cp[1] = tp->Yychar; 89*792Speter break; 90*792Speter } 91*792Speter for (kp = yykey; kp->kw_str != NIL && kp->kw_val != tp->Yychar; kp++) 92*792Speter continue; 93*792Speter cp = "keyword "; 94*792Speter cp2 = kp->kw_str; 95*792Speter } 96*792Speter return ( which ? cp2 : cp ); 97*792Speter } 98