Esempio n. 1
0
        private static IEnumerable <Symbol> AllSymbols(Nonterminal start)
        {
            var already = new HashSet <Symbol>();

            void all(Nonterminal current)
            {
                already.Add(current);

                foreach (var chain in current.Body)
                {
                    foreach (var symbol in chain)
                    {
                        if (!already.Contains(symbol))
                        {
                            if (symbol is Nonterminal rule)
                            {
                                all(rule);
                            }
                            else
                            {
                                already.Add(symbol);
                            }
                        }
                    }
                }
            }

            all(start);

            return(already);
        }
Esempio n. 2
0
 public Grammar(Nonterminal start, List <Production> productions)
 {
     Start        = start;
     Productions  = productions;
     Nonterminals = new HashSet <Nonterminal>(AllUsedSymbols(productions).OfType <Nonterminal>().Concat(Enumerable.Repeat(start, 1))).ToList();
     Terminals    = new HashSet <Terminal>(AllUsedSymbols(productions).OfType <Terminal>()).ToList();
 }
Esempio n. 3
0
        private void Dump(TextWriter writer, Nonterminal rule)
        {
            writer.WriteLine($"{rule} =");
            var body = string.Join(" |\n    ", rule.Body.Select(prod => prod.Count == 0 ? "ε" : string.Join(" ", prod)));

            writer.WriteLine($"    {body}");
        }
Esempio n. 4
0
        public Production(Nonterminal nonterminal, SymbolList symbols, Bools drops, Bools promotes)
        {
            Id = -1;

            Nonterminal = nonterminal;
            Symbols     = symbols;
            Drops       = drops;
            Promotes    = promotes;

            //Debug.Assert(!IsPromote);
        }
Esempio n. 5
0
        public Grammar(Nonterminal start)
        {
            Start   = start;
            Symbols = AllSymbols(start).ToList();

            Nonterminals = new HashSet <Nonterminal>(Symbols.OfType <Nonterminal>()).ToList();
            Terminals    = new HashSet <Terminal>(Symbols.OfType <Terminal>()).ToList();
            Productions  = MakeProductions(Nonterminals).ToList();
            Whitespace   = new List <Terminal>();

            MakeIsNullable();
        }
Esempio n. 6
0
 public Production(Nonterminal head, List <Symbol> body)
 {
     Head = head;
     Body = body;
 }
Esempio n. 7
0
 public IEnumerable <Production> ProductionsFor(Nonterminal nonterminal)
 {
     return(Productions.Where(production => production.Head.Equals(nonterminal)));
 }
Esempio n. 8
0
 public bool IsTransitiveNullable(Nonterminal nonTerminal)
 {
     return(false);
     //throw new System.NotImplementedException();
 }