Annotation of 3BSD/cmd/pi/yypanic.c, revision 1.1.1.1

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: }

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.