Add original unix v6
This commit is contained in:
@@ -0,0 +1,125 @@
|
||||
# define _maxdepth 150
|
||||
|
||||
/* parser for yacc output */
|
||||
extern int yyval; /* defined in the table file */
|
||||
extern int yylval; /* defined in the table file */
|
||||
extern int *yypv; /* defined in the table file */
|
||||
|
||||
|
||||
int yydebug 0; /* 1 for debugging */
|
||||
int yyv[_maxdepth]; /* where the values are stored */
|
||||
int yystate 0; /* current parser state */
|
||||
int yychar -1; /* current input token number */
|
||||
int yynerrs 0; /* number of errors */
|
||||
int yyerrflag 0; /* error recovery flag */
|
||||
|
||||
|
||||
yyparse() {
|
||||
|
||||
extern int yygo[], yypgo[], yyr1[], yyr2[], yyact[], yypact[];
|
||||
auto int *ps, s[_maxdepth];
|
||||
auto int ac, n, *p;
|
||||
|
||||
yystate = 0;
|
||||
yychar = -1;
|
||||
yynerrs = 0;
|
||||
yyerrflag = 0;
|
||||
ps= &s[0]-1;
|
||||
yypv= &yyv[0]-1;
|
||||
|
||||
stack: /* put a state and value onto the stack */
|
||||
|
||||
if( yydebug ) printf( "state %d, value %d, char %d\n",yystate,yyval,yychar );
|
||||
*++ps = yystate;
|
||||
*++yypv = yyval;
|
||||
|
||||
newstate: /* set ap to point to the parsing actions for the new state */
|
||||
|
||||
p = &yyact[ yypact[yystate+1] ];
|
||||
|
||||
actn: /* get the next action, and perform it */
|
||||
|
||||
n = ( ac = *p++ ) & 07777; /* n is the "address" of the action */
|
||||
|
||||
switch( ac>>12 ) { /* switch on operation */
|
||||
|
||||
case 1: /* skip on test */
|
||||
if( yydebug && (yychar<0) ){
|
||||
yychar = yylex();
|
||||
printf( "character %d read\n", yychar );
|
||||
}
|
||||
if( n != ( (yychar<0) ? ( yychar=yylex() ) : yychar ) ) ++p;
|
||||
goto actn; /* get next action */
|
||||
|
||||
case 2: /* shift */
|
||||
|
||||
yystate=n;
|
||||
yyval=yylval;
|
||||
yychar= -1;
|
||||
if( yyerrflag ) --yyerrflag;
|
||||
goto stack; /* stack new state */
|
||||
|
||||
case 3: /* reduce */
|
||||
|
||||
if( yydebug ) printf("reduce %d\n",n);
|
||||
ps =- yyr2[n];
|
||||
yypv =- yyr2[n];
|
||||
yyval=yypv[1];
|
||||
yyactr(n);
|
||||
/* consult goto table to find next state */
|
||||
for( p= &yygo[yypgo[yyr1[n]]]; *p != *ps && *p >= 0 ; p =+ 2 ) ;
|
||||
yystate = p[1];
|
||||
goto stack; /* stack new state and value */
|
||||
|
||||
case 4: /* accept */
|
||||
return(0);
|
||||
|
||||
case 0: /* error ... attempt to resume parsing */
|
||||
|
||||
switch( yyerrflag ){
|
||||
|
||||
case 0: /* brand new error */
|
||||
|
||||
++yynerrs;
|
||||
yyerror( "syntax error" );
|
||||
|
||||
case 1:
|
||||
case 2: /* incompletely recovered error ... try again */
|
||||
|
||||
yyerrflag = 3;
|
||||
|
||||
/* find a state where "error" is a legal shift action */
|
||||
|
||||
while ( ps >= s ) {
|
||||
for( p= &yyact[ yypact[*ps+1] ] ; (*p>>12) == 1 ; p =+ 2 ) /* search ps actions */
|
||||
if( *p == 4352 ) goto found;
|
||||
|
||||
/* the current ps has no shift onn "error", pop stack */
|
||||
|
||||
if( yydebug ) printf( "error recovery pops state %d, uncovers %d\n", *ps, ps[-1] );
|
||||
--ps;
|
||||
--yypv;
|
||||
}
|
||||
|
||||
/* there is no state on the stack with an error shift ... abort */
|
||||
|
||||
abort:
|
||||
return(1);
|
||||
|
||||
found: /* we have a state with a shift on "error", resume parsing */
|
||||
|
||||
yystate = p[1] & 07777;
|
||||
goto stack;
|
||||
|
||||
case 3: /* no shift yet; clobber input char */
|
||||
|
||||
if( yydebug ) printf( "error recovery discards char %d\n", yychar );
|
||||
|
||||
if( yychar == 0 ) goto abort; /* don't discard EOF, quit */
|
||||
yychar = -1;
|
||||
goto newstate; /* try again in the same state */
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user