X-Git-Url: https://git.saurik.com/bison.git/blobdiff_plain/c7925b99cb67c97af2da26b68b67c234f718494a..e83d80b8ed8587fd05437d33f2011403f55f1f9d:/src/reader.c diff --git a/src/reader.c b/src/reader.c index 73e79704..099ce309 100644 --- a/src/reader.c +++ b/src/reader.c @@ -437,14 +437,12 @@ 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, muscle_find ("linef"), lineno, quotearg_style (c_quoting_style, muscle_find("filename"))); } -#endif after_percent = 0; @@ -964,14 +962,60 @@ parse_muscle_decl (void) } + +/*---------------------------------. +| Parse a double quoted parameter. | +`---------------------------------*/ + +static const char * +parse_dquoted_param (const char *from) +{ + struct obstack param_obstack; + const char *param = NULL; + int c; + + obstack_init (¶m_obstack); + c = skip_white_space (); + + if (c != '"') + { + complain (_("invalid %s declaration"), from); + ungetc (c, finput); + skip_to_char ('%'); + return NULL; + } + + for (;;) + { + if (literalchar (NULL, &c, '\"')) + obstack_1grow (¶m_obstack, c); + else + break; + } + + obstack_1grow (¶m_obstack, '\0'); + param = obstack_finish (¶m_obstack); + + if (c != '"' || strlen (param) == 0) + { + complain (_("invalid %s declaration"), from); + if (c != '"') + ungetc (c, finput); + skip_to_char ('%'); + return NULL; + } + + return param; +} + /*----------------------------------. | Parse what comes after %skeleton. | `----------------------------------*/ -void +static void parse_skel_decl (void) { - /* Complete with parse_dquoted_param () on the CVS branch 1.29. */ + skeleton = parse_dquoted_param ("%skeleton"); } /*----------------------------------------------------------------. @@ -1087,7 +1131,6 @@ copy_action (symbol_list *rule, int stack_offset) { int c; int count; - char buf[4096]; /* offset is always 0 if parser has already popped the stack pointer */ if (semantic_parser) @@ -1859,25 +1902,13 @@ symbols_output (void) obstack_free (&tokendefs, NULL); } -#if 0 - if (!no_parser_flag) - output_token_defines (&table_obstack); -#endif - if (defines_flag) { output_token_defines (&defines_obstack); if (!pure_parser) - { - if (spec_name_prefix) - obstack_fgrow1 (&defines_obstack, "\nextern YYSTYPE %slval;\n", - spec_name_prefix); - else - obstack_sgrow (&defines_obstack, - "\nextern YYSTYPE yylval;\n"); - } - + obstack_fgrow1 (&defines_obstack, "\nextern YYSTYPE %slval;\n", + spec_name_prefix); if (semantic_parser) { int i; @@ -1925,6 +1956,7 @@ packgram (void) rule_table[ruleno].lhs = p->sym->value; rule_table[ruleno].rhs = itemno; rule_table[ruleno].line = p->line; + rule_table[ruleno].useful = TRUE; p = p->next; while (p && p->sym) @@ -1958,6 +1990,9 @@ packgram (void) } ritem[itemno] = 0; + + if (trace_flag) + ritem_print (stderr); } /*-------------------------------------------------------------------. @@ -2024,7 +2059,6 @@ reader (void) /* Assign the symbols their symbol numbers. Write #defines for the token symbols into FDEFINES if requested. */ packsymbols (); - symbols_output (); /* Convert the grammar into the format described in gram.h. */ packgram (); /* Output the headers. */