Index: ChangeLog =================================================================== RCS file: /cvsroot/bison/bison/ChangeLog,v retrieving revision 1.180 diff -u -r1.180 ChangeLog --- ChangeLog 2001/08/25 15:07:59 1.180 +++ ChangeLog 2001/08/25 15:12:58 @@ -1,5 +1,27 @@ 2001-08-25 Robert Anisko + * src/reader.c (reader): Remove calls to 'output_headers' and + 'output_trailers'. Remove some C output. + (readgram): Disable a piece of code that was writing a default + definition for 'YYSTYPE'. + (reader_output_yylsp): Remove. + (packsymbols): Output token defintions to a macro. + (copy_definition): Disable C output. + + * src/reader.c (parse_macro_decl): New function used to parse macro + declarations. + (copy_string2): Put the body of copy_string into this new function. + Add a parameter to let the caller choose whether he wants to copy the + string delimiters or not. + (copy_string): Be a simple call to copy_string2 with the last argument + bound to true. + (read_declarations): Add case for macro definition. + (copy_identifier): New. + (parse_macro_decl): Read macro identifiers using copy_identifier + rather than lex. + +2001-08-25 Robert Anisko + * src/output.c (prepare): Add prefixed names. (output_parser): Output semantic actions. (output_parser): Fix bug on '%%line' directives. Index: src/reader.c =================================================================== RCS file: /cvsroot/bison/bison/src/reader.c,v retrieving revision 1.74 diff -u -r1.74 reader.c --- src/reader.c 2001/08/25 13:13:14 1.74 +++ src/reader.c 2001/08/25 15:12:59 @@ -34,6 +34,7 @@ #include "output.h" #include "reader.h" #include "conflicts.h" +#include "macrotab.h" /* Number of slots allocated (but not necessarily used yet) in `rline' */ static int rline_allocated; @@ -156,11 +157,12 @@ `------------------------------------------------------------*/ static inline void -copy_string (FILE *fin, struct obstack *oout, int match) +copy_string2 (FILE *fin, struct obstack *oout, int match, int store) { int c; - obstack_1grow (oout, match); + if (store) + obstack_1grow (oout, match); c = getc (fin); @@ -191,10 +193,31 @@ c = getc (fin); } + + if (store) + obstack_1grow (oout, c); +} + +/* FIXME. */ - obstack_1grow (oout, c); +static inline void +copy_string (FILE *fin, struct obstack *oout, int match) +{ + copy_string2 (fin, oout, match, 1); } +/* FIXME. */ + +static inline void +copy_identifier (FILE *fin, struct obstack *oout) +{ + int c; + + while (isalnum (c = getc (fin)) || c == '_') + obstack_1grow (oout, c); + + ungetc (c, fin); +} /*-----------------------------------------------------------------. | Dump the wannabee comment from IN to OUT1 and OUT2 (which can be | @@ -403,9 +426,11 @@ /* -1 while reading a character if prev char was %. */ int after_percent; +#if 0 if (!no_lines_flag) obstack_fgrow2 (&attrs_obstack, "#line %d %s\n", lineno, quotearg_style (c_quoting_style, infile)); +#endif after_percent = 0; @@ -874,6 +899,51 @@ nsyms--; } +/* FIXME. */ + +static void +parse_macro_decl (void) +{ + int ch = ungetc (skip_white_space (), finput); + char* macro_key; + char* macro_value; + struct obstack macro_obstack; + + obstack_init (¯o_obstack); + + /* Read key. */ + if (!isalpha (ch) && ch != '_') + { + complain (_("invalid %s declaration"), "%define"); + skip_to_char ('%'); + return; + } + copy_identifier (finput, ¯o_obstack); + macro_key = obstack_finish (¯o_obstack); + + /* Read value. */ + ch = skip_white_space (); + if (ch != '"') + { + ungetc (ch, finput); + if (ch != EOF) + { + complain (_("invalid %s declaration"), "%define"); + skip_to_char ('%'); + return; + } + else + fatal (_("Premature EOF after %s"), "\""); + } + copy_string (finput, ¯o_obstack, '"'); + macro_value = obstack_finish (¯o_obstack); + + obstack_free (¯o_obstack, 0); + + /* Store the (key, value) pair in the environment. */ + macro_insert (macro_key, macro_value); +} + /*------------------------------------------. | Parse what comes after %header_extension. | `------------------------------------------*/ @@ -981,6 +1051,10 @@ parse_source_extension_decl (); break; + case tok_define: + parse_macro_decl (); + break; + case tok_noop: break; @@ -1564,6 +1638,7 @@ if (nrules == 0) fatal (_("no rules in the input grammar")); +#if 0 /* This code is in the skeleton now. */ /* JF put out same default YYSTYPE as YACC does */ if (typed == 0 && !value_components_used) @@ -1579,6 +1654,7 @@ # define YYSTYPE int\n\ # endif\n"); } +#endif /* Report any undefined symbols and consider them nonterminals. */ @@ -1641,7 +1717,7 @@ obstack_fgrow2 (oout, "# define\tT%s\t%d\n", symbol, bp->value); } - obstack_1grow (oout, '\n'); + /* obstack_1grow (oout, '\n'); */ } @@ -1763,9 +1839,13 @@ error_token_number = errtoken->value; - if (!no_parser_flag) - output_token_defines (&table_obstack); + output_token_defines (&output_obstack); + obstack_1grow (&output_obstack, 0); + macro_insert ("tokendef", obstack_finish (&output_obstack)); + /* if (!no_parser_flag) + output_token_defines (&table_obstack); */ + if (startval->class == unknown_sym) fatal (_("the start symbol %s is undefined"), startval->tag); else if (startval->class == token_sym) @@ -1913,10 +1993,12 @@ /* Initialize the symbol table. */ tabinit (); + /* Construct the error token */ errtoken = getsym ("error"); errtoken->class = token_sym; errtoken->user_token_number = 256; /* Value specified by POSIX. */ + /* Construct a token that represents all undefined literal tokens. It is always token number 2. */ undeftoken = getsym ("$undefined."); @@ -1926,30 +2008,22 @@ /* Read the declaration section. Copy %{ ... %} groups to TABLE_OBSTACK and FDEFINES file. Also notice any %token, %left, etc. found there. */ - obstack_1grow (&table_obstack, '\n'); - obstack_fgrow3 (&table_obstack, "\ -/* %s, made from %s\n\ - by GNU bison %s. */\n\ -\n", - no_parser_flag ? "Bison-generated parse tables" : "A Bison parser", - infile, VERSION); + /* obstack_1grow (&table_obstack, '\n'); */ - obstack_sgrow (&table_obstack, - "#define YYBISON 1 /* Identify Bison output. */\n\n"); read_declarations (); /* Start writing the guard and action files, if they are needed. */ - output_headers (); + /* output_headers (); */ /* Read in the grammar, build grammar in list form. Write out guards and actions. */ readgram (); /* Now we know whether we need the line-number stack. If we do, write its type into the .tab.h file. */ - if (defines_flag) - reader_output_yylsp (&defines_obstack); + /* if (defines_flag) + reader_output_yylsp (&defines_obstack); */ /* Write closing delimiters for actions and guards. */ - output_trailers (); - if (locations_flag) - obstack_sgrow (&table_obstack, "#define YYLSP_NEEDED 1\n\n"); + /* output_trailers (); */ + /* if (locations_flag) + obstack_sgrow (&table_obstack, "#define YYLSP_NEEDED 1\n\n"); */ /* Assign the symbols their symbol numbers. Write #defines for the token symbols into FDEFINES if requested. */ packsymbols (); @@ -1958,31 +2032,4 @@ /* Free the symbol table data structure since symbols are now all referred to by symbol number. */ free_symtab (); -} - - -/*------------------------------------------------------------------. -| Define YYLTYPE. Cannot be in the skeleton since we might have to | -| output it in the headers if --defines is used. | -`------------------------------------------------------------------*/ - -void -reader_output_yylsp (struct obstack *oout) -{ - if (locations_flag) - obstack_sgrow (oout, "\ -\n\ -#ifndef YYLTYPE\n\ -typedef struct yyltype\n\ -{\n\ - int first_line;\n\ - int first_column;\n\ -\n\ - int last_line;\n\ - int last_column;\n\ -} yyltype;\n\ -\n\ -# define YYLTYPE yyltype\n\ -#endif\n\ -\n"); }