|
|
1.1 ! root 1: /* Copyright (c) 1979 Regents of the University of California */ ! 2: # ! 3: /* ! 4: * pi - Pascal interpreter code translator ! 5: * ! 6: * Charles Haley, Bill Joy UCB ! 7: * Version 1.1 February 1978 ! 8: * ! 9: * ! 10: * pxp - Pascal execution profiler ! 11: * ! 12: * Bill Joy UCB ! 13: * Version 1.1 February 1978 ! 14: */ ! 15: ! 16: #include "whoami" ! 17: #include "0.h" ! 18: #include "yy.h" ! 19: ! 20: struct yytok oldpos; ! 21: /* ! 22: * The routine yyPerror coordinates the panic when ! 23: * the correction routines fail. Three types of panics ! 24: * are possible - those in a declaration part, those ! 25: * in a statement part, and those in an expression. ! 26: * ! 27: * Declaration part panics consider insertion of "begin", ! 28: * expression part panics will stop on more symbols. ! 29: * The panics are otherwise the same. ! 30: * ! 31: * ERROR MESSAGE SUPPRESSION STRATEGY: August 11, 1977 ! 32: * ! 33: * If the parser has not made at least 2 moves since the last point of ! 34: * error then we want to suppress the supplied error message. ! 35: * Otherwise we print it. ! 36: * We then skip input up to the next solid symbol. ! 37: */ ! 38: yyPerror(cp, kind) ! 39: char *cp; ! 40: register int kind; ! 41: { ! 42: register int ishifts, brlev; ! 43: ! 44: copy(&oldpos, &Y, sizeof oldpos); ! 45: brlev = 0; ! 46: if (yychar < 0) ! 47: yychar = yylex(); ! 48: for (ishifts = yyshifts; ; yychar = yylex(), yyshifts++) ! 49: switch (yychar) { ! 50: case YILLCH: ! 51: yerror("Illegal character"); ! 52: if (ishifts == yyshifts) ! 53: yyOshifts = 0; ! 54: continue; ! 55: case YEOF: ! 56: goto quiet; ! 57: case ';': ! 58: if (kind == PPROG) ! 59: continue; ! 60: if (kind == PDECL) ! 61: yychar = yylex(); ! 62: goto resume; ! 63: case YEND: ! 64: if (kind == PPROG) ! 65: continue; ! 66: case YPROCEDURE: ! 67: case YFUNCTION: ! 68: goto resume; ! 69: case YLABEL: ! 70: case YTYPE: ! 71: case YCONST: ! 72: case YVAR: ! 73: if (kind == PSTAT) { ! 74: yerror("Declaration found when statement expected"); ! 75: goto quiet; ! 76: } ! 77: case YBEGIN: ! 78: goto resume; ! 79: case YFOR: ! 80: case YREPEAT: ! 81: case YWHILE: ! 82: case YGOTO: ! 83: case YIF: ! 84: if (kind != PDECL) ! 85: goto resume; ! 86: yerror("Expected keyword begin after declarations, before statements"); ! 87: unyylex(&Y); ! 88: yychar = YBEGIN; ! 89: yylval = nullsem(YBEGIN); ! 90: goto quiet; ! 91: case YTHEN: ! 92: case YELSE: ! 93: case YDO: ! 94: if (kind == PSTAT) { ! 95: yychar = yylex(); ! 96: goto resume; ! 97: } ! 98: if (kind == PEXPR) ! 99: goto resume; ! 100: continue; ! 101: case ')': ! 102: case ']': ! 103: if (kind != PEXPR) ! 104: continue; ! 105: if (brlev == 0) ! 106: goto resume; ! 107: if (brlev > 0) ! 108: brlev--; ! 109: continue; ! 110: case '(': ! 111: case '[': ! 112: brlev++; ! 113: continue; ! 114: case ',': ! 115: if (brlev != 0) ! 116: continue; ! 117: case YOF: ! 118: case YTO: ! 119: case YDOWNTO: ! 120: if (kind == PEXPR) ! 121: goto resume; ! 122: continue; ! 123: #ifdef PI ! 124: /* ! 125: * A rough approximation for now ! 126: * Should be much more lenient on suppressing ! 127: * warnings. ! 128: */ ! 129: case YID: ! 130: syneflg++; ! 131: continue; ! 132: #endif ! 133: } ! 134: resume: ! 135: if (yyOshifts >= 2) { ! 136: if (yychar != -1) ! 137: unyylex(&Y); ! 138: copy(&Y, &oldpos, sizeof Y); ! 139: yerror(cp); ! 140: yychar = yylex(); ! 141: } ! 142: quiet: ! 143: if (yyshifts - ishifts > 2 && opt('r')) { ! 144: setpfx('r'); ! 145: yerror("Parsing resumes"); ! 146: } ! 147: /* ! 148: * If we paniced in the statement part, ! 149: * and didn't stop at a ';', then we insert ! 150: * a ';' to prevent the recovery from immediately ! 151: * inserting one and complaining about it. ! 152: */ ! 153: if (kind == PSTAT && yychar != ';') { ! 154: unyylex(&Y); ! 155: yyshifts--; ! 156: yytshifts--; ! 157: yychar = ';'; ! 158: yylval = nullsem(';'); ! 159: } ! 160: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.