|
|
1.1 ! root 1: #ifndef lint ! 2: static char sccsid[] = "@(#)yyerror.c 1.1 86/02/03 Copyr 1984 Sun Micro"; ! 3: #endif ! 4: ! 5: /* ! 6: * Copyright (c) 1984 by Sun Microsystems, Inc. ! 7: */ ! 8: ! 9: #include "cpass1.h" ! 10: #include <ctype.h> ! 11: ! 12: /* ! 13: * printnames for yacc tokens ! 14: */ ! 15: ! 16: extern int tokebufptr; ! 17: extern char tokebufr[]; ! 18: #define MAXTOKELENGTH 20 /* don't care past here */ ! 19: ! 20: struct pname { ! 21: int pval; ! 22: char * name; ! 23: enum { NOPRINT, VALPRINT, FVALPRINT, NAMEPRINT, STRINGPRINT, ! 24: ASGPRINT,RELPRINT, EQLPRINT, DIVPRINT, INCRPRINT, UNIPRINT, ! 25: STRPRINT,SHIFTPRINT, TYPEPRINT, CLASSPRINT, STRUCTPRINT, ! 26: WORDPRINT, SYMPRINT } howprint; ! 27: } pname[] = { ! 28: 0, "<nothing>",NOPRINT, ! 29: ERROR, "<nothing>",NOPRINT, ! 30: NAME, "<name>", NAMEPRINT, ! 31: STRING, "<string>", STRINGPRINT, ! 32: ICON, "<constant>",VALPRINT, ! 33: FCON, "<fconstant>", FVALPRINT, ! 34: PLUS, "+", SYMPRINT, ! 35: ASG PLUS, "+=", SYMPRINT, ! 36: MINUS, "-", SYMPRINT, ! 37: ASG MINUS, "-=", SYMPRINT, ! 38: UNARY MINUS,"-", SYMPRINT, ! 39: MUL, "*", SYMPRINT, ! 40: ASG MUL, "*=", SYMPRINT, ! 41: UNARY MUL, "*", SYMPRINT, ! 42: AND, "&", SYMPRINT, ! 43: ASG AND, "&=", SYMPRINT, ! 44: UNARY AND, "&", SYMPRINT, ! 45: OR, "|", SYMPRINT, ! 46: ASG OR, "|=", SYMPRINT, ! 47: ER, "^", SYMPRINT, ! 48: ASG ER, "^=", SYMPRINT, ! 49: QUEST, "?", SYMPRINT, ! 50: COLON, ":", SYMPRINT, ! 51: ANDAND, "&&", SYMPRINT, ! 52: OROR, "||", SYMPRINT, ! 53: 25, "=op", ASGPRINT, ! 54: 26, "relop",RELPRINT, ! 55: 27, "==", EQLPRINT, ! 56: 28, "/", DIVPRINT, ! 57: 29, "<<", SYMPRINT, ! 58: 30, "++", INCRPRINT, ! 59: 31, "!", UNIPRINT, ! 60: 32, "->", STRPRINT, ! 61: TYPE, "type", TYPEPRINT, ! 62: CLASS, "extern",CLASSPRINT, ! 63: STRUCT, "struct",STRUCTPRINT, ! 64: RETURN, "return",WORDPRINT, ! 65: GOTO, "goto", WORDPRINT, ! 66: IF, "if", WORDPRINT, ! 67: ELSE, "else", WORDPRINT, ! 68: SWITCH, "switch",WORDPRINT, ! 69: BREAK, "break",WORDPRINT, ! 70: CONTINUE, "continue",WORDPRINT, ! 71: WHILE, "while",WORDPRINT, ! 72: DO, "do", WORDPRINT, ! 73: FOR, "for", WORDPRINT, ! 74: DEFAULT, "default",WORDPRINT, ! 75: CASE, "case", WORDPRINT, ! 76: SIZEOF, "sizeof",WORDPRINT, ! 77: ENUM, "enum", WORDPRINT, ! 78: LP, "(", SYMPRINT, ! 79: RP, ")", SYMPRINT, ! 80: LC, "{", SYMPRINT, ! 81: RC, "}", SYMPRINT, ! 82: LB, "[", SYMPRINT, ! 83: RB, "]", SYMPRINT, ! 84: CM, ",", SYMPRINT, ! 85: SM, ";", SYMPRINT, ! 86: ASSIGN, "=", SYMPRINT, ! 87: ASM, "asm", WORDPRINT, ! 88: 0, 0, NOPRINT, ! 89: }; ! 90: ! 91: static struct pname * ! 92: plookup( n ) ! 93: register n; ! 94: { ! 95: register struct pname *p; ! 96: p = pname; ! 97: while ( p->name != 0 ){ ! 98: if ( p->pval == n ) return p; ! 99: p++; ! 100: } ! 101: return 0; ! 102: } ! 103: ! 104: ccerror( s, c ) char *s; int c; ! 105: { /* error printing routine in parser */ ! 106: static char mungbuffer[300]; ! 107: static char word[] = "word", symbol[] = "symbol"; ! 108: char *printname; ! 109: char *noun; ! 110: char *q = "\""; ! 111: struct pname *p; ! 112: extern char yytext[]; ! 113: int i,mt; ! 114: char token[MAXTOKELENGTH+10], *thischar; ! 115: ! 116: p = plookup( c ); ! 117: if (p == 0 || p->howprint==NOPRINT){ ! 118: uerror( s ); ! 119: } else { ! 120: printname = p->name; ! 121: switch(p->howprint){ ! 122: case WORDPRINT: ! 123: noun = word; ! 124: break; ! 125: case TYPEPRINT: ! 126: /* this is hard */ ! 127: noun = "type word"; ! 128: printname = yytext; ! 129: break; ! 130: case CLASSPRINT: ! 131: noun = word; ! 132: switch(yylval.intval){ ! 133: case AUTO: ! 134: printname = "auto"; break; ! 135: case EXTERN: ! 136: printname = "extern"; break; ! 137: case FORTRAN: ! 138: printname = "fortran"; break; ! 139: case REGISTER: ! 140: printname = "register"; break; ! 141: case STATIC: ! 142: printname = "static"; break; ! 143: case TYPEDEF: ! 144: printname = "typedef"; break; ! 145: } ! 146: break; ! 147: case STRUCTPRINT: ! 148: noun = word; ! 149: if (yylval.intval==INUNION) ! 150: printname = "union"; ! 151: break; ! 152: case SYMPRINT: ! 153: noun = symbol; ! 154: q = ""; ! 155: break; ! 156: case RELPRINT: ! 157: noun = symbol; ! 158: q = ""; ! 159: switch ( yylval.intval ){ ! 160: case LS: printname = "<"; break; ! 161: case LE: printname = "<="; break; ! 162: case GT: printname = ">"; break; ! 163: case GE: printname = ">="; break; ! 164: } ! 165: break; ! 166: case EQLPRINT: ! 167: noun = symbol; ! 168: q = ""; ! 169: if ( yylval.intval == NE ) ! 170: printname = "!="; ! 171: break; ! 172: case DIVPRINT: ! 173: noun = symbol; ! 174: q = ""; ! 175: if ( yylval.intval == MOD ) ! 176: printname = "%"; ! 177: break; ! 178: case SHIFTPRINT: ! 179: noun = symbol; ! 180: q = ""; ! 181: if ( yylval.intval == RS) ! 182: printname = ">>" ; ! 183: break; ! 184: case INCRPRINT: ! 185: noun = symbol; ! 186: q = ""; ! 187: if ( yylval.intval == DECR ) ! 188: printname = "--"; ! 189: break; ! 190: case UNIPRINT: ! 191: noun = symbol; ! 192: q = ""; ! 193: if ( yylval.intval == COMPL ) ! 194: printname = "~"; ! 195: break; ! 196: case STRPRINT: ! 197: noun = symbol; ! 198: q = ""; ! 199: if ( yylval.intval == DOT ) ! 200: printname = "."; ! 201: break; ! 202: case ASGPRINT: ! 203: noun = symbol; ! 204: q = ""; ! 205: switch ( yylval.intval ){ ! 206: case ASG PLUS: printname = "+="; break; ! 207: case ASG MINUS: printname = "-="; break; ! 208: case ASG MUL: printname = "*="; break; ! 209: case ASG DIV: printname = "/="; break; ! 210: case ASG MOD: printname = "%="; break; ! 211: case ASG AND: printname = "&="; break; ! 212: case ASG OR: printname = "|="; break; ! 213: case ASG ER: printname = "^="; break; ! 214: case ASG LS: printname = "<<="; break; ! 215: case ASG RS: printname = ">>="; break; ! 216: } ! 217: break; ! 218: case NAMEPRINT: ! 219: noun = "variable name"; ! 220: printname = yytext; ! 221: break; ! 222: case STRINGPRINT: ! 223: noun = "string"; ! 224: goto gettoken; ! 225: case VALPRINT: ! 226: case FVALPRINT: ! 227: noun = "constant"; ! 228: gettoken: ! 229: thischar = tokebufr; ! 230: q = ""; ! 231: if (tokebufptr >= MAXTOKELENGTH) ! 232: mt = MAXTOKELENGTH; ! 233: else ! 234: mt = tokebufptr; ! 235: for (i=0; i<=mt; i++){ ! 236: if (isascii(*thischar) && isprint(*thischar)) ! 237: token[i] = *thischar; ! 238: else ! 239: token[i] = '?'; ! 240: thischar ++; ! 241: } ! 242: token[i] = '\0'; ! 243: if (mt < tokebufptr) ! 244: strcat( token, "..."); ! 245: printname = token; ! 246: break; ! 247: default: ! 248: noun = ""; ! 249: break; ! 250: } ! 251: sprintf( mungbuffer, "%s at or near %s %s%s%s", s, noun, q, printname, q); ! 252: uerror( "%s", mungbuffer ); ! 253: } ! 254: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.