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