xref: /openbsd/usr.bin/yacc/error.c (revision 3642470f)
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