|
|
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: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.