|
|
1.1 root 1: /* Copyright (c) 1979 Regents of the University of California */
2:
3: static char sccsid[] = "@(#)yypanic.c 1.3 3/29/82";
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: if (kind == PDECL) {
46: /*
47: * we have paniced to end of file
48: * during declarations. Separately
49: * compiled segments can syntactically
50: * exit without any error message, so
51: * we force one here.
52: */
53: yerror(cp);
54: continuation();
55: yyunexeof();
56: }
57: goto quiet;
58: case ';':
59: if (kind == PPROG)
60: continue;
61: if (kind == PDECL)
62: yychar = yylex();
63: goto resume;
64: case YEND:
65: if (kind == PPROG)
66: continue;
67: case YPROCEDURE:
68: case YFUNCTION:
69: goto resume;
70: case YLABEL:
71: case YTYPE:
72: case YCONST:
73: case YVAR:
74: if (kind == PSTAT) {
75: yerror("Declaration found when statement expected");
76: goto quiet;
77: }
78: case YBEGIN:
79: goto resume;
80: case YFOR:
81: case YREPEAT:
82: case YWHILE:
83: case YGOTO:
84: case YIF:
85: if (kind != PDECL)
86: goto resume;
87: yerror("Expected keyword begin after declarations, before statements");
88: unyylex(&Y);
89: yychar = YBEGIN;
90: yylval = nullsem(YBEGIN);
91: goto quiet;
92: case YTHEN:
93: case YELSE:
94: case YDO:
95: if (kind == PSTAT) {
96: yychar = yylex();
97: goto resume;
98: }
99: if (kind == PEXPR)
100: goto resume;
101: continue;
102: case ')':
103: case ']':
104: if (kind != PEXPR)
105: continue;
106: if (brlev == 0)
107: goto resume;
108: if (brlev > 0)
109: brlev--;
110: continue;
111: case '(':
112: case '[':
113: brlev++;
114: continue;
115: case ',':
116: if (brlev != 0)
117: continue;
118: case YOF:
119: case YTO:
120: case YDOWNTO:
121: if (kind == PEXPR)
122: goto resume;
123: continue;
124: #ifdef PI
125: /*
126: * A rough approximation for now
127: * Should be much more lenient on suppressing
128: * warnings.
129: */
130: case YID:
131: syneflg = TRUE;
132: continue;
133: #endif
134: }
135: resume:
136: if (yyOshifts >= 2) {
137: if (yychar != -1)
138: unyylex(&Y);
139: copy(&Y, &oldpos, sizeof Y);
140: yerror(cp);
141: yychar = yylex();
142: }
143: quiet:
144: if (yyshifts - ishifts > 2 && opt('r')) {
145: setpfx('r');
146: yerror("Parsing resumes");
147: }
148: /*
149: * If we paniced in the statement part,
150: * and didn't stop at a ';', then we insert
151: * a ';' to prevent the recovery from immediately
152: * inserting one and complaining about it.
153: */
154: if (kind == PSTAT && yychar != ';') {
155: unyylex(&Y);
156: yyshifts--;
157: yytshifts--;
158: yychar = ';';
159: yylval = nullsem(';');
160: }
161: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.