#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 lint YYCONST 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 TA <tim@ngus.net> stdlib.h applies to C too #include <stdlib.h> /* for malloc/realloc/free */ //#endif #line 2 "lburg/gram.y" #include <stdio.h> #include "lburg.h" /*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 256 static 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 255 static 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 YYDEBUG static 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 #endif int 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 YYPTR YYDEFUN (yymalloc, (bytes), unsigned bytes) { YYPTR ptr = (YYPTR) malloc (bytes); if (ptr != 0) return (ptr); yyerror ("yyparse: memory exhausted"); return (0); } static YYPTR YYDEFUN (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 #endif yygrow () { #if YYDEBUG int old_stacksize = yystacksize; #endif 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 && 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 __cplusplus extern "C" char *getenv(); #else extern char *getenv(); #endif #endif int yyparse() { 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; yynewerror: #endif yyerror("syntax error"); #ifdef lint goto yyerrlab; yyerrlab: #endif ++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); }