1 /* $Id: cfeil.c,v 1.19 1995/03/07 10:53:16 cim Exp $ */
2
3 /* Copyright (C) 1994, 1998 Sverre Hvammen Johansen,
4 * Department of Informatics, University of Oslo.
5 *
6 * This program is free software; you can redistribute it and/or modify
7 * it under the terms of the GNU General Public License as published by
8 * the Free Software Foundation; version 2.
9 *
10 * This program is distributed in the hope that it will be useful,
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 * GNU General Public License for more details.
14 *
15 * You should have received a copy of the GNU General Public License
16 * along with this program; if not, write to the Free Software
17 * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */
18
19 /* Inneholder de tekstlige feilmeldingene som kompilatoren kan gi.
20 * For noen tilfeller b|r det gis bedre og mer spesifike feilmeldinger.
21 * Dette gjelder spesielt for feilmeldinger fra sjekkeren.
22 *
23 * Siden det kan inkluderes filer m} det lages et tabellverk som
24 * holder greie p} hvilke linjenummere internt i kompilator-programmet
25 * som h|rer til de enkelte filene.
26 * Dette tabellverket brukes s} i forbindelse med utskrift
27 * av feilmeldinger. */
28
29 #include "const.h"
30 #include "dekl.h"
31 #include "cimcomp.h"
32 #include "error.h"
33 #include "lex.h"
34 #include "extspec.h"
35 #include "mapline.h"
36
37 #if STDC_HEADERS
38 #include <stdlib.h>
39 #endif
40
41 int anterror;
42
43 /******************************************************************************
44 STARTERROR */
45 void
starterror(line)46 static starterror (line)
47 long line;
48 {
49 anterror++;
50 if (line == 0)
51 return;
52 fprintf (stderr, "\"%s\", line %ld: "
53 ,getmapfile (line), getmapline (line));
54 }
55
56 /******************************************************************************
57 LERROR */
58
59 /* Feil som oppdages av LEX */
60
61 void
lerror(errcode)62 lerror (errcode)
63 int errcode;
64 {
65 if (option_nowarning && (errcode == 8 || errcode == 32))
66 return;
67 starterror (lineno);
68 switch (errcode)
69 {
70 case 1:
71 fprintf (stderr, "Comments are not terminated with ';'.\n");
72 break;
73 case 2:
74 fprintf (stderr, "Illegal character constant.\n");
75 break;
76 case 3:
77 fprintf (stderr, "Character constant is not terminated.\n");
78 break;
79 case 4:
80 fprintf (stderr, "Text constant is not terminated.\n");
81 break;
82 case 5:
83 fprintf (stderr, "Illegal character in text constant.\n");
84 break;
85 case 7:
86 fprintf (stderr, "Illegal character (combination).\n");
87 break;
88 case 8:
89 fprintf (stderr, "Warning: Unknown directive line.\n");
90 anterror--;
91 break;
92 case 9:
93 fprintf (stderr, "Too big integer constant.\n");
94 break;
95 case 11:
96 fprintf (stderr, "Radix integer constant has bad format.\n");
97 break;
98 case 12:
99 fprintf (stderr, "Illegal radix digit in integer constant.\n");
100 break;
101 case 15:
102 fprintf (stderr, "Homeless %%ENDCOMMENT.\n");
103 break;
104 case 16:
105 fprintf (stderr, "Radix integer is illegal in real constant.\n");
106 break;
107 case 17:
108 fprintf (stderr, "Recursive inclusion of files.\n");
109 break;
110 case 18:
111 fprintf (stderr, "File specified by %%INCLUDE can't be opened.\n");
112 break;
113 case 19:
114 fprintf (stderr, "%%COMMENT is not terminated with %%ENDCOMMENT.\n");
115 break;
116 case 21:
117 fprintf (stderr, "Homeless %%ELSE(NOT)DEF.\n");
118 break;
119 case 22:
120 fprintf (stderr, "Homeless %%ELSE.\n");
121 break;
122 case 23:
123 fprintf (stderr, "Homeless %%ENDIF.\n");
124 break;
125 case 24:
126 fprintf (stderr, "%%IF(NOT)DEF is not terminated with %%ENDIF.\n");
127 break;
128 #if HAVE_SIGFPE
129 case 25:
130 fprintf (stderr, "Arithmetic overflow.\n");
131 exit (TRUE);
132 break;
133 #endif
134 #if HAVE_SIGSEGV
135 case 26:
136 fprintf (stderr, "System error: Segmentation violation.\n");
137 exit (TRUE);
138 break;
139 #endif
140 #if HAVE_SIGBUS
141 case 27:
142 fprintf (stderr, "System error: Bus error.\n");
143 exit (TRUE);
144 break;
145 #endif
146 #if HAVE_SIGILL
147 case 28:
148 fprintf (stderr, "System error: Illegal instruction.\n");
149 exit (TRUE);
150 break;
151 #endif
152 #if HAVE_SIGTRAP
153 case 29:
154 fprintf (stderr, "System error: Trace trap.\n");
155 exit (TRUE);
156 break;
157 #endif
158 #if HAVE_SIGSYS
159 case 30:
160 fprintf (stderr, "System error: Bad argument to system call.\n");
161 exit (TRUE);
162 break;
163 #endif
164 case 32:
165 fprintf (stderr, "Warning: May have forgotten ';' after END.\n");
166 anterror--;
167 break;
168 case 44:
169 fprintf (stderr, "System error: Too long text constant.\n");
170 exit (TRUE);
171 break;
172 default:
173 fprintf (stderr, "System error: No Message specified (%d).\n"
174 , errcode);
175 exit (TRUE);
176 }
177 }
178
179 /******************************************************************************
180 YERROR */
181
182 /* Feil som oppdages av YACC */
183
184 /*VARARGS1 */
yerror(errcode,txt)185 yerror (errcode, txt)
186 int errcode;
187 char *txt;
188 {
189 char c;
190 starterror (lineno);
191 switch (errcode)
192 {
193 case 1:
194 fprintf (stderr, "Illegal kind on external procedure.\n");
195 break;
196 case 2:
197 fprintf (stderr, "IN is illegal in external declaration.\n");
198 break;
199 case 7:
200 fprintf (stderr, "Type REF is illegal in constant declaration.\n");
201 break;
202 case 8:
203 fprintf (stderr, "IN is illegal in specification of formal procedure.\n");
204 break;
205 case 9:
206 fprintf (stderr, "Relation operator other than '=' is used in constant declaration.\n");
207 break;
208 case 13:
209 fprintf (stderr, "Syntax error.\n");
210 break;
211 case 14:
212 fprintf (stderr, "System error: Yacc stack overflow.\n");
213 exit (TRUE);
214 break;
215 case 16:
216 fprintf (stderr, "System error: No Message specified from Yacc.\n");
217 exit (TRUE);
218 break;
219 case 21:
220 c = toupper ((int) txt[0]);
221 txt++;
222 fprintf (stderr, "%c%s.\n", c, txt);
223 break;
224 case 25:
225 fprintf (stderr, "Illegal empty statement.\n");
226 break;
227 case 26:
228 fprintf (stderr, "Declaration is found after a sentence.\n");
229 break;
230 case 27:
231 fprintf (stderr, "Declaration is found after a label.\n");
232 break;
233 case 28:
234 fprintf (stderr, "Declaration is not terminated with ';'.\n");
235 break;
236 case 29:
237 fprintf (stderr, "Illegal with declaration as body.\n");
238 break;
239 case 45:
240 fprintf (stderr, "Formal or virtual procedure shall be specified.\n");
241 break;
242 default:
243 fprintf (stderr, "System error: No Message specified (%d).\n"
244 , errcode);
245 exit (TRUE);
246 }
247 }
248
249 /******************************************************************************
250 D1ERROR */
251
252 /* Feil som oppdages av DECL PASS 1 */
253
254 /*VARARGS1 */
d1error(errcode,name)255 d1error (errcode, name)
256 int errcode;
257 char *name;
258 {
259 starterror (lineno);
260 switch (errcode)
261 {
262 case 37:
263 fprintf (stderr, "System error: Illegal categ in declaration.\n");
264 exit (TRUE);
265 break;
266 case 34:
267 fprintf (stderr, "Identifier %s is not a parameter.\n"
268 , name);
269 break;
270 case 35:
271 fprintf (stderr, "Identifier %s is specified twice in mode part.\n", name);
272 break;
273 case 36:
274 fprintf (stderr, "Identifier %s is specified twice.\n", name);
275 break;
276 case 41:
277 fprintf (stderr, "Identifier %s is specified twice as HIDDEN/PROTECTED.\n", name);
278 break;
279 case 38:
280 fprintf (stderr, "INNER is not on outermost block level in this Class.\n");
281 break;
282 case 39:
283 fprintf (stderr, "More than one inner in this Class.\n");
284 break;
285 default:
286 fprintf (stderr, "System error: No Message specified (%d).\n"
287 , errcode);
288 exit (TRUE);
289 }
290 }
291
292 /******************************************************************************
293 D2ERROR */
294
295 /* Feil som oppdages av DECL PASS 2 */
296
297 /*VARARGS1 */
d2error(errcode,rd1,rd2)298 d2error (errcode, rd1, rd2)
299 int errcode;
300 struct DECL *rd1,
301 *rd2;
302 {
303 char *name1 = rd1->ident;
304 starterror (errcode == 79 ? lineno : rd1->line);
305 switch (errcode)
306 {
307 case 49:
308 fprintf (stderr, "%s is illegal as prefix to %s (seen through inspect).\n"
309 ,rd2->ident, name1);
310 break;
311 case 50:
312 fprintf (stderr, "%s is illegal as prefix to %s (not a Class).\n"
313 ,rd2->ident, name1);
314 break;
315 case 51:
316 fprintf (stderr, "%s is illegal as prefix to %s (not declared at same block level).\n"
317 ,rd2->ident, name1);
318 break;
319 case 52:
320 fprintf (stderr, "%s is illegal as prefix to %s (circulated prefix chain).\n"
321 ,rd2->ident, name1);
322 break;
323 case 53:
324 fprintf (stderr, "%s has unknown qualification.\n", name1);
325 break;
326 case 54:
327 fprintf (stderr, "%s has illegal qualification.\n"
328 , name1);
329 break;
330 case 55:
331 fprintf (stderr, "%s is declared twice.\n"
332 , name1);
333 break;
334 case 56:
335 fprintf (stderr, "%s is illegal parameter to Class.\n"
336 , name1);
337 break;
338 case 57:
339 fprintf (stderr, "%s can't be transmitted by value.\n"
340 , name1);
341 break;
342 case 58:
343 fprintf (stderr, "%s is illegal as name to a Class.\n"
344 , name1);
345 break;
346 case 59:
347 fprintf (stderr, "System error: Illegal categ in declaration.\n");
348 exit (TRUE);
349 break;
350 case 60:
351 fprintf (stderr, "%s is already specified as virtual.\n"
352 , name1);
353 break;
354 case 61:
355 fprintf (stderr, "%s is illegal as virtual.\n"
356 , name1);
357 break;
358 case 62:
359 fprintf (stderr, "%s is illegal match.\n"
360 , name1);
361 break;
362 case 63:
363 fprintf (stderr, "%s is not specified.\n"
364 , name1);
365 break;
366 case 72:
367 fprintf (stderr, "This %s is illegal since the Class is used as prefix to a block.\n"
368 ,name1);
369 break;
370 case 73:
371 fprintf (stderr, "Illegal inspect.\n");
372 break;
373 case 74:
374 fprintf (stderr, "%s is undeclared.\n"
375 ,name1);
376 break;
377 case 75:
378 fprintf (stderr, "%s is not declared local.\n"
379 , name1);
380 break;
381 case 76:
382 fprintf (stderr, "%s is not Protected.\n"
383 , name1);
384 break;
385 case 77:
386 fprintf (stderr, "Text/ref atributte %s can't be transmitted by name to a C procedure.\n"
387 , name1);
388 break;
389 case 78:
390 fprintf (stderr, "External C procedure %s can't have type ref.\n", name1);
391 break;
392 case 79:
393 fprintf (stderr, "This %s is illegal.\n"
394 , name1);
395 break;
396 case 80:
397 fprintf (stderr, "... is not last parameter.\n");
398 break;
399 case 81:
400 fprintf (stderr, "... is only legal to C procedures.\n");
401 break;
402 case 82:
403 fprintf (stderr, "Label %s is not legal as parameter to a C procedure.\n"
404 ,name1);
405 break;
406 default:
407 fprintf (stderr, "System error: No Message specified.\n (%d).\n"
408 , errcode);
409 exit (TRUE);
410 }
411 }
412
413 /******************************************************************************
414 TEXTNUMBER */
415
416 char *
textnumber(i)417 textnumber (i)
418 int i;
419 {
420 static char s[10];
421 switch (i)
422 {
423 case 1:
424 strcpy (s, "First");
425 break;
426 case 2:
427 strcpy (s, "Second");
428 break;
429 case 3:
430 strcpy (s, "Third");
431 break;
432 case 4:
433 strcpy (s, "Fourth");
434 break;
435 case 5:
436 strcpy (s, "Fifth");
437 break;
438 case 6:
439 strcpy (s, "Sixth");
440 break;
441 case 7:
442 strcpy (s, "Seventh");
443 break;
444 case 8:
445 strcpy (s, "Eighth");
446 break;
447 case 9:
448 strcpy (s, "Ninth");
449 break;
450 case 10:
451 strcpy (s, "Tenth");
452 break;
453 default:
454 sprintf (s, "%dth", i);
455 }
456 return (s);
457 }
458
459 /******************************************************************************
460 SERROR */
461
462 /* Feil som oppdages av SJEKKEREN */
463
464 /*VARARGS1 */
465 void
serror(errcode,name,ant)466 serror (errcode, name, ant)
467 int errcode,
468 ant;
469 char *name;
470 {
471 char *antt;
472 if (option_nowarning && errcode >= 81 && errcode <= 83 )
473 return;
474 starterror (lineno);
475 antt = textnumber (ant);
476 switch (errcode)
477 {
478 case 1:
479 fprintf (stderr, "Division by zero.\n");
480 break;
481 case 3:
482 fprintf (stderr, "Illegal prefix to block.\n");
483 break;
484 case 4:
485 fprintf (stderr, "Negative integer exponent is illegal.\n");
486 break;
487 case 6:
488 fprintf (stderr, "No constant expression in constant declaration.\n");
489 break;
490 case 7:
491 fprintf (stderr, "Constant is used before it is defined.\n");
492 break;
493 case 8:
494 fprintf (stderr, "Illegal reference to label.\n");
495 break;
496 case 9:
497 fprintf (stderr, "DOT or QUA is illegal after NONE.\n");
498 break;
499 case 44:
500 fprintf (stderr, "System error: Computed text constant too long.\n");
501 exit (TRUE);
502 break;
503 case 71:
504 fprintf (stderr, "System error: Illegal symbol in M.\n"
505 , name);
506 exit (TRUE);
507 break;
508 case 73:
509 fprintf (stderr, "Expression after INSPECT is not of type ref.\n");
510 break;
511 case 75:
512 fprintf (stderr, "Identifier %s is not declared.\n", name);
513 break;
514 case 77:
515 fprintf (stderr, "Expression after IF/WHILE is not of type boolean.\n");
516 break;
517 case 81:
518 fprintf (stderr, "Warning: FOR/WHILE-statement has empty body.\n");
519 anterror--;
520 break;
521 case 82:
522 fprintf (stderr, "Warning: When %s will always be executed, unless NONE.\n"
523 , name);
524 anterror--;
525 break;
526 case 83:
527 fprintf (stderr, "Warning: When %s will never be executed.\n"
528 , name);
529 anterror--;
530 break;
531 case 84:
532 fprintf (stderr, "WHEN is not followed by a Class name.\n");
533 break;
534 case 85:
535 fprintf (stderr, "Illegal qualification in expression.\n");
536 break;
537 case 86:
538 fprintf (stderr, "Illegal type on controlling variable in for-sentence.\n");
539 break;
540 case 87:
541 fprintf (stderr, "Illegal controlling variable in for-sentence.\n");
542 break;
543 case 88:
544 fprintf (stderr, "Illegal type in FOR/SWITCH sentences or in specification of array bounds.\n");
545 break;
546 case 89:
547 fprintf (stderr, "Illegal (to use a local) variable in specification of array bounds.\n");
548 break;
549 case 90:
550 fprintf (stderr, "Left argument to assignment is illegal.\n");
551 break;
552 case 91:
553 fprintf (stderr, "Arguments to assignment have illegal type.\n");
554 break;
555 case 92:
556 fprintf (stderr, "Different types for THEN- and ELSE-path.\n");
557 break;
558 case 93:
559 fprintf (stderr, "IF after THEN is illegal.\n");
560 break;
561 case 94:
562 fprintf (stderr, "No common qualification for THEN- and ELSE-path.\n");
563 break;
564 case 95:
565 fprintf (stderr, "Argument(s) in boolean operator is not of type boolean.\n");
566 break;
567 case 96:
568 fprintf (stderr, "Arguments to relation operator have illegal type.\n");
569 break;
570 case 97:
571 fprintf (stderr, "Arguments to arithmetic operator have illegal type.\n");
572 break;
573 case 98:
574 fprintf (stderr, "Double unear sub or add operator.\n");
575 break;
576 case 99:
577 fprintf (stderr, "%s is no Class name.\n"
578 , name);
579 break;
580 case 100:
581 fprintf (stderr, "Argument before '.'/QUA is not of type ref or text.\n");
582 break;
583 case 101:
584 fprintf (stderr, "Identifier %s is not declared as array or procedure.\n"
585 , name);
586 break;
587 case 102:
588 fprintf (stderr, "%s parameter to %s: Wrong number of parameters.\n"
589 , antt, name);
590 break;
591 case 103:
592 fprintf (stderr, "%s parameter to %s: Assumed an array or procedure.\n"
593 , antt, name);
594 break;
595 case 104:
596 fprintf (stderr, "%s parameter to %s: Illegal type.\n", antt, name);
597 break;
598 case 105:
599 fprintf (stderr, "%s parameter to %s: Illegal parameter.\n"
600 , antt, name);
601 break;
602 case 106:
603 fprintf (stderr, "Identifier %s is illegal.\n"
604 , name);
605 break;
606 case 107:
607 fprintf (stderr, "Assumed parameter(s) to %s.\n"
608 , name);
609 break;
610 case 108:
611 fprintf (stderr, "Expression after GOTO is not of type label.\n");
612 break;
613 case 109:
614 fprintf (stderr, "Arguments to '&' operator is not of type text .\n");
615 break;
616 case 110:
617 fprintf (stderr, "%s parameter to %s: Illegal to have expression as actual VAR.\n"
618 , antt, name);
619 break;
620 case 111:
621 fprintf (stderr, "%s parameter to %s: Illegal kind.\n"
622 , antt, name);
623 break;
624 case 112:
625 fprintf (stderr, "%s parameter to %s: Illegal procedure.\n"
626 , antt, name);
627 break;
628 case 115:
629 fprintf (stderr, "Illegal expression without assignment.\n");
630 break;
631 case 116:
632 fprintf (stderr, "'.' is not followed by an identifier.\n");
633 break;
634 case 117:
635 fprintf (stderr, "Illegal to have '.' to a local Class.\n");
636 break;
637 case 118:
638 fprintf (stderr, "Assignment is misplaced.\n");
639 break;
640 case 119:
641 fprintf (stderr, "Indexes is missing for array %s.\n"
642 , name);
643 break;
644 default:
645 fprintf (stderr, "System error: No Message specified (%d).\n"
646 , errcode);
647 exit (TRUE);
648 }
649 }
650
651 /******************************************************************************
652 GERROR */
653
654 /* Feil som oppdages av kodeGENERATOREN */
655
656 /*VARARGS1 */
gerror(errcode,name)657 gerror (errcode, name)
658 int errcode;
659 char *name;
660 {
661 starterror (lineno);
662 switch (errcode)
663 {
664 case 82:
665 fprintf (stderr, "Lower bound is greater than upper bound in array %s.\n"
666 ,name);
667 break;
668 case 87:
669 fprintf (stderr, "System error: Too deep nesting in temporary expression.\n");
670 exit (TRUE);
671 break;
672 case 85:
673 fprintf (stderr, "System error: Too many dimensions for array.\n");
674 exit (TRUE);
675 break;
676 default:
677 fprintf (stderr, "System error: No Message specified (%d).\n"
678 , errcode);
679 exit (TRUE);
680 }
681 }
682
683
684 /******************************************************************************
685 MERROR */
686
687 /* Feil som oppdages under innlesing av eksterne moduler */
688
689 /*VARARGS1 */
690 void
merror(errcode,name)691 merror (errcode, name)
692 int errcode;
693 char *name;
694 {
695 if (option_nowarning && errcode == 3 && option_atr)
696 return;
697 starterror (lineno);
698 switch (errcode)
699 {
700 case 1:
701 fprintf (stderr, "Length of filename %s is too long.\n"
702 , name);
703 break;
704 case 3:
705 fprintf (stderr, "Can't read atr-file %s.\n", name);
706 if (option_atr)
707 {
708 anterror--;
709 return;
710 }
711 break;
712 case 4:
713 fprintf (stderr, "External specified module %s need re-compilation.\n"
714 ,name);
715 break;
716 case 5:
717 fprintf (stderr, "File %s has illegal format.\n"
718 ,name);
719 break;
720 case 6:
721 fprintf (stderr, "Can't read arch-file %s.\n"
722 ,name);
723 break;
724 case 7:
725 fprintf (stderr, "File %s is no arch-file.\n"
726 ,name);
727 break;
728 case 8:
729 fprintf (stderr, "Illegal format on Arch-file %s.\n"
730 ,name);
731 break;
732 case 9:
733 fprintf (stderr, "Can't write atr-file %s.\n"
734 ,name);
735 break;
736 case 10:
737 fprintf (stderr, "Can't write mif-file %s.\n"
738 ,name);
739 break;
740 case 11:
741 fprintf (stderr, "Atr-file %s does not have unique time-stamp (please re-compile).\n"
742 ,name);
743 break;
744 default:
745 fprintf (stderr, "System error: No Message specified (%d).\n",
746 errcode);
747 }
748 exit (TRUE);
749 }
750