diff --git a/cli/src/generate/build_tables/build_lex_table.rs b/cli/src/generate/build_tables/build_lex_table.rs index f7bff0d9..215e45b1 100644 --- a/cli/src/generate/build_tables/build_lex_table.rs +++ b/cli/src/generate/build_tables/build_lex_table.rs @@ -10,6 +10,7 @@ use crate::generate::{ dedup::split_state_id_groups, grammars::{LexicalGrammar, SyntaxGrammar}, nfa::{CharacterSet, NfaCursor}, + prepare_grammar::symbol_is_used, rules::{Symbol, TokenSet}, tables::{AdvanceAction, LexState, LexTable, ParseStateId, ParseTable}, }; @@ -93,6 +94,9 @@ pub fn build_lex_table( let mut large_character_sets = Vec::new(); for (variable_ix, _variable) in lexical_grammar.variables.iter().enumerate() { let symbol = Symbol::terminal(variable_ix); + if !symbol_is_used(&syntax_grammar.variables, symbol) { + continue; + } builder.reset(); builder.add_state_for_tokens(&TokenSet::from_iter([symbol])); for state in &builder.table.states { diff --git a/cli/src/generate/prepare_grammar/flatten_grammar.rs b/cli/src/generate/prepare_grammar/flatten_grammar.rs index 7006a3cc..ff3f10e2 100644 --- a/cli/src/generate/prepare_grammar/flatten_grammar.rs +++ b/cli/src/generate/prepare_grammar/flatten_grammar.rs @@ -173,7 +173,7 @@ fn flatten_variable(variable: Variable) -> SyntaxVariable { } } -fn symbol_is_used(variables: &[SyntaxVariable], symbol: Symbol) -> bool { +pub fn symbol_is_used(variables: &[SyntaxVariable], symbol: Symbol) -> bool { for variable in variables { for production in &variable.productions { for step in &production.steps { diff --git a/cli/src/generate/prepare_grammar/mod.rs b/cli/src/generate/prepare_grammar/mod.rs index 1cb4ef40..16d7c85b 100644 --- a/cli/src/generate/prepare_grammar/mod.rs +++ b/cli/src/generate/prepare_grammar/mod.rs @@ -13,6 +13,7 @@ use std::{ }; use anyhow::{anyhow, Result}; +pub(super) use flatten_grammar::symbol_is_used; pub use self::expand_tokens::expand_tokens; use self::{