fix(generate): consider reserved words when removing unused rules

This commit is contained in:
Will Lillis 2026-05-08 22:39:41 -04:00
parent ddbe46956f
commit 2cad8b8d47

View file

@ -183,6 +183,14 @@ impl InputGrammar {
for rule in &self.external_tokens {
collect_referenced_names(rule, true, &mut stack);
}
// Reserved-word entries are uses of the named rule (the entry
// names a token to reserve in some context). Top-level
// `NamedSymbol` counts, same as for extras.
for ctx in &self.reserved_words {
for rule in &ctx.reserved_words {
collect_referenced_names(rule, false, &mut stack);
}
}
while let Some(name) = stack.pop() {
if !visited.insert(name) {
continue;
@ -244,6 +252,13 @@ impl InputGrammar {
!r.iter()
.any(|e| matches!(e, PrecedenceEntry::Symbol(s) if s == name))
});
// Prune entries but keep the context: an intentionally-empty
// reserved-word context is a meaningful marker that rule bodies
// may reference by name.
for ctx in &mut self.reserved_words {
ctx.reserved_words
.retain(|r| !rule_is_referenced(r, name, false));
}
}
self