Esempio n. 1
0
        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++;
                }
            }
        }
Esempio n. 2
0
        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);
        }