|
|
1.1 root 1: #ifndef lint
2: static char sccsid[] = "@(#)yyerror.c 1.1 86/02/03 Copyr 1984 Sun Micro";
3: #endif
4:
5: /*
6: * Copyright (c) 1984 by Sun Microsystems, Inc.
7: */
8:
9: #include "cpass1.h"
10: #include <ctype.h>
11:
12: /*
13: * printnames for yacc tokens
14: */
15:
16: extern int tokebufptr;
17: extern char tokebufr[];
18: #define MAXTOKELENGTH 20 /* don't care past here */
19:
20: struct pname {
21: int pval;
22: char * name;
23: enum { NOPRINT, VALPRINT, FVALPRINT, NAMEPRINT, STRINGPRINT,
24: ASGPRINT,RELPRINT, EQLPRINT, DIVPRINT, INCRPRINT, UNIPRINT,
25: STRPRINT,SHIFTPRINT, TYPEPRINT, CLASSPRINT, STRUCTPRINT,
26: WORDPRINT, SYMPRINT } howprint;
27: } pname[] = {
28: 0, "<nothing>",NOPRINT,
29: ERROR, "<nothing>",NOPRINT,
30: NAME, "<name>", NAMEPRINT,
31: STRING, "<string>", STRINGPRINT,
32: ICON, "<constant>",VALPRINT,
33: FCON, "<fconstant>", FVALPRINT,
34: PLUS, "+", SYMPRINT,
35: ASG PLUS, "+=", SYMPRINT,
36: MINUS, "-", SYMPRINT,
37: ASG MINUS, "-=", SYMPRINT,
38: UNARY MINUS,"-", SYMPRINT,
39: MUL, "*", SYMPRINT,
40: ASG MUL, "*=", SYMPRINT,
41: UNARY MUL, "*", SYMPRINT,
42: AND, "&", SYMPRINT,
43: ASG AND, "&=", SYMPRINT,
44: UNARY AND, "&", SYMPRINT,
45: OR, "|", SYMPRINT,
46: ASG OR, "|=", SYMPRINT,
47: ER, "^", SYMPRINT,
48: ASG ER, "^=", SYMPRINT,
49: QUEST, "?", SYMPRINT,
50: COLON, ":", SYMPRINT,
51: ANDAND, "&&", SYMPRINT,
52: OROR, "||", SYMPRINT,
53: 25, "=op", ASGPRINT,
54: 26, "relop",RELPRINT,
55: 27, "==", EQLPRINT,
56: 28, "/", DIVPRINT,
57: 29, "<<", SYMPRINT,
58: 30, "++", INCRPRINT,
59: 31, "!", UNIPRINT,
60: 32, "->", STRPRINT,
61: TYPE, "type", TYPEPRINT,
62: CLASS, "extern",CLASSPRINT,
63: STRUCT, "struct",STRUCTPRINT,
64: RETURN, "return",WORDPRINT,
65: GOTO, "goto", WORDPRINT,
66: IF, "if", WORDPRINT,
67: ELSE, "else", WORDPRINT,
68: SWITCH, "switch",WORDPRINT,
69: BREAK, "break",WORDPRINT,
70: CONTINUE, "continue",WORDPRINT,
71: WHILE, "while",WORDPRINT,
72: DO, "do", WORDPRINT,
73: FOR, "for", WORDPRINT,
74: DEFAULT, "default",WORDPRINT,
75: CASE, "case", WORDPRINT,
76: SIZEOF, "sizeof",WORDPRINT,
77: ENUM, "enum", WORDPRINT,
78: LP, "(", SYMPRINT,
79: RP, ")", SYMPRINT,
80: LC, "{", SYMPRINT,
81: RC, "}", SYMPRINT,
82: LB, "[", SYMPRINT,
83: RB, "]", SYMPRINT,
84: CM, ",", SYMPRINT,
85: SM, ";", SYMPRINT,
86: ASSIGN, "=", SYMPRINT,
87: ASM, "asm", WORDPRINT,
88: 0, 0, NOPRINT,
89: };
90:
91: static struct pname *
92: plookup( n )
93: register n;
94: {
95: register struct pname *p;
96: p = pname;
97: while ( p->name != 0 ){
98: if ( p->pval == n ) return p;
99: p++;
100: }
101: return 0;
102: }
103:
104: ccerror( s, c ) char *s; int c;
105: { /* error printing routine in parser */
106: static char mungbuffer[300];
107: static char word[] = "word", symbol[] = "symbol";
108: char *printname;
109: char *noun;
110: char *q = "\"";
111: struct pname *p;
112: extern char yytext[];
113: int i,mt;
114: char token[MAXTOKELENGTH+10], *thischar;
115:
116: p = plookup( c );
117: if (p == 0 || p->howprint==NOPRINT){
118: uerror( s );
119: } else {
120: printname = p->name;
121: switch(p->howprint){
122: case WORDPRINT:
123: noun = word;
124: break;
125: case TYPEPRINT:
126: /* this is hard */
127: noun = "type word";
128: printname = yytext;
129: break;
130: case CLASSPRINT:
131: noun = word;
132: switch(yylval.intval){
133: case AUTO:
134: printname = "auto"; break;
135: case EXTERN:
136: printname = "extern"; break;
137: case FORTRAN:
138: printname = "fortran"; break;
139: case REGISTER:
140: printname = "register"; break;
141: case STATIC:
142: printname = "static"; break;
143: case TYPEDEF:
144: printname = "typedef"; break;
145: }
146: break;
147: case STRUCTPRINT:
148: noun = word;
149: if (yylval.intval==INUNION)
150: printname = "union";
151: break;
152: case SYMPRINT:
153: noun = symbol;
154: q = "";
155: break;
156: case RELPRINT:
157: noun = symbol;
158: q = "";
159: switch ( yylval.intval ){
160: case LS: printname = "<"; break;
161: case LE: printname = "<="; break;
162: case GT: printname = ">"; break;
163: case GE: printname = ">="; break;
164: }
165: break;
166: case EQLPRINT:
167: noun = symbol;
168: q = "";
169: if ( yylval.intval == NE )
170: printname = "!=";
171: break;
172: case DIVPRINT:
173: noun = symbol;
174: q = "";
175: if ( yylval.intval == MOD )
176: printname = "%";
177: break;
178: case SHIFTPRINT:
179: noun = symbol;
180: q = "";
181: if ( yylval.intval == RS)
182: printname = ">>" ;
183: break;
184: case INCRPRINT:
185: noun = symbol;
186: q = "";
187: if ( yylval.intval == DECR )
188: printname = "--";
189: break;
190: case UNIPRINT:
191: noun = symbol;
192: q = "";
193: if ( yylval.intval == COMPL )
194: printname = "~";
195: break;
196: case STRPRINT:
197: noun = symbol;
198: q = "";
199: if ( yylval.intval == DOT )
200: printname = ".";
201: break;
202: case ASGPRINT:
203: noun = symbol;
204: q = "";
205: switch ( yylval.intval ){
206: case ASG PLUS: printname = "+="; break;
207: case ASG MINUS: printname = "-="; break;
208: case ASG MUL: printname = "*="; break;
209: case ASG DIV: printname = "/="; break;
210: case ASG MOD: printname = "%="; break;
211: case ASG AND: printname = "&="; break;
212: case ASG OR: printname = "|="; break;
213: case ASG ER: printname = "^="; break;
214: case ASG LS: printname = "<<="; break;
215: case ASG RS: printname = ">>="; break;
216: }
217: break;
218: case NAMEPRINT:
219: noun = "variable name";
220: printname = yytext;
221: break;
222: case STRINGPRINT:
223: noun = "string";
224: goto gettoken;
225: case VALPRINT:
226: case FVALPRINT:
227: noun = "constant";
228: gettoken:
229: thischar = tokebufr;
230: q = "";
231: if (tokebufptr >= MAXTOKELENGTH)
232: mt = MAXTOKELENGTH;
233: else
234: mt = tokebufptr;
235: for (i=0; i<=mt; i++){
236: if (isascii(*thischar) && isprint(*thischar))
237: token[i] = *thischar;
238: else
239: token[i] = '?';
240: thischar ++;
241: }
242: token[i] = '\0';
243: if (mt < tokebufptr)
244: strcat( token, "...");
245: printname = token;
246: break;
247: default:
248: noun = "";
249: break;
250: }
251: sprintf( mungbuffer, "%s at or near %s %s%s%s", s, noun, q, printname, q);
252: uerror( "%s", mungbuffer );
253: }
254: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.