xref: /csrg-svn/usr.bin/pascal/src/yyprint.c (revision 48116)
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