From 35f61cb998a30de542f554cd8c47a445af0ef886 Mon Sep 17 00:00:00 2001 From: Akim Demaille Date: Mon, 19 Nov 2001 09:13:12 +0000 Subject: [PATCH] * src/symtab.h, src/symtab.c: `line' is a new member of `bucket'. * src/reader.c (record_rule_lines, rline, rline_allocated): Remove. * src/output.c: Adjust. --- ChangeLog | 7 +++++++ src/gram.h | 6 ++++-- src/output.c | 14 ++++++++++---- src/reader.c | 23 +++-------------------- src/symtab.c | 4 ++++ src/symtab.h | 3 +++ 6 files changed, 31 insertions(+), 26 deletions(-) diff --git a/ChangeLog b/ChangeLog index 4b2e6d9e..8f97247b 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,10 @@ +2001-11-19 Akim Demaille + + * src/symtab.h, src/symtab.c: `line' is a new member of `bucket'. + * src/reader.c (record_rule_lines, rline, rline_allocated): Remove. + * src/output.c: Adjust. + + 2001-11-19 Akim Demaille * src/gram.h (rprec, rprecsym, rassoc): Remove, now part of... diff --git a/src/gram.h b/src/gram.h index c12698b6..531d1d9a 100644 --- a/src/gram.h +++ b/src/gram.h @@ -55,7 +55,9 @@ RULE_TABLE[R].precsym -- the symbol-number of the symbol in %prec for R (if any). - RULE_TABLE[R].assoc -- the associativity of the rule. + RULE_TABLE[R].assoc -- the associativity of R. + + RULE_TABLE[R].line -- the line where R was defined. The right hand side is stored as symbol numbers in a portion of RITEM. @@ -97,7 +99,6 @@ extern short *ritem; extern short *sprec; extern short *sassoc; -extern short *rline; /* Source line number of each rule */ extern int start_symbol; @@ -117,6 +118,7 @@ typedef struct rule_s short prec; short precsym; short assoc; + short line; } rule_t; extern struct rule_s *rule_table; diff --git a/src/output.c b/src/output.c index e05d2cab..308ad8d0 100644 --- a/src/output.c +++ b/src/output.c @@ -375,10 +375,16 @@ output_rule_data (void) obstack_sgrow (&table_obstack, "\n\ #if YYDEBUG != 0\n"); - output_short_table (&table_obstack, - "YYRLINE[YYN] -- source line where rule number YYN was defined", - "yyrline", rline, - 0, 1, nrules + 1); + { + short *values = XCALLOC (short, nrules + 1); + for (i = 0; i < nrules + 1; ++i) + values[i] = rule_table[i].line; + output_short_table (&table_obstack, + "YYRLINE[YYN] -- source line where rule number YYN was defined", + "yyrline", values, + 0, 1, nrules + 1); + XFREE (values); + } obstack_sgrow (&table_obstack, "#endif\n\n"); diff --git a/src/reader.c b/src/reader.c index 7ba1b55f..35e838a7 100644 --- a/src/reader.c +++ b/src/reader.c @@ -1215,20 +1215,6 @@ copy_guard (symbol_list *rule, int stack_offset) } -static void -record_rule_line (void) -{ - /* Record each rule's source line number in rline table. */ - - if (nrules >= rline_allocated) - { - rline_allocated = nrules * 2; - rline = XREALLOC (rline, short, rline_allocated); - } - rline[nrules] = lineno; -} - - /*-------------------------------------------------------------------. | Generate a dummy symbol, a nonterminal, whose name cannot conflict | | with the user's names. | @@ -1371,8 +1357,6 @@ readgram (void) nrules++; nitems++; - record_rule_line (); - p = XCALLOC (symbol_list, 1); p->sym = lhs; @@ -1450,7 +1434,6 @@ readgram (void) just read can belong to it. */ nrules++; nitems++; - record_rule_line (); p = XCALLOC (symbol_list, 1); if (crule1) crule1->next = p; @@ -1458,9 +1441,10 @@ readgram (void) grammar = p; p->sym = sdummy; crule1 = XCALLOC (symbol_list, 1); - p->next = crule1; crule1->next = crule; + p->next = crule1; + /* Insert the dummy generated by that rule into this rule. */ nitems++; @@ -1884,6 +1868,7 @@ packgram (void) { rule_table[ruleno].lhs = p->sym->value; rule_table[ruleno].rhs = itemno; + rule_table[ruleno].line = p->sym->line; ruleprec = p->ruleprec; p = p->next; @@ -1938,8 +1923,6 @@ reader (void) nvars = 0; nrules = 0; nitems = 0; - rline_allocated = 10; - rline = XCALLOC (short, rline_allocated); typed = 0; lastprec = 0; diff --git a/src/symtab.c b/src/symtab.c index 455e74e2..c701ccd6 100644 --- a/src/symtab.c +++ b/src/symtab.c @@ -49,6 +49,9 @@ hash (const char *key) static bucket * bucket_new (const char *tag, int hashval) { + /* Hack, until we have a Bison parser. */ + extern int lineno; + bucket *res = XMALLOC (bucket, 1); res->link = symtab[hashval]; @@ -61,6 +64,7 @@ bucket_new (const char *tag, int hashval) res->user_token_number = SUNDEF; res->alias = NULL; res->class = unknown_sym; + res->line = lineno; nsyms++; diff --git a/src/symtab.h b/src/symtab.h index b98902e1..4ebc4a1a 100644 --- a/src/symtab.h +++ b/src/symtab.h @@ -42,6 +42,9 @@ typedef struct bucket struct bucket *link; struct bucket *next; + /* The line it was found in. */ + short line; + /* The key, name of the symbol. */ char *tag; /* Its type. */ -- 2.50.0