Annotation of 43BSDTahoe/ucb/pascal/src/yypanic.c, revision 1.1.1.1

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

unix.superglobalmegacorp.com

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