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