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

📄 gram.c

📁 lcc,一个可变目标c语言编译器的源码
💻 C
📖 第 1 页 / 共 2 页
字号:
#if defined(__STDC__) || defined(__cplusplus)#define YYCONST const#define YYPARAMS(x) x#define YYDEFUN(name, arglist, args) name(args)#define YYAND ,#define YYPTR void *#else#define YYCONST#define YYPARAMS(x) ()#define YYDEFUN(name, arglist, args) name arglist args;#define YYAND ;#define YYPTR char *#endif#ifndef lintYYCONST static char yysccsid[] = "@(#)yaccpar	1.8 (Berkeley +Cygnus.28) 01/20/91";#endif#define YYBYACC 1#ifndef YYDONT_INCLUDE_STDIO#include <stdio.h>#endif#ifdef __cplusplus#include <stdlib.h> /* for malloc/realloc/free */#endif#line 2 "lburg/gram.y"#include <stdio.h>#include "lburg.h"static char rcsid[] = "$Id: gram.c,v 2.1 2002/08/28 23:28:22 drh Exp $";/*lint -e616 -e527 -e652 -esym(552,yynerrs) -esym(563,yynewstate,yyerrlab) */static int yylineno = 0;#line 8 "lburg/gram.y"typedef union {	int n;	char *string;	Tree tree;} YYSTYPE;#line 37 "y.tab.c"#define TERMINAL 257#define START 258#define PPERCENT 259#define ID 260#define TEMPLATE 261#define CODE 262#define INT 263#define YYERRCODE 256static YYCONST short yylhs[] = {                                        -1,    0,    0,    4,    4,    6,    6,    6,    6,    7,    7,    5,    5,    5,    5,    1,    3,    3,    3,    2,};static YYCONST short yylen[] = {                                         2,    3,    1,    0,    2,    3,    3,    1,    2,    0,    4,    0,    7,    2,    3,    1,    1,    4,    6,    1,};static YYCONST short yydefred[] = {                                      3,    0,    0,    0,    9,    0,   11,    7,    4,    8,    0,   15,    0,    0,    0,    5,    6,    0,   13,    0,    0,   14,    0,   10,    0,    0,    0,    0,    0,   19,    0,   17,    0,   12,    0,   18,};static YYCONST short yydgoto[] = {                                       1,   12,   30,   25,    2,   13,    8,   10,};static YYCONST short yysindex[] = {                                      0,    0,   -4,   -2,    0, -250,    0,    0,    0,    0,   -9,    0,    1,  -10,  -49,    0,    0,    3,    0,  -44, -248,    0, -244,    0,  -22, -242, -244, -245,  -37,    0,   10,    0, -244,    0,  -20,    0,};static YYCONST short yyrindex[] = {                                      0,    0,   22,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,   23,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,  -39,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,};static YYCONST short yygindex[] = {                                      0,   11,    0,  -23,    0,    0,    0,    0,};#define YYTABLESIZE 255static YYCONST short yytable[] = {                                      18,   15,   16,   28,   31,   16,    7,   32,    9,   34,   11,   16,   20,   21,   22,   23,   24,   29,   26,   27,   33,   35,    2,    1,   19,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,   16,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,   17,    0,    0,    0,   11,   14,    3,    4,    5,    6,};static YYCONST short yycheck[] = {                                      10,   10,   41,   26,   41,   44,   10,   44,   10,   32,  260,   10,   61,   10,   58,  263,  260,  262,   40,  261,   10,   41,    0,    0,   13,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,  261,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,  256,   -1,   -1,   -1,  260,  260,  256,  257,  258,  259,};#define YYFINAL 1#ifndef YYDEBUG#define YYDEBUG 0#endif#define YYMAXTOKEN 263#if YYDEBUGstatic YYCONST char *YYCONST yyname[] = {"end-of-file",0,0,0,0,0,0,0,0,0,"'\\n'",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"'('","')'",0,0,"','",0,0,0,0,0,0,0,0,0,0,0,0,0,"':'",0,0,"'='",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"TERMINAL","START","PPERCENT","ID","TEMPLATE","CODE","INT",};static YYCONST char *YYCONST yyrule[] = {"$accept : spec","spec : decls PPERCENT rules","spec : decls","decls :","decls : decls decl","decl : TERMINAL blist '\\n'","decl : START nonterm '\\n'","decl : '\\n'","decl : error '\\n'","blist :","blist : blist ID '=' INT","rules :","rules : rules nonterm ':' tree TEMPLATE cost '\\n'","rules : rules '\\n'","rules : rules error '\\n'","nonterm : ID","tree : ID","tree : ID '(' tree ')'","tree : ID '(' tree ',' tree ')'","cost : CODE",};#endif#define YYLEX yylex()#define YYEMPTY -1#define yyclearin (yychar=(YYEMPTY))#define yyerrok (yyerrflag=0)#ifndef YYINITDEPTH#define YYINITDEPTH 200#endif#ifdef YYSTACKSIZE#ifndef YYMAXDEPTH#define YYMAXDEPTH YYSTACKSIZE#endif#else#ifdef YYMAXDEPTH#define YYSTACKSIZE YYMAXDEPTH#else#define YYSTACKSIZE 500#define YYMAXDEPTH 500#endif#endif#ifndef YYMAXSTACKSIZE#define YYMAXSTACKSIZE 10000#endifint yydebug;int yynerrs;int yyerrflag;int yychar;YYSTYPE yyval;YYSTYPE yylval;static short *yyss;static YYSTYPE *yyvs;static int yystacksize;#define yyfree(x) free(x)extern int yylex();static YYPTRYYDEFUN (yymalloc, (bytes), unsigned bytes){    YYPTR ptr = (YYPTR) malloc (bytes);    if (ptr != 0) return (ptr);    yyerror ("yyparse: memory exhausted");    return (0);}static YYPTRYYDEFUN (yyrealloc, (old, bytes), YYPTR old YYAND unsigned bytes){    YYPTR ptr = (YYPTR) realloc (old, bytes);    if (ptr != 0) return (ptr);    yyerror ("yyparse: memory exhausted");    return (0);}static int#ifdef __GNUC__inline#endifyygrow (){    int old_stacksize = yystacksize;    short *new_yyss;    YYSTYPE *new_yyvs;    if (yystacksize == YYMAXSTACKSIZE)        return (1);    yystacksize += (yystacksize + 1 ) / 2;    if (yystacksize > YYMAXSTACKSIZE)        yystacksize = YYMAXSTACKSIZE;#if YYDEBUG    if (yydebug)        printf("yydebug: growing stack size from %d to %d\n",               old_stacksize, yystacksize);#endif    new_yyss = (short *) yyrealloc ((char *)yyss, yystacksize * sizeof (short));    if (new_yyss == 0)        return (1);    new_yyvs = (YYSTYPE *) yyrealloc ((char *)yyvs, yystacksize * sizeof (YYSTYPE));    if (new_yyvs == 0)    {        yyfree (new_yyss);        return (1);    }    yyss = new_yyss;    yyvs = new_yyvs;    return (0);}#line 60 "lburg/gram.y"#include <assert.h>#include <stdarg.h>#include <ctype.h>#include <string.h>#include <limits.h>int errcnt = 0;FILE *infp = NULL;FILE *outfp = NULL;static char buf[BUFSIZ], *bp = buf;static int ppercent = 0;static int code = 0;static int get(void) {	if (*bp == 0) {		bp = buf;		*bp = 0;		if (fgets(buf, sizeof buf, infp) == NULL)			return EOF;		yylineno++;		while (buf[0] == '%' && buf[1] == '{' && buf[2] == '\n') {			for (;;) {				if (fgets(buf, sizeof buf, infp) == NULL) {					yywarn("unterminated %{...%}\n");					return EOF;				}				yylineno++;				if (strcmp(buf, "%}\n") == 0)					break;				fputs(buf, outfp);			}			if (fgets(buf, sizeof buf, infp) == NULL)				return EOF;			yylineno++;		}	}	return *bp++;}void yyerror(char *fmt, ...) {	va_list ap;	va_start(ap, fmt);	if (yylineno > 0)		fprintf(stderr, "line %d: ", yylineno);	vfprintf(stderr, fmt, ap);	if (fmt[strlen(fmt)-1] != '\n')		 fprintf(stderr, "\n");	errcnt++;	va_end(ap);}int yylex(void) {	int c;	if (code) {		char *p;		bp += strspn(bp, " \t\f");		p = strchr(bp, '\n');		if (p == NULL)			p = strchr(bp, '\n');		while (p > bp && isspace(p[-1]))			p--;		yylval.string = alloc(p - bp + 1);		strncpy(yylval.string, bp, p - bp);		yylval.string[p - bp] = 0;		bp = p;		code--;		return CODE;	}	while ((c = get()) != EOF) {		switch (c) {		case ' ': case '\f': case '\t':			continue;		case '\n':		case '(': case ')': case ',':		case ':': case '=':			return c;		}		if (c == '%' && *bp == '%') {			bp++;			return ppercent++ ? 0 : PPERCENT;		} else if (c == '%' && strncmp(bp, "term", 4) == 0

⌨️ 快捷键说明

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