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

📄 gram.c

📁 lcc,一个可变目标c语言编译器的源码
💻 C
📖 第 1 页 / 共 2 页
字号:
		&& isspace(bp[4])) {			bp += 4;			return TERMINAL;		} else if (c == '%' && strncmp(bp, "start", 5) == 0		&& isspace(bp[5])) {			bp += 5;			return START;		} else if (c == '"') {			char *p = strchr(bp, '"');			if (p == NULL) {				yyerror("missing \" in assembler template\n");				p = strchr(bp, '\n');				if (p == NULL)					p = strchr(bp, '\0');			}			assert(p);			yylval.string = alloc(p - bp + 1);			strncpy(yylval.string, bp, p - bp);			yylval.string[p - bp] = 0;			bp = *p == '"' ? p + 1 : p;			code++;			return TEMPLATE;		} else if (isdigit(c)) {			int n = 0;			do {				int d = c - '0';				if (n > (INT_MAX - d)/10)					yyerror("integer greater than %d\n", INT_MAX);				else					n = 10*n + d;				c = get();			} while (c != EOF && isdigit(c));			bp--;			yylval.n = n;			return INT;		} else if (isalpha(c)) {			char *p = bp - 1;			while (isalpha(*bp) || isdigit(*bp) || *bp == '_')				bp++;			yylval.string = alloc(bp - p + 1);			strncpy(yylval.string, p, bp - p);			yylval.string[bp - p] = 0;			return ID;		} else if (isprint(c))			yyerror("invalid character `%c'\n", c);		else			yyerror("invalid character `\\%03o'\n", (unsigned char)c);	}	return 0;}void yywarn(char *fmt, ...) {	va_list ap;	va_start(ap, fmt);	if (yylineno > 0)		fprintf(stderr, "line %d: ", yylineno);	fprintf(stderr, "warning: ");	vfprintf(stderr, fmt, ap);}#line 403 "y.tab.c"#define YYABORT goto yyabort#define YYACCEPT goto yyaccept#define YYERROR goto yyerrlab#if YYDEBUG#ifdef __cplusplusextern "C" char *getenv();#elseextern char *getenv();#endif#endifintyyparse(){    register int yym, yyn, yystate;    register YYSTYPE *yyvsp;    register short *yyssp;    short *yysse;#if YYDEBUG    register YYCONST char *yys;    if (yys = getenv("YYDEBUG"))    {        yyn = *yys;        if (yyn >= '0' && yyn <= '9')            yydebug = yyn - '0';    }#endif    yynerrs = 0;    yyerrflag = 0;    yychar = (-1);    if (yyss == 0)    {        yyss = (short *) yymalloc (YYSTACKSIZE * sizeof (short));        if (yyss == 0)          goto yyabort;        yyvs = (YYSTYPE *) yymalloc (YYSTACKSIZE * sizeof (YYSTYPE));        if (yyvs == 0)        {            yyfree (yyss);            goto yyabort;        }        yystacksize = YYSTACKSIZE;    }    yysse = yyss + yystacksize - 1;    yyssp = yyss;    yyvsp = yyvs;    *yyssp = yystate = 0;    goto yyloop;yypush_lex:    yyval = yylval;    yystate = yytable[yyn];yypush:    if (yyssp >= yysse)    {        int depth = yyssp - yyss;        if (yygrow() != 0)             goto yyoverflow;        yysse = yyss + yystacksize -1;        yyssp = depth + yyss;        yyvsp = depth + yyvs;    }    *++yyssp = yystate;    *++yyvsp = yyval;yyloop:    if (yyn = yydefred[yystate]) goto yyreduce;    yyn = yysindex[yystate];    if (yychar < 0)    {        if ((yychar = yylex()) < 0) yychar = 0;#if YYDEBUG        if (yydebug)        {            yys = 0;            if (yychar <= YYMAXTOKEN) yys = yyname[yychar];            if (!yys) yys = "illegal-symbol";            printf("yydebug: state %d, reading %d (%s)\n", yystate,                    yychar, yys);        }#endif    }    if (yyn != 0        && ((yyn += yychar), ((unsigned)yyn <= (unsigned)YYTABLESIZE))        && yycheck[yyn] == yychar)    {#if YYDEBUG        if (yydebug)            printf("yydebug: state %d, shifting to state %d\n",                    yystate, yytable[yyn]);#endif        if (yyerrflag > 0)  --yyerrflag;        yychar = (-1);        goto yypush_lex;    }    yyn = yyrindex[yystate];    if (yyn != 0        && ((yyn += yychar), ((unsigned)yyn <= (unsigned)YYTABLESIZE))        && yycheck[yyn] == yychar)    {        yyn = yytable[yyn];        goto yyreduce;    }    if (yyerrflag) goto yyinrecovery;#ifdef lint    goto yynewerror;#endifyynewerror:    yyerror("syntax error");#ifdef lint    goto yyerrlab;#endifyyerrlab:    ++yynerrs;yyinrecovery:    if (yyerrflag < 3)    {        yyerrflag = 3;        for (;;)        {            yyn = yysindex[*yyssp];            if (yyn != 0                && ((yyn += YYERRCODE), ((unsigned)yyn <= (unsigned)YYTABLESIZE))                && yycheck[yyn] == YYERRCODE)            {#if YYDEBUG                if (yydebug)                    printf("yydebug: state %d, error recovery shifting\ to state %d\n", *yyssp, yytable[yyn]);#endif                goto yypush_lex;            }            else            {#if YYDEBUG                if (yydebug)                    printf("yydebug: error recovery discarding state %d\n",                            *yyssp);#endif                if (yyssp <= yyss) goto yyabort;                --yyssp;                --yyvsp;            }        }    }    else    {        if (yychar == 0) goto yyabort;#if YYDEBUG        if (yydebug)        {            yys = 0;            if (yychar <= YYMAXTOKEN) yys = yyname[yychar];            if (!yys) yys = "illegal-symbol";            printf("yydebug: state %d, error recovery discards token %d (%s)\n",                    yystate, yychar, yys);        }#endif        yychar = (-1);        goto yyloop;    }yyreduce:#if YYDEBUG    if (yydebug)        printf("yydebug: state %d, reducing by rule %d (%s)\n",                yystate, yyn, yyrule[yyn]);#endif    yym = yylen[yyn];    yyval = yyvsp[1-yym];    switch (yyn)    {case 1:#line 22 "lburg/gram.y"{ yylineno = 0; }break;case 2:#line 23 "lburg/gram.y"{ yylineno = 0; }break;case 6:#line 31 "lburg/gram.y"{		if (nonterm(yyvsp[-1].string)->number != 1)			yyerror("redeclaration of the start symbol\n");		}break;case 8:#line 36 "lburg/gram.y"{ yyerrok; }break;case 10:#line 40 "lburg/gram.y"{ term(yyvsp[-2].string, yyvsp[0].n); }break;case 12:#line 44 "lburg/gram.y"{ rule(yyvsp[-5].string, yyvsp[-3].tree, yyvsp[-2].string, yyvsp[-1].string); }break;case 14:#line 46 "lburg/gram.y"{ yyerrok; }break;case 15:#line 49 "lburg/gram.y"{ nonterm(yyval.string = yyvsp[0].string); }break;case 16:#line 52 "lburg/gram.y"{ yyval.tree = tree(yyvsp[0].string,  0,  0); }break;case 17:#line 53 "lburg/gram.y"{ yyval.tree = tree(yyvsp[-3].string, yyvsp[-1].tree,  0); }break;case 18:#line 54 "lburg/gram.y"{ yyval.tree = tree(yyvsp[-5].string, yyvsp[-3].tree, yyvsp[-1].tree); }break;case 19:#line 57 "lburg/gram.y"{ if (*yyvsp[0].string == 0) yyval.string = "0"; }break;#line 630 "y.tab.c"    }    yyssp -= yym;    yyvsp -= yym;    yym = yylhs[yyn];    yystate = *yyssp;    if (yystate == 0 && yym == 0)    {#if YYDEBUG        if (yydebug)            printf("yydebug: after reduction, shifting from state 0 to\ state %d\n", YYFINAL);#endif        yystate = YYFINAL;        *++yyssp = YYFINAL;        *++yyvsp = yyval;        if (yychar < 0)        {            if ((yychar = yylex()) < 0) yychar = 0;#if YYDEBUG            if (yydebug)            {                yys = 0;                if (yychar <= YYMAXTOKEN) yys = yyname[yychar];                if (!yys) yys = "illegal-symbol";                printf("yydebug: state %d, reading %d (%s)\n",                        YYFINAL, yychar, yys);            }#endif        }        if (yychar == 0) goto yyaccept;        goto yyloop;    }    yyn = yygindex[yym];	 if (yyn != 0        && ((yyn += yystate), ((unsigned)yyn <= (unsigned)YYTABLESIZE))        && yycheck[yyn] == yystate)        yystate = yytable[yyn];    else        yystate = yydgoto[yym];#if YYDEBUG    if (yydebug)        printf("yydebug: after reduction, shifting from state %d \to state %d\n", *yyssp, yystate);#endif    goto yypush;yyoverflow:    yyerror("yacc stack overflow");yyabort:    return (1);yyaccept:    return (0);}

⌨️ 快捷键说明

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