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