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.1 (Berkeley) 06/05/85"; 9 #endif not lint 10 11 /* 12 * pi - Pascal interpreter code translator 13 * 14 * Charles Haley, Bill Joy UCB 15 * Version 1.2 January 1979 16 * 17 * 18 * pxp - Pascal execution profiler 19 * 20 * Bill Joy UCB 21 * Version 1.2 January 1979 22 */ 23 24 #include "whoami.h" 25 #include "0.h" 26 #include "yy.h" 27 28 /* 29 * Yerror prints an error 30 * message and then returns 31 * NIL for the tree if needed. 32 * The error is flagged on the 33 * current line which is printed 34 * if the listing is turned off. 35 #ifdef PXP 36 * 37 * As is obvious from the fooling around 38 * with fout below, the Pascal system should 39 * be changed to use the new library "lS". 40 #endif 41 */ 42 yerror(s, a1, a2, a3, a4, a5) 43 char *s; 44 { 45 #ifdef PI 46 char buf[256]; 47 #endif 48 register int i, j; 49 static yySerrs; 50 #ifdef PXP 51 /* 52 int ofout; 53 */ 54 #endif 55 56 if (errpfx == 'w' && opt('w') != 0) 57 return; 58 #ifdef PXP 59 /* 60 flush(); 61 ofout = fout[0]; 62 fout[0] = errout; 63 */ 64 #endif 65 yyResume = 0; 66 #ifdef PI 67 geterr(s, buf); 68 s = buf; 69 #endif 70 yysync(); 71 putc(errpfx, stderr); 72 putc(' ', stderr); 73 for (i = 3; i < yyecol; i++) 74 putc('-', stderr); 75 fprintf(stderr, "^--- "); 76 /* 77 if (yyecol > 60) 78 printf("\n\t"); 79 */ 80 fprintf(stderr, s, a1, a2, a3, a4, a5); 81 putc('\n', stderr); 82 if (errpfx == 'E') 83 #ifdef PI 84 eflg++, cgenflg++; 85 #endif 86 #ifdef PXP 87 eflg++; 88 #endif 89 errpfx = 'E'; 90 yySerrs++; 91 if (yySerrs >= MAXSYNERR) { 92 yySerrs = 0; 93 yerror("Too many syntax errors - QUIT"); 94 pexit(ERRS); 95 } 96 #ifdef PXP 97 /* 98 flush(); 99 fout[0] = ofout; 100 */ 101 return (0); 102 #endif 103 } 104 105 /* 106 * A bracketing error message 107 */ 108 brerror(where, what) 109 int where; 110 char *what; 111 { 112 113 if (where == 0) { 114 line = yyeline; 115 setpfx(' '); 116 error("End matched %s on line %d", what, where); 117 return; 118 } 119 if (where < 0) 120 where = -where; 121 yerror("Inserted keyword end matching %s on line %d", what, where); 122 } 123