private void MakeIsNullable() { var nullables = new HashSet <Symbol>(); var loop = true; while (loop) { loop = false; foreach (var rule in Nonterminals.Where(rule => !nullables.Contains(rule))) { foreach (var production in rule.Body) { var count = production.Count(symbol => !nullables.Contains(symbol)); if (count == 0) { loop = nullables.Add(production.Head); break; } } } } foreach (var nullable in nullables) { nullable.IsNullable = true; } }
public Nonterminal GetNonterminal(string name) { return(Nonterminals.Where(o => o.Name == name).FirstOrDefault()); }