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