X-Git-Url: https://git.saurik.com/bison.git/blobdiff_plain/88bce5a2ef15e5b508749e75ddad709aca85b019..dda7a53e4d98add4c5ab9ba2cbc6a2bbf40e896c:/src/reader.c diff --git a/src/reader.c b/src/reader.c index cc3a25a7..5c65d020 100644 --- a/src/reader.c +++ b/src/reader.c @@ -22,7 +22,6 @@ #include "system.h" #include "quotearg.h" -#include "quote.h" #include "getargs.h" #include "files.h" #include "symtab.h" @@ -70,13 +69,10 @@ prologue_augment (const char *prologue, location_t location) struct obstack *oout = !typed ? &pre_prologue_obstack : &post_prologue_obstack; - if (!no_lines_flag) - { - obstack_fgrow2 (oout, muscle_find ("linef"), - location.first_line, - quotearg_style (c_quoting_style, - muscle_find ("filename"))); - } + obstack_fgrow1 (oout, "]b4_syncline([[%d]], [[", + location.first_line); + MUSCLE_OBSTACK_SGROW (oout, quotearg_style (c_quoting_style, location.file)); + obstack_sgrow (oout, "]])[\n"); obstack_sgrow (oout, prologue); } @@ -88,32 +84,32 @@ prologue_augment (const char *prologue, location_t location) `----------------------*/ void -epilogue_set (const char *epilogue, location_t location) +epilogue_augment (const char *epilogue, location_t location) { - if (!no_lines_flag) - { - obstack_fgrow2 (&muscle_obstack, muscle_find ("linef"), - location.first_line, - quotearg_style (c_quoting_style, - muscle_find ("filename"))); - } + char *extension = NULL; + obstack_fgrow1 (&muscle_obstack, "]b4_syncline([[%d]], [[", + location.first_line); + MUSCLE_OBSTACK_SGROW (&muscle_obstack, + quotearg_style (c_quoting_style, location.file)); + obstack_sgrow (&muscle_obstack, "]])[\n"); obstack_sgrow (&muscle_obstack, epilogue); obstack_1grow (&muscle_obstack, 0); - muscle_insert ("epilogue", obstack_finish (&muscle_obstack)); + extension = obstack_finish (&muscle_obstack); + muscle_grow ("epilogue", extension, ""); + obstack_free (&muscle_obstack, extension); } - /*-------------------------------------------------------------------. +/*-------------------------------------------------------------------. | Return the merger index for a merging function named NAME, whose | | arguments have type TYPE. Records the function, if new, in | -| merger_list. | +| MERGER_LIST. | `-------------------------------------------------------------------*/ static int -get_merge_function (const char* name, const char* type, - location_t loc) +get_merge_function (struniq_t name, struniq_t type, location_t loc) { merger_list *syms; merger_list head; @@ -123,22 +119,22 @@ get_merge_function (const char* name, const char* type, return 0; if (type == NULL) - type = ""; + type = struniq_new (""); head.next = merge_functions; for (syms = &head, n = 1; syms->next != NULL; syms = syms->next, n += 1) - if (strcmp (name, syms->next->name) == 0) + if (STRUNIQ_EQ (name, syms->next->name)) break; if (syms->next == NULL) { syms->next = XMALLOC (merger_list, 1); - syms->next->name = strdup (name); - syms->next->type = strdup (type); + syms->next->name = struniq_new (name); + syms->next->type = struniq_new (type); syms->next->next = NULL; merge_functions = head.next; } - else if (strcmp (type, syms->next->type) != 0) - warn_at (loc, _("result type clash on merge function %s: `%s' vs. `%s'"), + else if (!STRUNIQ_EQ (type, syms->next->type)) + warn_at (loc, _("result type clash on merge function %s: <%s> != <%s>"), name, type, syms->next->type); return n; } @@ -246,31 +242,32 @@ static void grammar_current_rule_check (void) { symbol_t *lhs = current_rule->sym; + char const *lhs_type = lhs->type_name; symbol_t *first_rhs = current_rule->next->sym; /* If there is an action, then there is nothing we can do: the user - is allowed to shoot in her foot. */ + is allowed to shoot herself in the foot. */ if (current_rule->action) return; - /* If $$ is being set in default way, report if any type mismatch. - */ + /* Don't worry about the default action if $$ is untyped, since $$'s + value can't be used. */ + if (! lhs_type) + return; + + /* If $$ is being set in default way, report if any type mismatch. */ if (first_rhs) { - const char *lhs_type = lhs->type_name ? lhs->type_name : ""; const char *rhs_type = first_rhs->type_name ? first_rhs->type_name : ""; - if (strcmp (lhs_type, rhs_type)) + if (!STRUNIQ_EQ (lhs_type, rhs_type)) complain_at (current_rule->location, - _("type clash (`%s' `%s') on default action"), + _("type clash on default action: <%s> != <%s>"), lhs_type, rhs_type); } /* Warn if there is no default for $$ but we need one. */ else - { - if (lhs->type_name) - complain_at (current_rule->location, - _("empty rule for typed nonterminal, and no action")); - } + complain_at (current_rule->location, + _("empty rule for typed nonterminal, and no action")); } @@ -340,7 +337,7 @@ void grammar_current_rule_prec_set (symbol_t *precsym, location_t location) { if (current_rule->ruleprec) - complain_at (location, _("two @prec's in a row")); + complain_at (location, _("only one %s allowed per rule"), "%prec"); current_rule->ruleprec = precsym; } @@ -350,11 +347,12 @@ void grammar_current_rule_dprec_set (int dprec, location_t location) { if (! glr_parser) - warn_at (location, _("%%dprec affects only GLR parsers")); + warn_at (location, _("%s affects only GLR parsers"), "%dprec"); if (dprec <= 0) - complain_at (location, _("%%dprec must be followed by positive number")); + complain_at (location, + _("%s must be followed by positive number"), "%dprec"); else if (current_rule->dprec != 0) - complain_at (location, _("only one %%dprec allowed per rule")); + complain_at (location, _("only one %s allowed per rule"), "%dprec"); current_rule->dprec = dprec; } @@ -362,12 +360,12 @@ grammar_current_rule_dprec_set (int dprec, location_t location) rule. */ void -grammar_current_rule_merge_set (const char* name, location_t location) +grammar_current_rule_merge_set (struniq_t name, location_t location) { if (! glr_parser) - warn_at (location, _("%%merge affects only GLR parsers")); + warn_at (location, _("%s affects only GLR parsers"), "%merge"); if (current_rule->merger != 0) - complain_at (location, _("only one %%merge allowed per rule")); + complain_at (location, _("only one %s allowed per rule"), "%merge"); current_rule->merger = get_merge_function (name, current_rule->sym->type_name, location); } @@ -420,7 +418,7 @@ packgram (void) rules[ruleno].lhs = p->sym; rules[ruleno].rhs = ritem + itemno; rules[ruleno].location = p->location; - rules[ruleno].useful = TRUE; + rules[ruleno].useful = true; rules[ruleno].action = p->action; rules[ruleno].action_location = p->action_location; rules[ruleno].dprec = p->dprec; @@ -456,7 +454,7 @@ packgram (void) assert (itemno == nritems); - if (trace_flag) + if (trace_flag & trace_sets) ritem_print (stderr); } @@ -495,18 +493,18 @@ reader (void) obstack_init (&pre_prologue_obstack); obstack_init (&post_prologue_obstack); - finput = xfopen (infile, "r"); + finput = xfopen (grammar_file, "r"); gram_in = finput; - gram_debug = !!getenv ("parse"); - gram__flex_debug = !!getenv ("scan"); + gram__flex_debug = trace_flag & trace_scan; + gram_debug = trace_flag & trace_parse; scanner_initialize (); gram_parse (&gram_control); /* If something went wrong during the parsing, don't try to continue. */ - if (complain_message_count) - exit (1); + if (complaint_issued) + return; /* Grammar has been read. Do some checking */ if (nrules == 0) @@ -541,10 +539,7 @@ reader (void) grammar = p; } - if (nsyms > SHRT_MAX) - fatal (_("too many symbols (tokens plus nonterminals); maximum %d"), - SHRT_MAX); - + assert (nsyms <= SYMBOL_NUMBER_MAX); assert (nsyms == ntokens + nvars); xfclose (finput);