|
|
1.1 root 1: # ifdef YYDEBUG
2: # include "y.debug"
3: # endif
4:
5: # define YYFLAG -1000
6: # define YYERROR goto yyerrlab
7: # define YYACCEPT return(0)
8: # define YYABORT return(1)
9:
10: /* parser for yacc output */
11:
12: #ifdef YYDEBUG
13: int yydebug = 0; /* 1 for debugging */
14: #endif
15: YYSTYPE yyv[YYMAXDEPTH]; /* where the values are stored */
16: int yychar = -1; /* current input token number */
17: int yynerrs = 0; /* number of errors */
18: short yyerrflag = 0; /* error recovery flag */
19:
20: yyparse()
21: { short yys[YYMAXDEPTH];
22: int yyj, yym;
23: register YYSTYPE *yypvt;
24: register int yystate, yyn;
25: register short *yyps;
26: register YYSTYPE *yypv;
27: register short *yyxi;
28:
29: yystate = 0;
30: yychar = -1;
31: yynerrs = 0;
32: yyerrflag = 0;
33: yyps= &yys[-1];
34: yypv= &yyv[-1];
35:
36: yystack: /* put a state and value onto the stack */
37: #ifdef YYDEBUG
38: if(yydebug >= 3)
39: if(yychar < 0 || yytoknames[yychar] == 0)
40: printf("char %d in %s", yychar, yystates[yystate]);
41: else
42: printf("%s in %s", yytoknames[yychar], yystates[yystate]);
43: #endif
44: if( ++yyps >= &yys[YYMAXDEPTH] ) {
45: yyerror( "yacc stack overflow" );
46: return(1);
47: }
48: *yyps = yystate;
49: ++yypv;
50: *yypv = yyval;
51: yynewstate:
52: yyn = yypact[yystate];
53: if(yyn <= YYFLAG) goto yydefault; /* simple state */
54: if(yychar<0) {
55: yychar = yylex();
56: #ifdef YYDEBUG
57: if(yydebug >= 2) {
58: if(yychar <= 0)
59: printf("lex EOF\n");
60: else if(yytoknames[yychar])
61: printf("lex %s\n", yytoknames[yychar]);
62: else
63: printf("lex (%c)\n", yychar);
64: }
65: #endif
66: if(yychar < 0)
67: yychar = 0;
68: }
69: if((yyn += yychar) < 0 || yyn >= YYLAST)
70: goto yydefault;
71: if( yychk[ yyn=yyact[ yyn ] ] == yychar ){ /* valid shift */
72: yychar = -1;
73: yyval = yylval;
74: yystate = yyn;
75: if( yyerrflag > 0 ) --yyerrflag;
76: goto yystack;
77: }
78: yydefault:
79: /* default state action */
80: if( (yyn=yydef[yystate]) == -2 ) {
81: if(yychar < 0) {
82: yychar = yylex();
83: #ifdef YYDEBUG
84: if(yydebug >= 2)
85: if(yychar < 0)
86: printf("lex EOF\n");
87: else
88: printf("lex %s\n", yytoknames[yychar]);
89: #endif
90: if(yychar < 0)
91: yychar = 0;
92: }
93: /* look through exception table */
94: for(yyxi=yyexca; (*yyxi!= (-1)) || (yyxi[1]!=yystate);
95: yyxi += 2 ) ; /* VOID */
96: while( *(yyxi+=2) >= 0 ){
97: if( *yyxi == yychar ) break;
98: }
99: if( (yyn = yyxi[1]) < 0 ) return(0); /* accept */
100: }
101: if( yyn == 0 ){ /* error */
102: /* error ... attempt to resume parsing */
103: switch( yyerrflag ){
104: case 0: /* brand new error */
105: #ifdef YYDEBUG
106: yyerror("syntax error\n%s", yystates[yystate]);
107: if(yytoknames[yychar])
108: yyerror("saw %s\n", yytoknames[yychar]);
109: else if(yychar >= ' ' && yychar < '\177')
110: yyerror("saw `%c'\n", yychar);
111: else if(yychar == 0)
112: yyerror("saw EOF\n");
113: else
114: yyerror("saw char 0%o\n", yychar);
115: #else
116: yyerror( "syntax error" );
117: #endif
118: yyerrlab:
119: ++yynerrs;
120: case 1:
121: case 2: /* incompletely recovered error ... try again */
122: yyerrflag = 3;
123: /* find a state where "error" is a legal shift action */
124: while ( yyps >= yys ) {
125: yyn = yypact[*yyps] + YYERRCODE;
126: if( yyn>= 0 && yyn < YYLAST && yychk[yyact[yyn]] == YYERRCODE ){
127: yystate = yyact[yyn]; /* simulate a shift of "error" */
128: goto yystack;
129: }
130: yyn = yypact[*yyps];
131: /* the current yyps has no shift onn "error", pop stack */
132: #ifdef YYDEBUG
133: if( yydebug ) printf( "error recovery pops state %d, uncovers %d\n", *yyps, yyps[-1] );
134: #endif
135: --yyps;
136: --yypv;
137: }
138: /* there is no state on the stack with an error shift ... abort */
139: yyabort:
140: return(1);
141: case 3: /* no shift yet; clobber input char */
142: #ifdef YYDEBUG
143: if( yydebug ) {
144: printf("error recovery discards ");
145: if(yytoknames[yychar])
146: printf("%s\n", yytoknames[yychar]);
147: else if(yychar >= ' ' && yychar < '\177')
148: printf("`%c'\n", yychar);
149: else if(yychar == 0)
150: printf("EOF\n");
151: else
152: printf("char 0%o\n", yychar);
153: }
154: #endif
155: if( yychar == 0 ) goto yyabort; /* don't discard EOF, quit */
156: yychar = -1;
157: goto yynewstate; /* try again in the same state */
158: }
159: }
160: /* reduction by production yyn */
161: #ifdef YYDEBUG
162: if(yydebug) { char *s;
163: printf("reduce %d in:\n\t", yyn);
164: for(s = yystates[yystate]; *s; s++) {
165: putchar(*s);
166: if(*s == '\n' && *(s+1))
167: putchar('\t');
168: }
169: }
170: #endif
171: yyps -= yyr2[yyn];
172: yypvt = yypv;
173: yypv -= yyr2[yyn];
174: yyval = yypv[1];
175: yym=yyn;
176: /* consult goto table to find next state */
177: yyn = yyr1[yyn];
178: yyj = yypgo[yyn] + *yyps + 1;
179: if( yyj>=YYLAST || yychk[ yystate = yyact[yyj] ] != -yyn ) yystate = yyact[yypgo[yyn]];
180: switch(yym){
181: $A
182: }
183: goto yystack; /* stack new state and value */
184: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.