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