From 2ca209c11d0185c0ae67861205e316f6311595b4 Mon Sep 17 00:00:00 2001 From: Akim Demaille Date: Mon, 26 Nov 2001 15:27:58 +0000 Subject: [PATCH] * src/reader.c (readgram): Make sure rules for mid-rule actions have a lineno equal to that of their host rule. Reported by Hans Aberg. * tests/regression.at (Rule Line Numbers): New. --- ChangeLog | 7 +++ src/reader.c | 8 ++- tests/regression.at | 142 ++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 154 insertions(+), 3 deletions(-) diff --git a/ChangeLog b/ChangeLog index 22be68e6..b7c5a449 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,10 @@ +2001-11-26 Akim Demaille + + * src/reader.c (readgram): Make sure rules for mid-rule actions + have a lineno equal to that of their host rule. + Reported by Hans Aberg. + * tests/regression.at (Rule Line Numbers): New. + 2001-11-26 Akim Demaille * src/LR0.c (allocate_itemsets): kernel_size contains ints, not diff --git a/src/reader.c b/src/reader.c index 8f01a7c4..73e79704 100644 --- a/src/reader.c +++ b/src/reader.c @@ -1474,12 +1474,14 @@ readgram (void) /* Make a dummy nonterminal, a gensym. */ bucket *sdummy = gensym (); - /* Make a new rule, whose body is empty, - before the current one, so that the action - just read can belong to it. */ + /* Make a new rule, whose body is empty, before the + current one, so that the action just read can + belong to it. */ nrules++; nitems++; p = symbol_list_new (sdummy); + /* Attach its lineno to that of the host rule. */ + p->line = crule->line; if (crule1) crule1->next = p; else diff --git a/tests/regression.at b/tests/regression.at index 68f02adc..f6b5fe0d 100644 --- a/tests/regression.at +++ b/tests/regression.at @@ -242,6 +242,148 @@ AT_CLEANUP + +## ------------------- ## +## Rule Line Numbers. ## +## ------------------- ## + +AT_SETUP([Rule Line Numbers]) + +AT_DATA([input.y], +[[%% +expr: +'a' + +{ + +} + +'b' + +{ + +} + +| + + +{ + + +} + +'c' + +{ + +} +]]) + +AT_CHECK([bison input.y -o input.c -v], 0, [], []) + +# Check the contents of the report. +AT_CHECK([cat input.output], [], +[[ +Grammar + + Number, Line, Rule + 1 2 @1 -> /* empty */ + 2 2 expr -> 'a' @1 'b' + 3 15 @2 -> /* empty */ + 4 15 expr -> @2 'c' + +Terminals, with rules where they appear + +$ (-1) +'a' (97) 2 +'b' (98) 2 +'c' (99) 4 +error (256) + +Nonterminals, with rules where they appear + +expr (6) + on left: 2 4 +@1 (7) + on left: 1, on right: 2 +@2 (8) + on left: 3, on right: 4 + + +state 0 + + 'a' shift, and go to state 1 + + $default reduce using rule 3 (@2) + + expr go to state 6 + @2 go to state 2 + + + +state 1 + + expr -> 'a' . @1 'b' (rule 2) + + $default reduce using rule 1 (@1) + + @1 go to state 3 + + + +state 2 + + expr -> @2 . 'c' (rule 4) + + 'c' shift, and go to state 4 + + + +state 3 + + expr -> 'a' @1 . 'b' (rule 2) + + 'b' shift, and go to state 5 + + + +state 4 + + expr -> @2 'c' . (rule 4) + + $default reduce using rule 4 (expr) + + + +state 5 + + expr -> 'a' @1 'b' . (rule 2) + + $default reduce using rule 2 (expr) + + + +state 6 + + $ go to state 7 + + + +state 7 + + $ go to state 8 + + + +state 8 + + $default accept +]]) + +AT_CLEANUP + + + ## -------------------- ## ## %expect not enough. ## ## -------------------- ## -- 2.45.2