| #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 |
| #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 355 2007-02-18 22:08:49Z drh $"; |
| /*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 () |
| { |
| 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 |
| && 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; |
| #endif |
| yynewerror: |
| yyerror("syntax error"); |
| #ifdef lint |
| goto yyerrlab; |
| #endif |
| yyerrlab: |
| ++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); |
| } |