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