# 2.11BSD#431 - /usr/src/ucb/pascal/pxp/yypanic.c

##### Functions

    yyPerror          X

##### Variables

    oldpos            X

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

#### Defined functions

yyPerror defined in line 36; used 10 times

- in /usr/src/ucb/pascal/pxp/pas.y line 135, 164, 215, 237, 259, 439, 467, 528, 617, 635

#### Defined variables

oldpos defined in line 18; used 3 times

- in line 42(2), 136

Last modified: 1981-07-10 Generated: 2016-12-26 | Generated by src2html V0.67 page hit count: 613 |