148116Sbostic /*-
262227Sbostic * Copyright (c) 1980, 1993
362227Sbostic * The Regents of the University of California. All rights reserved.
448116Sbostic *
548116Sbostic * %sccs.include.redist.c%
622212Sdist */
7792Speter
814748Sthien #ifndef lint
9*67251Smckusick static char sccsid[] = "@(#)yyprint.c 8.2 (Berkeley) 05/27/94";
1048116Sbostic #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 *
charname(ch,which)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
40*67251Smckusick char strname[] = "'x'\0'x'\0'x'\0'x'";
41792Speter /*
42792Speter * Printing representation of a token
43792Speter * 'which' as above.
44792Speter */
45792Speter char *
tokname(tp,which)46792Speter tokname(tp , which )
47792Speter register struct yytok *tp;
48792Speter int which;
49792Speter {
50*67251Smckusick char *cp;
51*67251Smckusick static char buf[16];
52792Speter register struct kwtab *kp;
53792Speter char *cp2;
54792Speter
55792Speter cp2 = "";
56792Speter switch (tp->Yychar) {
57792Speter case YCASELAB:
58792Speter cp = "case-label";
59792Speter break;
60792Speter case YEOF:
61792Speter cp = "end-of-file";
62792Speter break;
63792Speter case YILLCH:
64792Speter cp = "illegal character";
65792Speter break;
66792Speter case 256:
67792Speter /* error token */
68792Speter cp = "error";
69792Speter break;
70792Speter case YID:
71792Speter cp = "identifier";
72792Speter break;
73792Speter case YNUMB:
74792Speter cp = "real number";
75792Speter break;
76792Speter case YINT:
77792Speter case YBINT:
78792Speter cp = "number";
79792Speter break;
80792Speter case YSTRING:
8114748Sthien cp = (char *) tp->Yylval;
82792Speter cp = cp == NIL || cp[1] == 0 ? "character" : "string";
83792Speter break;
84792Speter case YDOTDOT:
85792Speter cp = "'..'";
86792Speter break;
87792Speter default:
88792Speter if (tp->Yychar < 256) {
89*67251Smckusick bcopy("'x'\0'x'\0'x'\0'x'", buf, 16);
90*67251Smckusick cp = buf;
91792Speter /*
92792Speter * for four times reentrant code!
93792Speter * used to be:
94792Speter * if (bounce = ((bounce + 1) & 1))
95792Speter * cp += 4;
96792Speter */
97792Speter bounce = ( bounce + 1 ) % 4;
98792Speter cp += (4 * bounce); /* 'x'\0 is 4 chars */
99792Speter cp[1] = tp->Yychar;
100792Speter break;
101792Speter }
102792Speter for (kp = yykey; kp->kw_str != NIL && kp->kw_val != tp->Yychar; kp++)
103792Speter continue;
104792Speter cp = "keyword ";
105792Speter cp2 = kp->kw_str;
106792Speter }
107792Speter return ( which ? cp2 : cp );
108792Speter }
109