1 /* $OpenBSD: error.c,v 1.17 2020/05/24 18:27:07 espie Exp $ */
2 /* $NetBSD: error.c,v 1.4 1996/03/19 03:21:32 jtc Exp $ */
3
4 /*
5 * Copyright (c) 1989 The Regents of the University of California.
6 * All rights reserved.
7 *
8 * This code is derived from software contributed to Berkeley by
9 * Robert Paul Corbett.
10 *
11 * Redistribution and use in source and binary forms, with or without
12 * modification, are permitted provided that the following conditions
13 * are met:
14 * 1. Redistributions of source code must retain the above copyright
15 * notice, this list of conditions and the following disclaimer.
16 * 2. Redistributions in binary form must reproduce the above copyright
17 * notice, this list of conditions and the following disclaimer in the
18 * documentation and/or other materials provided with the distribution.
19 * 3. Neither the name of the University nor the names of its contributors
20 * may be used to endorse or promote products derived from this software
21 * without specific prior written permission.
22 *
23 * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
24 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
25 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
26 * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
27 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
28 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
29 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
30 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
31 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
32 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
33 * SUCH DAMAGE.
34 */
35
36 /* routines for printing error messages */
37
38 #include "defs.h"
39 #include <errno.h>
40
41
42 void
fatal(char * msg)43 fatal(char *msg)
44 {
45 fprintf(stderr, "%s: %s\n", input_file_name, msg);
46 exit(2);
47 }
48
49
50 void
no_space(void)51 no_space(void)
52 {
53 fprintf(stderr, "%s: yacc is out of space\n", input_file_name);
54 exit(2);
55 }
56
57
58 void
open_error(char * filename)59 open_error(char *filename)
60 {
61 fprintf(stderr, "%s: cannot open source file %s: %s\n",
62 input_file_name, filename, strerror(errno));
63 exit(2);
64 }
65
66 void
tempfile_error(void)67 tempfile_error(void)
68 {
69 fprintf(stderr, "%s: cannot create temporary file: %s\n",
70 input_file_name, strerror(errno));
71 exit(2);
72 }
73
74 void
open_write_error(char * filename)75 open_write_error(char *filename)
76 {
77 fprintf(stderr, "%s: cannot open target file %s for writing: %s\n",
78 input_file_name, filename, strerror(errno));
79 exit(2);
80 }
81
82 void
unexpected_EOF(void)83 unexpected_EOF(void)
84 {
85 fprintf(stderr, "%s:%d: unexpected end-of-file\n",
86 input_file_name, lineno);
87 exit(1);
88 }
89
90
91 void
print_pos(char * st_line,char * st_cptr)92 print_pos(char *st_line, char *st_cptr)
93 {
94 char *s;
95
96 if (st_line == 0)
97 return;
98 for (s = st_line; *s != '\n'; ++s) {
99 if (isprint((unsigned char)*s) || *s == '\t')
100 putc(*s, stderr);
101 else
102 putc('?', stderr);
103 }
104 putc('\n', stderr);
105 for (s = st_line; s < st_cptr; ++s) {
106 if (*s == '\t')
107 putc('\t', stderr);
108 else
109 putc(' ', stderr);
110 }
111 putc('^', stderr);
112 putc('\n', stderr);
113 }
114
115 void
syntax_error(int st_lineno,char * st_line,char * st_cptr)116 syntax_error(int st_lineno, char *st_line, char *st_cptr)
117 {
118 fprintf(stderr, "%s:%d: syntax error\n",
119 input_file_name, st_lineno);
120 print_pos(st_line, st_cptr);
121 exit(1);
122 }
123
124 void
unterminated_comment(int c_lineno,char * c_line,char * c_cptr)125 unterminated_comment(int c_lineno, char *c_line, char *c_cptr)
126 {
127 fprintf(stderr, "%s:%d: unmatched /*\n",
128 input_file_name, c_lineno);
129 print_pos(c_line, c_cptr);
130 exit(1);
131 }
132
133 void
unterminated_string(int s_lineno,char * s_line,char * s_cptr)134 unterminated_string(int s_lineno, char *s_line, char *s_cptr)
135 {
136 fprintf(stderr, "%s:%d:, unterminated string\n",
137 input_file_name, s_lineno);
138 print_pos(s_line, s_cptr);
139 exit(1);
140 }
141
142 void
unterminated_text(int t_lineno,char * t_line,char * t_cptr)143 unterminated_text(int t_lineno, char *t_line, char *t_cptr)
144 {
145 fprintf(stderr, "%s:%d: unmatched %%{\n",
146 input_file_name, t_lineno);
147 print_pos(t_line, t_cptr);
148 exit(1);
149 }
150
151 void
unterminated_union(int u_lineno,char * u_line,char * u_cptr)152 unterminated_union(int u_lineno, char *u_line, char *u_cptr)
153 {
154 fprintf(stderr, "%s:%d: unterminated %%union declaration\n",
155 input_file_name, u_lineno);
156 print_pos(u_line, u_cptr);
157 exit(1);
158 }
159
160 void
over_unionized(char * u_cptr)161 over_unionized(char *u_cptr)
162 {
163 fprintf(stderr, "%s:%d: too many %%union declarations\n",
164 input_file_name, lineno);
165 print_pos(line, u_cptr);
166 exit(1);
167 }
168
169 void
illegal_tag(int t_lineno,char * t_line,char * t_cptr)170 illegal_tag(int t_lineno, char *t_line, char *t_cptr)
171 {
172 fprintf(stderr, "%s:%d: illegal tag\n",
173 input_file_name, t_lineno);
174 print_pos(t_line, t_cptr);
175 exit(1);
176 }
177
178
179 void
illegal_character(char * c_cptr)180 illegal_character(char *c_cptr)
181 {
182 fprintf(stderr, "%s:%d: illegal character\n",
183 input_file_name, lineno);
184 print_pos(line, c_cptr);
185 exit(1);
186 }
187
188
189 void
used_reserved(char * s)190 used_reserved(char *s)
191 {
192 fprintf(stderr, "%s:%d: illegal use of reserved symbol %s\n",
193 input_file_name, lineno, s);
194 exit(1);
195 }
196
197 void
tokenized_start(char * s)198 tokenized_start(char *s)
199 {
200 fprintf(stderr, "%s:%d: the start symbol %s cannot be declared to be a token\n",
201 input_file_name, lineno, s);
202 exit(1);
203 }
204
205 void
retyped_warning(char * s)206 retyped_warning(char *s)
207 {
208 fprintf(stderr, "%s:%d: the type of %s has been redeclared\n",
209 input_file_name, lineno, s);
210 }
211
212 void
reprec_warning(char * s)213 reprec_warning(char *s)
214 {
215 fprintf(stderr, "%s:%d: the precedence of %s has been redeclared\n",
216 input_file_name, lineno, s);
217 }
218
219 void
revalued_warning(char * s)220 revalued_warning(char *s)
221 {
222 fprintf(stderr, "%s:%d: the value of %s has been redeclared\n",
223 input_file_name, lineno, s);
224 }
225
226 void
terminal_start(char * s)227 terminal_start(char *s)
228 {
229 fprintf(stderr, "%s:%d: the start symbol %s is a token\n",
230 input_file_name, lineno, s);
231 exit(1);
232 }
233
234 void
restarted_warning(void)235 restarted_warning(void)
236 {
237 fprintf(stderr, "%s:%d: the start symbol has been redeclared\n",
238 input_file_name, lineno);
239 }
240
241 void
no_grammar(void)242 no_grammar(void)
243 {
244 fprintf(stderr, "%s:%d: no grammar has been specified\n",
245 input_file_name, lineno);
246 exit(1);
247 }
248
249 void
terminal_lhs(int s_lineno)250 terminal_lhs(int s_lineno)
251 {
252 fprintf(stderr, "%s:%d: a token appears on the lhs of a production\n",
253 input_file_name, s_lineno);
254 exit(1);
255 }
256
257 void
prec_redeclared(void)258 prec_redeclared(void)
259 {
260 fprintf(stderr, "%s:%d: conflicting %%prec specifiers\n",
261 input_file_name, lineno);
262 }
263
264 void
unterminated_action(int a_lineno,char * a_line,char * a_cptr)265 unterminated_action(int a_lineno, char *a_line, char *a_cptr)
266 {
267 fprintf(stderr, "%s:%d: unterminated action\n",
268 input_file_name, a_lineno);
269 print_pos(a_line, a_cptr);
270 exit(1);
271 }
272
273 void
dollar_warning(int a_lineno,int i)274 dollar_warning(int a_lineno, int i)
275 {
276 fprintf(stderr, "%s:%d: $%d references beyond the end of the current rule\n",
277 input_file_name, a_lineno, i);
278 }
279
280 void
dollar_error(int a_lineno,char * a_line,char * a_cptr)281 dollar_error(int a_lineno, char *a_line, char *a_cptr)
282 {
283 fprintf(stderr, "%s:%d: illegal $-name\n",
284 input_file_name, a_lineno);
285 print_pos(a_line, a_cptr);
286 exit(1);
287 }
288
289
290 void
untyped_lhs(void)291 untyped_lhs(void)
292 {
293 fprintf(stderr, "%s:%d: $$ is untyped\n",
294 input_file_name, lineno);
295 exit(1);
296 }
297
298 void
untyped_rhs(int i,char * s)299 untyped_rhs(int i, char *s)
300 {
301 fprintf(stderr, "%s:%d: $%d (%s) is untyped\n",
302 input_file_name, lineno, i, s);
303 exit(1);
304 }
305
306 void
unknown_rhs(int i)307 unknown_rhs(int i)
308 {
309 fprintf(stderr, "%s:%d: $%d is untyped\n",
310 input_file_name, lineno, i);
311 exit(1);
312 }
313
314 void
default_action_warning(void)315 default_action_warning(void)
316 {
317 fprintf(stderr, "%s:%d: the default action assigns an undefined value to $$\n",
318 input_file_name, lineno);
319 }
320
321 void
undefined_goal(char * s)322 undefined_goal(char *s)
323 {
324 fprintf(stderr, "%s: the start symbol %s is undefined\n", input_file_name, s);
325 exit(1);
326 }
327
328 void
undefined_symbol_warning(char * s)329 undefined_symbol_warning(char *s)
330 {
331 fprintf(stderr, "%s: the symbol %s is undefined\n", input_file_name, s);
332 }
333