1 /* 2 * Copyright (c) 1980 Regents of the University of California. 3 * All rights reserved. The Berkeley software License Agreement 4 * specifies the terms and conditions for redistribution. 5 */ 6 7 #ifndef lint 8 static char sccsid[] = "@(#)yyerror.c 5.2 (Berkeley) 05/06/86"; 9 #endif not lint 10 11 #include "whoami.h" 12 #include "0.h" 13 #include "tree_ty.h" /* must be included for yy.h */ 14 #include "yy.h" 15 16 /* 17 * Yerror prints an error 18 * message and then returns 19 * NIL for the tree if needed. 20 * The error is flagged on the 21 * current line which is printed 22 * if the listing is turned off. 23 #ifdef PXP 24 * 25 * As is obvious from the fooling around 26 * with fout below, the Pascal system should 27 * be changed to use the new library "lS". 28 #endif 29 */ 30 /*VARARGS*/ 31 yerror(s, a1, a2, a3, a4, a5) 32 char *s; 33 char *a1, *a2, *a3, *a4, *a5; 34 { 35 #ifdef PI 36 char buf[256]; 37 #endif 38 register int i; 39 static yySerrs; 40 #ifdef PXP 41 int ofout; 42 #endif 43 44 if (errpfx == 'w' && opt('w') != 0) { 45 errpfx = 'E'; 46 return; 47 } 48 /* no continuations allowed here */ 49 if (errpfx == ' ') 50 errpfx = 'E'; 51 #ifdef PXP 52 flush(); 53 ofout = fout[0]; 54 fout[0] = errout; 55 #endif 56 yyResume = 0; 57 #ifdef PI 58 geterr((int) s, buf); 59 s = buf; 60 #endif 61 yysync(); 62 pchr(errpfx); 63 pchr(' '); 64 for (i = 3; i < yyecol; i++) 65 pchr('-'); 66 printf("^--- "); 67 /* 68 if (yyecol > 60) 69 printf("\n\t"); 70 */ 71 printf(s, a1, a2, a3, a4, a5); 72 pchr('\n'); 73 if (errpfx == 'E') 74 #ifdef PI 75 eflg = TRUE, codeoff(); 76 #endif 77 #ifdef PXP 78 eflg = TRUE; 79 #endif 80 errpfx = 'E'; 81 yySerrs++; 82 if (yySerrs >= MAXSYNERR) { 83 yySerrs = 0; 84 yerror("Too many syntax errors - QUIT"); 85 pexit(ERRS); 86 } 87 #ifdef PXP 88 flush(); 89 fout[0] = ofout; 90 return (0); 91 #endif 92 } 93 94 /* 95 * A bracketing error message 96 */ 97 brerror(where, what) 98 int where; 99 char *what; 100 { 101 102 if (where == 0) { 103 line = yyeline; 104 setpfx(' '); 105 error("End matched %s on line %d", what, (char *) where); 106 return; 107 } 108 if (where < 0) 109 where = -where; 110 yerror("Inserted keyword end matching %s on line %d", what, (char *) where); 111 } 112