* 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.
This commit is contained in:
Akim Demaille
2001-11-26 15:27:58 +00:00
parent 0e41b407b9
commit 2ca209c11d
3 changed files with 154 additions and 3 deletions

View File

@@ -1,3 +1,10 @@
2001-11-26 Akim Demaille <akim@epita.fr>
* 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 <akim@epita.fr> 2001-11-26 Akim Demaille <akim@epita.fr>
* src/LR0.c (allocate_itemsets): kernel_size contains ints, not * src/LR0.c (allocate_itemsets): kernel_size contains ints, not

View File

@@ -1474,12 +1474,14 @@ readgram (void)
/* Make a dummy nonterminal, a gensym. */ /* Make a dummy nonterminal, a gensym. */
bucket *sdummy = gensym (); bucket *sdummy = gensym ();
/* Make a new rule, whose body is empty, /* Make a new rule, whose body is empty, before the
before the current one, so that the action current one, so that the action just read can
just read can belong to it. */ belong to it. */
nrules++; nrules++;
nitems++; nitems++;
p = symbol_list_new (sdummy); p = symbol_list_new (sdummy);
/* Attach its lineno to that of the host rule. */
p->line = crule->line;
if (crule1) if (crule1)
crule1->next = p; crule1->next = p;
else else

View File

@@ -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. ## ## %expect not enough. ##
## -------------------- ## ## -------------------- ##