PWB1/sys/source/s2/yacc.d/yaccepar


define YYWRITE	= 6
	
	yydebu = yyargu
	yystat = 0
	yychar = -1
	yynerr = 0
	yyerrf = 0
	yypv   = 0

# Put a state and value onto the stack.

yystack:
	debug if( yydebu ~= 0 )
		write( YYWRITE, "  state ", yystat:i(6),
			  "  value ", yyval: i(6),
			  "  char  ", yychar:i(6),
			  "  level ", yypv:  i(3) )

	yypv += 1
	yys(yypv)   = yystat
	yyvalv(yypv) = yyval

# Enter a new state without stacking.

yynewstate:

	yyn = yypact(yystat+1)

	if( yyn <= -1000 ) goto yydefault	
	
	if( yychar < 0 ) yychar = yylex(yylval)
	
	debug if( yydebu > 1 )
		write( YYWRITE, "  n     ", yyn:   i(6),
			  "  char  ", yychar:i(6) )

	if( (yyn += yychar) < 0 || yyn >= YYLAST ) goto yydefault

	if( yychk( (yyn = yyact(yyn+1)) + 1 ) == yychar ) {
		yychar = -1
		yyval  = yylval
		yystat = yyn
		if( yyerrf > 0 ) yyerrf -= 1
		goto yystack
		}
	
# Default action for a state.

yydefault:
	
	debug if( yydebu > 1 )
		write( YYWRITE, "  default", yyn:i(5) )

	yyn = yydef(yystat+1)

	if( yyn == -2 ) {
		if( yychar < 0 ) yychar = yylex(yylval)
		yyn = yyexcp( yystat, yychar )
		}

	if( yyn == -1 ) return( 0 )

	if( yyn ==  0 ) {

		switch( yyerrf ) {

		case 0:	# Brand new error.

			write( YYWRITE, "  syntax error" )
		yyerrlab:
			yynerr += 1

		case 1:	# Incompletely recovered error,
		case 2:	# try again.

			yyerrf = 3
	
			# find a state where error is a legal shift
	
			while( yypv >= 1 ) {
				yyn = yypact(yys(yypv)+1) + YYERRCODE
				if( yyn >= 0 & yyn < YYLAST ) {
					yyn = yyact(yyn+1)
					if( yychk(yyn+1) == YYERRCODE ) {
						yystat = yyn
						goto yystack
						}
					}
	
				debug if( yydebu ~= 0 & yypv >= 2 )
					write( YYWRITE, "  error recovery pops ",
						  yys(yypv):i(4),
						  "  uncovers ", yys(yypv-1) )
	
				yypv -= 1
				}
	
			return( 1 )

		case 3:	# No shift yet, discard input.

			debug if( yydebu ~= 0 )
				write( YYWRITE, "  error recovery discards char ",
					  yychar:i(5) )
		
			if( yychar == -1 ) return( 1 )
		
			yychar = -1
			goto yynewstate

			}

		}

	debug if( yydebu ~= 0 )
		write( YYWRITE, "  reduce ", yyn:i(5) )

	yypvt = yypv
	yym = yyn
	yypv = yypv - yyr2(yyn+1)
	yyval = yyvalv(yypv+1)

	debug if( yydebu > 2 )
		write( YYWRITE, "  reduce uncovers ", yys(yypv):i(4),
			  "  level ", yypv :i(3),
			  "  val   ", yyval:i(6) )
	yyn = yyr1(yyn+1)
	yyj = yypgo(yyn+1) + yys(yypv) + 2
	if( yyj > YYLAST || yychk( (yystat = yyact(yyj)) + 1 ) ~= -yyn )
		yystat = yyact( (yypgo(yyn+1) + 1) )

	switch(yym){
	$A
	}
	goto yystack

	
	end