1: /* 2: * Routines for producing error messages. 3: */ 4: 5: #include "itran.h" 6: #include "token.h" 7: #include "tree.h" 8: #include "lex.h" 9: 10: struct errmsg { 11: int e_state; /* parser state number */ 12: char *e_mesg; /* message text */ 13: } errtab[] = { 14: #include "synerr.h" 15: -1, "syntax error" 16: }; 17: 18: /* 19: * yyerror produces syntax error messages. tok is the offending token 20: * (yychar), lval is yylval, and state is the parser's state. 21: * 22: * errtab is searched for the state, if it is found, the associated 23: * message is produced; if the state isn't found, "syntax error" 24: * is produced. 25: */ 26: yyerror(tok, lval, state) 27: int tok, state; 28: nodeptr lval; 29: { 30: register struct errmsg *p; 31: char *mapterm(); 32: 33: if (*filep) 34: fprintf(stderr, "%s, ", *filep); 35: if (tok == EOFX) /* special case end of file */ 36: fprintf(stderr, "unexpected end of file\n"); 37: else { 38: fprintf(stderr, "line %d: ", LINE(lval)); 39: if (COL(lval)) 40: fprintf(stderr, "\"%s\": ", mapterm(tok,lval)); 41: for (p = errtab; p->e_state != state && p->e_state >= 0; p++) ; 42: fprintf(stderr, "%s\n", p->e_mesg); 43: } 44: fatalerrs++; 45: nocode++; 46: } 47: /* 48: * err produces the error messages s1 and s2 (if non-null). The 49: * current line number is found in tline. 50: */ 51: err(s1, s2) 52: char *s1, *s2; 53: { 54: if (*filep) 55: fprintf(stderr, "%s, ", *filep); 56: fprintf(stderr, "line %d: ", tline); 57: if (s2) 58: fprintf(stderr, "\"%s\": ", s2); 59: fprintf(stderr, "%s\n", s1); 60: fatalerrs++; 61: nocode++; 62: } 63: 64: /* 65: * lerr produces the error message s and associates it with line l. 66: */ 67: lerr(l, s) 68: int l; 69: char *s; 70: { 71: if (*filep) 72: fprintf(stderr, "%s, ", *filep); 73: fprintf(stderr, "line %d: ", l); 74: fprintf(stderr, "%s\n", s); 75: fatalerrs++; 76: nocode++; 77: } 78: 79: /* 80: * warn produces s1 and s2 (if non-null) as warning messages. The current 81: * line is in tline. 82: */ 83: warn(s1, s2) 84: char *s1, *s2; 85: { 86: if (*filep) 87: fprintf(stderr, "%s, ", *filep); 88: fprintf(stderr, "line %d: ", tline); 89: if (s2) 90: fprintf(stderr, "\"%s\": ", s2); 91: fprintf(stderr, "%s\n", s1); 92: warnings++; 93: } 94: 95: /* 96: * syserr is called for fatal errors. The message s is produced and the 97: * translator exits. 98: */ 99: syserr(s) 100: char *s; 101: { 102: if (*filep) 103: fprintf(stderr, "%s, ", *filep); 104: fprintf(stderr, "line %d: %s\n", inline, s); 105: exit(1); 106: } 107: 108: /* 109: * mapterm finds a printable string for the given token type 110: * and value. 111: */ 112: char *mapterm(typ,val) 113: int typ; 114: nodeptr val; 115: { 116: register struct toktab *t; 117: register i; 118: 119: i = typ; 120: if (i == IDENT || i == INTLIT || i == REALLIT || i == STRINGLIT || i == CSETLIT) 121: return (STR0(val)); 122: for (t = toktab; t->t_type != i; t++) 123: if (t->t_type == 0) 124: return ("???"); 125: return (t->t_word); 126: }