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