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); }
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(); }
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}"); }
public Production(Nonterminal nonterminal, SymbolList symbols, Bools drops, Bools promotes) { Id = -1; Nonterminal = nonterminal; Symbols = symbols; Drops = drops; Promotes = promotes; //Debug.Assert(!IsPromote); }
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(); }
public Production(Nonterminal head, List <Symbol> body) { Head = head; Body = body; }
public IEnumerable <Production> ProductionsFor(Nonterminal nonterminal) { return(Productions.Where(production => production.Head.Equals(nonterminal))); }
public bool IsTransitiveNullable(Nonterminal nonTerminal) { return(false); //throw new System.NotImplementedException(); }