|
|
1.1 root 1: /*
2: * Routines for producing error messages.
3: */
4:
5: #include "itran.h"
6: #include "token.h"
7: #include "tree.h"
8: #include "lex.h"
9:
10: struct errmsg {
11: int e_state; /* parser state number */
12: char *e_mesg; /* message text */
13: } errtab[] = {
14: #include "synerr.h"
15: -1, "syntax error"
16: };
17:
18: /*
19: * yyerror produces syntax error messages. tok is the offending token
20: * (yychar), lval is yylval, and state is the parser's state.
21: *
22: * errtab is searched for the state, if it is found, the associated
23: * message is produced; if the state isn't found, "syntax error"
24: * is produced.
25: */
26: yyerror(tok, lval, state)
27: int tok, state;
28: nodeptr lval;
29: {
30: register struct errmsg *p;
31: char *mapterm();
32:
33: if (*filep)
34: fprintf(stderr, "%s, ", *filep);
35: if (tok == EOFX) /* special case end of file */
36: fprintf(stderr, "unexpected end of file\n");
37: else {
38: fprintf(stderr, "line %d: ", LINE(lval));
39: if (COL(lval))
40: fprintf(stderr, "\"%s\": ", mapterm(tok,lval));
41: for (p = errtab; p->e_state != state && p->e_state >= 0; p++) ;
42: fprintf(stderr, "%s\n", p->e_mesg);
43: }
44: fatalerrs++;
45: nocode++;
46: }
47: /*
48: * err produces the error messages s1 and s2 (if non-null). The
49: * current line number is found in tline.
50: */
51: err(s1, s2)
52: char *s1, *s2;
53: {
54: if (*filep)
55: fprintf(stderr, "%s, ", *filep);
56: fprintf(stderr, "line %d: ", tline);
57: if (s2)
58: fprintf(stderr, "\"%s\": ", s2);
59: fprintf(stderr, "%s\n", s1);
60: fatalerrs++;
61: nocode++;
62: }
63:
64: /*
65: * lerr produces the error message s and associates it with line l.
66: */
67: lerr(l, s)
68: int l;
69: char *s;
70: {
71: if (*filep)
72: fprintf(stderr, "%s, ", *filep);
73: fprintf(stderr, "line %d: ", l);
74: fprintf(stderr, "%s\n", s);
75: fatalerrs++;
76: nocode++;
77: }
78:
79: /*
80: * warn produces s1 and s2 (if non-null) as warning messages. The current
81: * line is in tline.
82: */
83: warn(s1, s2)
84: char *s1, *s2;
85: {
86: if (*filep)
87: fprintf(stderr, "%s, ", *filep);
88: fprintf(stderr, "line %d: ", tline);
89: if (s2)
90: fprintf(stderr, "\"%s\": ", s2);
91: fprintf(stderr, "%s\n", s1);
92: warnings++;
93: }
94:
95: /*
96: * syserr is called for fatal errors. The message s is produced and the
97: * translator exits.
98: */
99: syserr(s)
100: char *s;
101: {
102: if (*filep)
103: fprintf(stderr, "%s, ", *filep);
104: fprintf(stderr, "line %d: %s\n", inline, s);
105: exit(1);
106: }
107:
108: /*
109: * mapterm finds a printable string for the given token type
110: * and value.
111: */
112: char *mapterm(typ,val)
113: int typ;
114: nodeptr val;
115: {
116: register struct toktab *t;
117: register i;
118:
119: i = typ;
120: if (i == IDENT || i == INTLIT || i == REALLIT || i == STRINGLIT || i == CSETLIT)
121: return (STR0(val));
122: for (t = toktab; t->t_type != i; t++)
123: if (t->t_type == 0)
124: return ("???");
125: return (t->t_word);
126: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.