⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 yaccpar.c

📁 整理 unix v7 的 ya
💻 C
字号:
#define YYFLAG -1000#define YYERROR goto yyerrlab#define YYACCEPT return(0)#define YYABORT return(1)/* * parser for yacc output */int   yydebug = 0; /* 1 for debugging */YYSTYPE yyv[YYMAXDEPTH]; /* where the values are stored */int   yychar = -1; /* current input token number */int   yynerrs = 0;  /* number of errors */short yyerrflag = 0;  /* error recovery flag */int yyparse(void){	short yys[YYMAXDEPTH];	short yyj, yym;	register YYSTYPE *yypvt;	register short yystate, *yyps, yyn;	register YYSTYPE *yypv;	register short *yyxi;	yystate = 0;	yychar = -1;	yynerrs = 0;	yyerrflag = 0;	yyps= &yys[-1];	yypv= &yyv[-1];yystack:    /* put a state and value onto the stack */	if(yydebug )		printf("state %d, char 0%o\n", yystate, yychar);	if(++yyps> &yys[YYMAXDEPTH]){		yyerror("yacc stack overflow");		return(1);	}	*yyps = yystate;	++yypv;	*yypv = yyval;yynewstate:	yyn = yypact[yystate];	if(yyn<= YYFLAG)		goto yydefault; /* simple state */	if(yychar<0)		if((yychar=yylex())<0)			yychar=0;	if((yyn += yychar)<0 || yyn >= YYLAST)		goto yydefault;	if(yychk[yyn=yyact[yyn]] == yychar){ /* valid shift */		yychar = -1;		yyval = yylval;		yystate = yyn;		if(yyerrflag > 0)			--yyerrflag;		goto yystack;	}yydefault:	/* default state action */	if((yyn=yydef[yystate]) == -2) {		if(yychar<0)			if((yychar=yylex())<0)				yychar = 0;		/* look through exception table */		for(yyxi=yyexca; (*yyxi!= (-1)) || (yyxi[1]!=yystate) ; yyxi += 2) ; /* VOID */		while(*(yyxi+=2) >= 0){			if(*yyxi == yychar)				break;		}		if((yyn = yyxi[1]) < 0)			return(0);   /* accept */	}	if(yyn == 0){ /* error */		/* error ... attempt to resume parsing */		switch(yyerrflag){		case 0:   /* brand new error */			yyerror("syntax error");			yyerrlab:			++yynerrs;		case 1:		case 2: /* incompletely recovered error ... try again */			yyerrflag = 3;			/* find a state where "error" is a legal shift action */			while (yyps >= yys) {				yyn = yypact[*yyps] + YYERRCODE;				if(yyn>= 0 && yyn < YYLAST && yychk[yyact[yyn]] == YYERRCODE){					yystate = yyact[yyn];  /* simulate a shift of "error" */					goto yystack;				}				yyn = yypact[*yyps];				/* the current yyps has no shift onn "error", pop stack */				if(yydebug)					printf("error recovery pops state %d, uncovers %d\n", *yyps, yyps[-1]);				--yyps;				--yypv;			}			/* there is no state on the stack with an error shift ... abort */		yyabort:			return(1);		case 3:  /* no shift yet; clobber input char */			if(yydebug)				printf("error recovery discards char %d\n", yychar);			if(yychar == 0)				goto yyabort; /* don't discard EOF, quit */			yychar = -1;			goto yynewstate;   /* try again in the same state */		}	}	/* reduction by production yyn */	if(yydebug)		printf("reduce %d\n",yyn);	yyps -= yyr2[yyn];	yypvt = yypv;	yypv -= yyr2[yyn];	yyval = yypv[1];	yym=yyn;	/* consult goto table to find next state */	yyn = yyr1[yyn];	yyj = yypgo[yyn] + *yyps + 1;	if(yyj>=YYLAST || yychk[yystate = yyact[yyj]] != -yyn)		yystate = yyact[yypgo[yyn]];	switch(yym) {		$A	}	goto yystack;  /* stack new state and value */}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -