cfg_predict_sets/
last.rs

1//! LAST sets.
2
3use cfg_grammar::Cfg;
4
5use crate::PerSymbolSets;
6use crate::PredictSets;
7use crate::cfg_sets_ext::CfgSetsExt;
8
9/// FIRST sets.
10pub struct LastSets {
11    map: PerSymbolSets,
12}
13
14impl LastSets {
15    /// Compute all LAST sets of the grammar.
16    ///
17    /// We define a binary relation LAST(N, S), in which N is related to S
18    /// if the grammar has a production of the form `N ⸬= α S β`, where
19    /// β is a nullable string of symbols.
20    ///
21    /// We return the transitive closure of this relation.
22    pub fn new(grammar: &Cfg) -> Self {
23        let mut reversed_grammar = grammar.clone();
24        reversed_grammar.reverse();
25        let map = {
26            let first_sets = reversed_grammar.first_sets();
27            // E0597: `reversed_grammar` does not live long enough
28            //   label: borrowed value does not live long enough
29            first_sets.map
30        };
31        LastSets { map }
32    }
33}
34
35impl PredictSets for LastSets {
36    /// Returns a reference to LAST sets.
37    fn predict_sets(&self) -> &PerSymbolSets {
38        &self.map
39    }
40}