📄 gram.c
字号:
#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 + -