private void SeparateProductions() { singleProductions = new List <SingleProduction>(); int i = 0; foreach (var _prod in productions) { foreach (var p in _prod.Produced) { SingleProduction sProd = new SingleProduction(); sProd.Producer = _prod.Producer; sProd.Produced = new LinkedList <Symbol>(p); sProd.Number = i; singleProductions.Add(sProd); i++; } } }
private List <Symbol> SndSRuleFollow(LinkedListNode <Symbol> node, SingleProduction prod) { var terminals = new List <Symbol>(); //Pega o Follow do Não Terminal do lado esquerdo var producerFollow = nonTerminals_Follow.Find(x => x.NonTerminal.Value == prod.Producer.Value); terminals.AddRange(producerFollow.Terminals); //Pega o First do Não Terminal para verificar se ele gera lambda var nodeFirst = nonTerminals_First.Find(x => x.NonTerminal.Value == node.Value.Value); if (nodeFirst.Terminals.Exists(w => w.Type == SymbolType.Empty) && node.Previous != null && node.Previous.Value.Type == SymbolType.NonTerminal) { terminals.AddRange(SndSRuleFollow(node.Previous, prod)); } return(terminals); }