Module Name: src Committed By: christos Date: Thu Oct 29 21:03:59 UTC 2009
Modified Files: src/external/bsd/byacc/dist: defs.h output.c reader.c skeleton.c Log Message: Add support for pure parsers yyparse and yylex params, similar to bison. To generate a diff of this commit: cvs rdiff -u -r1.2 -r1.3 src/external/bsd/byacc/dist/defs.h \ src/external/bsd/byacc/dist/output.c src/external/bsd/byacc/dist/reader.c cvs rdiff -u -r1.4 -r1.5 src/external/bsd/byacc/dist/skeleton.c Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files.
Modified files: Index: src/external/bsd/byacc/dist/defs.h diff -u src/external/bsd/byacc/dist/defs.h:1.2 src/external/bsd/byacc/dist/defs.h:1.3 --- src/external/bsd/byacc/dist/defs.h:1.2 Wed Oct 28 20:56:19 2009 +++ src/external/bsd/byacc/dist/defs.h Thu Oct 29 17:03:59 2009 @@ -96,6 +96,9 @@ #define IDENT 9 #define EXPECT 10 #define EXPECT_RR 11 +#define PURE_PARSER 12 +#define PARSE_PARAM 13 +#define LEX_PARAM 14 /* symbol classes */ @@ -182,6 +185,13 @@ Value_t shift[1]; }; +typedef struct param param; +struct param { + struct param *next; + char *name; + char *type; +}; + /* the structure used to store reductions */ typedef struct reductions reductions; @@ -223,6 +233,7 @@ extern int lineno; extern int outline; extern int exit_code; +extern int pure_parser; extern const char * const banner[]; extern const char * const tables[]; @@ -307,6 +318,9 @@ extern Value_t *itemsetend; extern unsigned *ruleset; +extern param *lex_param; +extern param *parse_param; + /* global functions */ extern bucket *lookup(const char *); @@ -393,7 +407,7 @@ extern void reader(void); /* skeleton.c */ -extern void write_section(const char * const section[]); +extern void write_section(const char * const section[], int); /* verbose.c */ extern void verbose(void); Index: src/external/bsd/byacc/dist/output.c diff -u src/external/bsd/byacc/dist/output.c:1.2 src/external/bsd/byacc/dist/output.c:1.3 --- src/external/bsd/byacc/dist/output.c:1.2 Wed Oct 28 20:56:20 2009 +++ src/external/bsd/byacc/dist/output.c Thu Oct 29 17:03:59 2009 @@ -1,10 +1,10 @@ -/* $NetBSD: output.c,v 1.2 2009/10/29 00:56:20 christos Exp $ */ +/* $NetBSD: output.c,v 1.3 2009/10/29 21:03:59 christos Exp $ */ /* Id: output.c,v 1.21 2009/10/27 10:55:05 tom Exp */ #include "defs.h" #include <sys/cdefs.h> -__RCSID("$NetBSD: output.c,v 1.2 2009/10/29 00:56:20 christos Exp $"); +__RCSID("$NetBSD: output.c,v 1.3 2009/10/29 21:03:59 christos Exp $"); static int nvectors; static int nentries; @@ -55,6 +55,70 @@ } static void +output_yacc_decl(void) +{ + param *p; + ++outline; + fprintf(code_file, "/* compatibility with bison */\n"); + ++outline; + fprintf(code_file, "#ifdef YYPARSE_PARAM\n"); + ++outline; + fprintf(code_file, "/* compatibility with FreeBSD */\n"); + ++outline; + fprintf(code_file, "# ifdef YYPARSE_PARAM_TYPE\n"); + ++outline; + fprintf(code_file, "# define YYPARSE_DECL() " + "yyparse(YYPARSE_PARAM_TYPE YYPARSE_PARAM)\n"); + ++outline; + fprintf(code_file, "# else\n"); + ++outline; + fprintf(code_file, "# define YYPARSE_DECL() " + "yyparse(void *YYPARSE_PARAM)\n"); + ++outline; + fprintf(code_file, "# endif\n"); + ++outline; + fprintf(code_file, "#else\n"); + ++outline; + fprintf(code_file, "# define YYPARSE_DECL() yyparse("); + if (!parse_param) + fprintf(code_file, "void"); + else + for (p = lex_param; p; p = p->next) + fprintf(code_file, "%s %s%s", p->type, p->name, + p->next ? ", " : ""); + fprintf(code_file, ")\n"); + outline += 2; + fprintf(code_file, "#endif\n\n"); +} + +static void +output_lex_decl(void) +{ + param *p; + ++outline; + fprintf(code_file, "/* Pure parsers. */\n"); + ++outline; + fprintf(code_file, "#define YYPURE %d\n", pure_parser); + ++outline; + fprintf(code_file, "#ifdef YYLEX_PARAM\n"); + ++outline; + if (pure_parser) + fprintf(code_file, "# define YYLEX yylex(&yylval, YYLEX_PARAM)\n"); + else + fprintf(code_file, "# define YYLEX yylex(YYLEX_PARAM)\n"); + ++outline; + fprintf(code_file, "#else\n"); + if (pure_parser) + fprintf(code_file, "# define YYLEX yylex(&yylval, "); + else + fprintf(code_file, "# define YYLEX yylex("); + for (p = lex_param; p; p = p->next) + fprintf(code_file, "%s%s", p->name, p->next ? ", " : ""); + fprintf(code_file, ")\n"); + outline += 2; + fprintf(code_file, "#endif\n\n"); +} +static void output_prefix(void) { if (symbol_prefix == NULL) @@ -837,7 +901,8 @@ rewind(union_file); while ((c = getc(union_file)) != EOF) putc(c, defines_file); - fprintf(defines_file, " YYSTYPE;\nextern YYSTYPE %slval;\n", + if (!pure_parser) + fprintf(defines_file, " YYSTYPE;\nextern YYSTYPE %slval;\n", symbol_prefix); } } @@ -1210,6 +1275,9 @@ free_itemsets(); free_shifts(); free_reductions(); + write_section(banner, 0); + output_yacc_decl(); + output_lex_decl(); output_prefix(); output_stored_text(); output_defines(); @@ -1220,12 +1288,12 @@ output_debug(); output_stype(); if (rflag) - write_section(tables); - write_section(header); + write_section(tables, 0); + write_section(header, !pure_parser); output_trailing_text(); - write_section(body); + write_section(body, pure_parser); output_semantic_actions(); - write_section(trailer); + write_section(trailer, 0); } #ifdef NO_LEAKS Index: src/external/bsd/byacc/dist/reader.c diff -u src/external/bsd/byacc/dist/reader.c:1.2 src/external/bsd/byacc/dist/reader.c:1.3 --- src/external/bsd/byacc/dist/reader.c:1.2 Wed Oct 28 20:56:20 2009 +++ src/external/bsd/byacc/dist/reader.c Thu Oct 29 17:03:59 2009 @@ -1,10 +1,10 @@ -/* $NetBSD: reader.c,v 1.2 2009/10/29 00:56:20 christos Exp $ */ +/* $NetBSD: reader.c,v 1.3 2009/10/29 21:03:59 christos Exp $ */ /* Id: reader.c,v 1.18 2009/10/27 09:04:07 tom Exp */ #include "defs.h" #include <sys/cdefs.h> -__RCSID("$NetBSD: reader.c,v 1.2 2009/10/29 00:56:20 christos Exp $"); +__RCSID("$NetBSD: reader.c,v 1.3 2009/10/29 21:03:59 christos Exp $"); /* The line size must be a positive integer. One hundred was chosen */ /* because few lines in Yacc input grammars exceed 100 characters. */ @@ -45,6 +45,7 @@ static char *name_pool; char line_format[] = "#line %d \"%s\"\n"; +int pure_parser; static void cachec(int c) @@ -278,6 +279,12 @@ return (EXPECT); if (strcmp(cache, "expect-rr") == 0) return (EXPECT_RR); + if (strcmp(cache, "pure-parser") == 0) + return (PURE_PARSER); + if (strcmp(cache, "parse-param") == 0) + return (PARSE_PARAM); + if (strcmp(cache, "lex-param") == 0) + return (LEX_PARAM); } else { @@ -299,6 +306,90 @@ /*NOTREACHED */ } +struct param *lex_param; +struct param *parse_param; + +/* + * Keep a linked list of parameters + */ +static void +copy_param(int k) +{ + char *buf; + int c; + param *head, *p; + int i; + + c = nextc(); + if (c == EOF) + unexpected_EOF(); + if (c != '{') + goto out; + cptr++; + + c = nextc(); + if (c == EOF) + unexpected_EOF(); + if (c == '}') + goto out; + + buf = MALLOC(linesize); + if (buf == NULL) + goto nospace; + + for (i = 0; (c = *cptr++) != '}'; i++) { + if (c == EOF) + unexpected_EOF(); + buf[i] = c; + } + + if (i == 0) + goto out; + + buf[i--] = '\0'; + while (i >= 0 && isspace((unsigned char)buf[i])) + buf[i--] = '\0'; + while (i >= 0 && isalnum((unsigned char)buf[i])) + i--; + + if (!isspace((unsigned char)buf[i]) && buf[i] != '*') + goto out; + + p = MALLOC(sizeof(*p)); + if (p == NULL) + goto nospace; + + p->name = strdup(buf + i + 1); + if (p->name == NULL) + goto nospace; + + buf[i + 1] = '\0'; + p->type = buf; + + if (k == LEX_PARAM) + head = lex_param; + else + head = parse_param; + + if (head != NULL) { + while (head->next) + head = head->next; + head->next = p; + } else { + if (k == LEX_PARAM) + lex_param = p; + else + parse_param = p; + } + p->next = NULL; + return; + +out: + syntax_error(lineno, line, cptr); +nospace: + no_space(); +} + static void copy_ident(void) { @@ -481,9 +572,9 @@ if (!lflag) fprintf(text_file, line_format, lineno, input_file_name); - fprintf(text_file, "typedef union"); + fprintf(text_file, "typedef union YYSTYPE"); if (dflag) - fprintf(union_file, "typedef union"); + fprintf(union_file, "typedef union YYSTYPE"); depth = 0; loop: @@ -1121,6 +1212,15 @@ copy_union(); break; + case PURE_PARSER: + pure_parser = 1; + break; + + case LEX_PARAM: + case PARSE_PARAM: + copy_param(k); + break; + case TOKEN: case LEFT: case RIGHT: @@ -2028,7 +2128,6 @@ void reader(void) { - write_section(banner); create_symbol_table(); read_declarations(); read_grammar(); Index: src/external/bsd/byacc/dist/skeleton.c diff -u src/external/bsd/byacc/dist/skeleton.c:1.4 src/external/bsd/byacc/dist/skeleton.c:1.5 --- src/external/bsd/byacc/dist/skeleton.c:1.4 Wed Oct 28 22:02:04 2009 +++ src/external/bsd/byacc/dist/skeleton.c Thu Oct 29 17:03:59 2009 @@ -1,10 +1,10 @@ -/* $NetBSD: skeleton.c,v 1.4 2009/10/29 02:02:04 christos Exp $ */ +/* $NetBSD: skeleton.c,v 1.5 2009/10/29 21:03:59 christos Exp $ */ /* Id: skeleton.c,v 1.19 2008/12/24 14:52:28 tom Exp */ #include "defs.h" #include <sys/cdefs.h> -__RCSID("$NetBSD: skeleton.c,v 1.4 2009/10/29 02:02:04 christos Exp $"); +__RCSID("$NetBSD: skeleton.c,v 1.5 2009/10/29 21:03:59 christos Exp $"); /* The definition of yysccsid in the banner should be replaced with */ /* a #pragma ident directive if the target C compiler supports */ @@ -37,25 +37,11 @@ CONCAT1("#define YYPATCH ", YYPATCH), #endif "", - "#define YYLEX yylex()", "#define YYEMPTY (-1)", "#define yyclearin (yychar = YYEMPTY)", "#define yyerrok (yyerrflag = 0)", "#define YYRECOVERING() (yyerrflag != 0)", "", - "/* compatibility with bison */", - "#ifdef YYPARSE_PARAM", - "/* compatibility with FreeBSD */", - "#ifdef YYPARSE_PARAM_TYPE", - "#define YYPARSE_DECL() yyparse(YYPARSE_PARAM_TYPE YYPARSE_PARAM)", - "#else", - "#define YYPARSE_DECL() yyparse(void *YYPARSE_PARAM)", - "#endif", - "#else", - "#define YYPARSE_DECL() yyparse(void)", - "#endif /* YYPARSE_PARAM */", - "", - "static int yygrowstack(void);", 0 }; @@ -85,6 +71,8 @@ "#endif", "", "extern int YYPARSE_DECL();", + "static int yygrowstack(short **, short **, short **,", + " YYSTYPE **, YYSTYPE **, unsigned *);", "", "/* define the initial stack-sizes */", "#ifdef YYSTACKSIZE", @@ -102,58 +90,49 @@ "#define YYINITSTACKSIZE 500", "", "int yydebug;", - "int yynerrs;", "int yyerrflag;", - "int yychar;", - "short *yyssp;", - "YYSTYPE *yyvsp;", - "YYSTYPE yyval;", - "YYSTYPE yylval;", - "", - "/* variables for the parser stack */", - "static short *yyss;", - "static short *yysslim;", - "static YYSTYPE *yyvs;", - "static unsigned yystacksize;", + "\003", + "", 0 }; const char * const body[] = { "/* allocate initial stack or double stack size, up to YYMAXDEPTH */", - "static int yygrowstack(void)", + "static int yygrowstack(short **yyss, short **yyssp, short **yysslim,", + " YYSTYPE **yyvs, YYSTYPE **yyvsp, unsigned *yystacksize)", "{", " int i;", " unsigned newsize;", " short *newss;", " YYSTYPE *newvs;", "", - " if ((newsize = yystacksize) == 0)", + " if ((newsize = *yystacksize) == 0)", " newsize = YYINITSTACKSIZE;", " else if (newsize >= YYMAXDEPTH)", " return -1;", " else if ((newsize *= 2) > YYMAXDEPTH)", " newsize = YYMAXDEPTH;", "", - " i = yyssp - yyss;", - " newss = (yyss != 0)", - " ? (short *)realloc(yyss, newsize * sizeof(*newss))", + " i = *yyssp - *yyss;", + " newss = (*yyss != 0)", + " ? (short *)realloc(*yyss, newsize * sizeof(*newss))", " : (short *)malloc(newsize * sizeof(*newss));", " if (newss == 0)", " return -1;", "", - " yyss = newss;", - " yyssp = newss + i;", + " *yyss = newss;", + " *yyssp = newss + i;", " newvs = (yyvs != 0)", - " ? (YYSTYPE *)realloc(yyvs, newsize * sizeof(*newvs))", + " ? (YYSTYPE *)realloc(*yyvs, newsize * sizeof(*newvs))", " : (YYSTYPE *)malloc(newsize * sizeof(*newvs));", " if (newvs == 0)", " return -1;", "", - " yyvs = newvs;", - " yyvsp = newvs + i;", - " yystacksize = newsize;", - " yysslim = yyss + newsize - 1;", + " *yyvs = newvs;", + " *yyvsp = newvs + i;", + " *yystacksize = newsize;", + " *yysslim = *yyss + newsize - 1;", " return 0;", "}", "", @@ -166,6 +145,15 @@ "YYPARSE_DECL()", "{", " int yym, yyn, yystate;", + "\003", + " YYSTYPE yyval;", + " /* variables for the parser stack */", + " short *yyssp;", + " short *yyss;", + " short *yysslim;", + " YYSTYPE *yyvs;", + " YYSTYPE *yyvsp;", + " unsigned yystacksize;", "#if YYDEBUG", " const char *yys;", "", @@ -182,7 +170,11 @@ " yychar = YYEMPTY;", " yystate = 0;", "", - " if (yyss == NULL && yygrowstack()) goto yyoverflow;", + " yystacksize = 0;", + " yyvs = NULL;", + " yyss = NULL;", + " if (yygrowstack(&yyss, &yyssp, &yysslim, &yyvs, &yyvsp, &yystacksize))", + " goto yyoverflow;", " yyssp = yyss;", " yyvsp = yyvs;", " yystate = 0;", @@ -192,7 +184,7 @@ " if ((yyn = yydefred[yystate]) != 0) goto yyreduce;", " if (yychar < 0)", " {", - " if ((yychar = yylex()) < 0) yychar = 0;", + " if ((yychar = yylex(\002)) < 0) yychar = 0;", "#if YYDEBUG", " if (yydebug)", " {", @@ -212,7 +204,8 @@ " printf(\"%sdebug: state %d, shifting to state %d\\n\",", " YYPREFIX, yystate, yytable[yyn]);", "#endif", - " if (yyssp >= yysslim && yygrowstack())", + " if (yyssp >= yysslim && yygrowstack(&yyss, &yyssp, &yysslim,", + " &yyvs, &yyvsp, &yystacksize))", " {", " goto yyoverflow;", " }", @@ -231,7 +224,7 @@ " }", " if (yyerrflag) goto yyinrecovery;", "", - " yyerror(\"syntax error\");", + " yyerror(\001\"syntax error\");", "", " goto yyerrlab;", "", @@ -252,7 +245,8 @@ " printf(\"%sdebug: state %d, error recovery shifting\\", " to state %d\\n\", YYPREFIX, *yyssp, yytable[yyn]);", "#endif", - " if (yyssp >= yysslim && yygrowstack())", + " if (yyssp >= yysslim && yygrowstack(&yyss, &yyssp,", + " &yysslim, &yyvs, &yyvsp, &yystacksize))", " {", " goto yyoverflow;", " }", @@ -328,7 +322,7 @@ " *++yyvsp = yyval;", " if (yychar < 0)", " {", - " if ((yychar = yylex()) < 0) yychar = 0;", + " if ((yychar = yylex(\002)) < 0) yychar = 0;", "#if YYDEBUG", " if (yydebug)", " {", @@ -353,7 +347,8 @@ " printf(\"%sdebug: after reduction, shifting from state %d \\", "to state %d\\n\", YYPREFIX, *yyssp, yystate);", "#endif", - " if (yyssp >= yysslim && yygrowstack())", + " if (yyssp >= yysslim && yygrowstack(&yyss, &yyssp,", + " &yysslim, &yyvs, &yyvsp, &yystacksize))", " {", " goto yyoverflow;", " }", @@ -362,23 +357,29 @@ " goto yyloop;", "", "yyoverflow:", - " yyerror(\"yacc stack overflow\");", + " yyerror(\001\"yacc stack overflow\");", "", "yyabort:", + " free(yyss);", + " free(yyvs);", " return (1);", "", "yyaccept:", + " free(yyss);", + " free(yyvs);", " return (0);", "}", 0 }; void -write_section(const char * const section[]) +write_section(const char * const section[], int dodecls) { int c; int i; const char *s; + const char *comma; + param *p; FILE *f; f = code_file; @@ -387,7 +388,39 @@ ++outline; while ((c = *s) != 0) { - putc(c, f); + switch (c) { + case '\001': + p = parse_param; + for (; p != NULL; p = p->next) + fprintf(f, "%s, ", p->name); + break; + + case '\002': + p = lex_param; + if (pure_parser) { + fprintf(f, "&yylval"); + comma = ", "; + } else + comma = ""; + for (; p != NULL; p = p->next) { + fprintf(f, "%s%s", comma, p->name); + comma = ", "; + } + break; + + case '\003': + if (!dodecls) + break; + fprintf(f, + " int yynerrs;\n" + " int yychar;\n" + " YYSTYPE yylval;"); + break; + + default: + putc(c, f); + break; + } ++s; } putc('\n', f);