From b6610515d520cfefa5e2ead46538b823e7bd21c2 Mon Sep 17 00:00:00 2001 From: Robert Anisko Date: Sat, 25 Aug 2001 15:13:42 +0000 Subject: [PATCH] * 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. --- ChangeLog | 22 ++++++++ src/reader.c | 145 ++++++++++++++++++++++++++++++++++----------------- 2 files changed, 118 insertions(+), 49 deletions(-) diff --git a/ChangeLog b/ChangeLog index 8ee52b2d..55c9ed6f 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,25 @@ +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. diff --git a/src/reader.c b/src/reader.c index 7e23c0ef..cc8f90a0 100644 --- a/src/reader.c +++ b/src/reader.c @@ -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 @@ get_type_name (int n, symbol_list * rule) `------------------------------------------------------------*/ 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); @@ -192,9 +194,30 @@ copy_string (FILE *fin, struct obstack *oout, int match) c = getc (fin); } - obstack_1grow (oout, c); + if (store) + obstack_1grow (oout, c); +} + +/* FIXME. */ + +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 @@ copy_definition (void) /* -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 @@ parse_thong_decl (void) 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 @@ read_declarations (void) parse_source_extension_decl (); break; + case tok_define: + parse_macro_decl (); + break; + case tok_noop: break; @@ -1564,6 +1638,7 @@ readgram (void) 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 @@ readgram (void) # define YYSTYPE int\n\ # endif\n"); } +#endif /* Report any undefined symbols and consider them nonterminals. */ @@ -1641,7 +1717,7 @@ output_token_defines (struct obstack *oout) obstack_fgrow2 (oout, "# define\tT%s\t%d\n", symbol, bp->value); } - obstack_1grow (oout, '\n'); + /* obstack_1grow (oout, '\n'); */ } @@ -1763,8 +1839,12 @@ packsymbols (void) 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); @@ -1913,10 +1993,12 @@ reader (void) /* 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 @@ reader (void) /* 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_sgrow (&table_obstack, - "#define YYBISON 1 /* Identify Bison output. */\n\n"); + /* obstack_1grow (&table_obstack, '\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 (); @@ -1959,30 +2033,3 @@ reader (void) 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"); -} -- 2.45.2