1: # include <errors.h> 2: /* 3: ** YYERROR -- the routine which error routine yacc calls 4: ** 5: ** Version: 6: ** @(#)yyerror.y 8.2 2/6/85 7: */ 8: 9: yyerror(errmessage) 10: char *errmessage; 11: { 12: # ifdef xPTR1 13: tTfp(60, 6, "yyerror: an error from yacc itself\n"); 14: # endif 15: 16: if (sequal(errmessage, "syntax error")) 17: par_error(SYMERR, WARN, 0); 18: else 19: par_error(YOVRFLOW, WARN, 0); 20: } 21: 22: /* 23: ** PAR_ERROR -- the error routine for the parser 24: ** 25: ** Par_error sends its arguments to print_error(), the front-end 26: ** error processor. If result = FATAL then reset() is called, 27: ** otherwise, the error is assumed to be recoverable, and parsing 28: ** continues. 29: ** 30: ** Parameters: 31: ** num -- the number of the error (2000 - 2999). 32: ** result -- if = FATAL then reset, otherwise return. 33: ** a, b, c -- arbitrary arguments to the error routine. 34: ** 35: ** Returns: 36: ** if result is not FATAL 37: ** 38: ** Requires: 39: ** print_error() -- of the monitor 40: ** 41: ** Called By: 42: ** parser routines 43: ** scanner routines 44: ** 45: ** Written: 46: ** 1979 (jiw) 47: ** 13 feb 1980 modified for monpar (jiw) 48: */ 49: 50: par_error(num, result, a, b, c) 51: int num; 52: int result; 53: char *a, *b, *c; 54: { 55: char buff[30]; 56: register char *buf; 57: 58: extern short yyerrflag; 59: extern int Err_current; 60: extern int Err_fnd; 61: extern int Opflag; 62: extern int yyline; 63: 64: resetp(); 65: 66: buf = buff; 67: 68: # ifdef xPTR1 69: tTfp(60, 7, "par_error: %d, (fatal = %d), a, b, c.\n", num, result, a, b, c); 70: # endif 71: 72: yyerrflag = 3; /* tell yyparse that an error has been found */ 73: 74: /* 75: ** if Err_current is true at this point, 76: ** it is the second error found in the statement. 77: ** Thus for the simple error recovery currently 78: ** used no other message should be printed. 79: */ 80: 81: if (Err_current) 82: { 83: if (result != FATAL) 84: return; 85: else 86: { 87: # ifdef xPTR1 88: tTfp(60, 9, "par_error: a non recoverable error\n"); 89: # endif 90: 91: endgo(); 92: 93: error(0); 94: } 95: } 96: 97: # ifdef xPTR1 98: tTfp(60, 8, "par_error: first error.\n"); 99: # endif 100: 101: Err_fnd += 1; /* check syntax of remainder */ 102: Err_current = 1; /* error was found in this statement */ 103: 104: if (num == SYMERR || num == NXTCMDERR) 105: { 106: /* syntax error */ 107: a = buf; 108: b = 0; 109: switch (Lastok.toktyp) 110: { 111: case I2CONST: 112: itoa(*(short *)Lastok.tok, buf); 113: break; 114: 115: case I4CONST: 116: smove(locv(*(long *)Lastok.tok), buf); 117: break; 118: 119: case F4CONST: 120: ftoa(*(float *)Lastok.tok, buf, 10, 3, 'n'); 121: break; 122: 123: case F8CONST: 124: ftoa(*(double *)Lastok.tok, buf, 10, 3, 'n'); 125: break; 126: 127: case SCONST: 128: smove(Lastok.tok, buf); 129: break; 130: 131: case 0: 132: a = "EOF"; 133: break; 134: 135: default: 136: syserr("bad Lastok format"); 137: } 138: num += Opflag; /* choosing correct error */ 139: } 140: 141: if (result != FATAL) 142: error(num, iocv(yyline), a, b, c, 0); 143: else 144: { 145: # ifdef xPTR1 146: tTfp(60, 9, "par_error: a non recoverable error\n"); 147: # endif 148: 149: error(num, iocv(yyline), a, b, c, 0); 150: } 151: } 152: neederr(errnum) 153: int errnum; 154: { 155: par_error(errnum, WARN, 0); 156: }