public Lr0AutomatonDigraphAnalyzer(
     Grammar <TTokenKind, TNonterminal> grammar,
     LrItemsDfa <TTokenKind> dfaLr0,
     IErasableSymbolsAnalyzer analyzer)
 {
     _lookaheadSets = ComputeLookaheadSets(grammar, dfaLr0, analyzer);
 }
示例#2
0
        internal FollowSetsDigraphAnalyzer(
            Grammar <TTokenKind, TNonterminal> grammar,
            IErasableSymbolsAnalyzer nullableSymbolsAnalyzer,
            IFirstSetsAnalyzer <TTokenKind> starterTokensAnalyzer)
        {
            var analyzer = new FirstSymbolsAnalyzer <TTokenKind>(nullableSymbolsAnalyzer, starterTokensAnalyzer);

            _followMap = ComputeFollow(grammar, analyzer);
        }
示例#3
0
 public FollowSymbolsAnalyzer(
     IErasableSymbolsAnalyzer nullableSymbolsAnalyzer,
     IFirstSetsAnalyzer <TTokenKind> starterTokensAnalyzer,
     IFollowSetsAnalyzer <TTokenKind> followerTokensAnalyzer)
 {
     _nullableSymbolsAnalyzer = nullableSymbolsAnalyzer;
     _starterTokensAnalyzer   = starterTokensAnalyzer;
     _followerTokensAnalyzer  = followerTokensAnalyzer;
 }
示例#4
0
        private Dictionary <Nonterminal, Set <Terminal <TTokenKind> > > ComputeFirst(
            Grammar <TTokenKind, TNonterminal> grammar, IErasableSymbolsAnalyzer analyzer)
        {
            var(initFirstSets, graph) = DigraphAlgorithm.GetFirstGraph(grammar, analyzer);

            var firstSets = DigraphAlgorithm.Traverse(graph, initFirstSets);

            var firstMap = grammar.Nonterminals.ToDictionary(v => v, v => firstSets[v.Index]);

            return(firstMap);
        }
        // Relational formulation:
        // t ∈ LA(q, A → ω)  iff  (q, A → ω) lookback (p,A) includes* (p',B) reads* (r,C) directly-reads t
        //
        // (r,C) directly-reads t  iff  t ∈ DR(r,C)

        private static Dictionary <(int, int), Set <Terminal <TTokenKind> > > ComputeLookaheadSets(
            Grammar <TTokenKind, TNonterminal> grammar,
            LrItemsDfa <TTokenKind> dfaLr0,
            IErasableSymbolsAnalyzer analyzer)
        {
            var vertices = LalrLookaheadSetsAlgorithm.GetGotoTransitionPairs(grammar, dfaLr0);

            var(directReads, graphRead) = LalrLookaheadSetsAlgorithm.GetGraphReads(grammar, dfaLr0, vertices, analyzer);

            // Read(p,A) sets
            Set <Terminal <TTokenKind> >[] readSets = DigraphAlgorithm.Traverse(graphRead, directReads);

            var graphLaFollow = LalrLookaheadSetsAlgorithm.GetGraphLaFollow(grammar, dfaLr0, vertices, analyzer);

            // Follow(p,A) sets
            Set <Terminal <TTokenKind> >[] followSets = DigraphAlgorithm.Traverse(graphLaFollow, readSets);

            // LA(q, A → ω) = ∪{ Follow(p,A) | (q, A → ω) lookback (p,A) }
            var lookaheadSets = LalrLookaheadSetsAlgorithm.GetLaUnion(grammar, dfaLr0, vertices, followSets);

            return(lookaheadSets);
        }
 public static bool Erasable(this IErasableSymbolsAnalyzer analyzer, IEnumerable <Symbol> symbols)
 {
     // Nullable(X) = Nullable(Y1) Λ ... Λ Nullable(Yn), for X → Y1 Y2...Yn
     // Nullable(ε) = true
     return(symbols.All(analyzer.Erasable)); // All (&&-Monoid) is true by default, because true is the unit
 }
示例#7
0
 internal FirstSetsDigraphAnalyzer(Grammar <TTokenKind, TNonterminal> grammar, IErasableSymbolsAnalyzer analyzer)
 {
     _firstMap = ComputeFirst(grammar, analyzer);
 }