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