Annotation of 41BSD/cmd/pc0/yypanic.c, revision 1.1.1.1

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

unix.superglobalmegacorp.com

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