1792Speter /* Copyright (c) 1979 Regents of the University of California */ 2792Speter 3*3087Smckusic static char sccsid[] = "@(#)yyprint.c 1.2 03/08/81"; 4792Speter 5792Speter #include "whoami.h" 6792Speter #include "0.h" 7792Speter #include "yy.h" 8792Speter 9792Speter char *tokname(); 10792Speter 11*3087Smckusic STATIC short bounce; 12792Speter 13792Speter /* 14792Speter * Printing representation of a 15792Speter * "character" - a lexical token 16792Speter * not in a yytok structure. 17792Speter * 'which' indicates which char * you want 18792Speter * should always be called as "charname(...,0),charname(...,1)" 19792Speter */ 20792Speter char * 21792Speter charname(ch , which ) 22792Speter int ch; 23792Speter int which; 24792Speter { 25792Speter struct yytok Ych; 26792Speter 27792Speter Ych.Yychar = ch; 28792Speter Ych.Yylval = nullsem(ch); 29792Speter return (tokname(&Ych , which )); 30792Speter } 31792Speter 32792Speter /* 33792Speter * Printing representation of a token 34792Speter * 'which' as above. 35792Speter */ 36792Speter char * 37792Speter tokname(tp , which ) 38792Speter register struct yytok *tp; 39792Speter int which; 40792Speter { 41792Speter register char *cp; 42792Speter register struct kwtab *kp; 43792Speter char *cp2; 44792Speter 45792Speter cp2 = ""; 46792Speter switch (tp->Yychar) { 47792Speter case YCASELAB: 48792Speter cp = "case-label"; 49792Speter break; 50792Speter case YEOF: 51792Speter cp = "end-of-file"; 52792Speter break; 53792Speter case YILLCH: 54792Speter cp = "illegal character"; 55792Speter break; 56792Speter case 256: 57792Speter /* error token */ 58792Speter cp = "error"; 59792Speter break; 60792Speter case YID: 61792Speter cp = "identifier"; 62792Speter break; 63792Speter case YNUMB: 64792Speter cp = "real number"; 65792Speter break; 66792Speter case YINT: 67792Speter case YBINT: 68792Speter cp = "number"; 69792Speter break; 70792Speter case YSTRING: 71792Speter cp = tp->Yylval; 72792Speter cp = cp == NIL || cp[1] == 0 ? "character" : "string"; 73792Speter break; 74792Speter case YDOTDOT: 75792Speter cp = "'..'"; 76792Speter break; 77792Speter default: 78792Speter if (tp->Yychar < 256) { 79792Speter cp = "'x'\0'x'\0'x'\0'x'"; 80792Speter /* 81792Speter * for four times reentrant code! 82792Speter * used to be: 83792Speter * if (bounce = ((bounce + 1) & 1)) 84792Speter * cp += 4; 85792Speter */ 86792Speter bounce = ( bounce + 1 ) % 4; 87792Speter cp += (4 * bounce); /* 'x'\0 is 4 chars */ 88792Speter cp[1] = tp->Yychar; 89792Speter break; 90792Speter } 91792Speter for (kp = yykey; kp->kw_str != NIL && kp->kw_val != tp->Yychar; kp++) 92792Speter continue; 93792Speter cp = "keyword "; 94792Speter cp2 = kp->kw_str; 95792Speter } 96792Speter return ( which ? cp2 : cp ); 97792Speter } 98