示例#1
0
        public void AddProductionRule(string[] ProductionVector)
        {
            foreach (var ProdRule in _ProductionRules)
            {
                if (ProdRule._LHS == ProductionVector[0])
                {
                    ProdRule._RHS.Add(ProductionVector[1]);
                    return;
                }
            }
            ProductionRule NewRule = new ProductionRule(ProductionVector);

            _ProductionRules.Add(NewRule);
        }
示例#2
0
        private void RemoveLeftRecursion(string NonTermianl)
        {
            //facem o copie a listei de reguli de productie pentru Nonterminalul dat ca parametru
            List <string> ProdRules = new List <string>();

            foreach (var Rules in _Grammar._ProductionRules)
            {
                if (Rules._LHS == NonTermianl)
                {
                    Rules._RHS.ForEach(s => ProdRules.Add(s));
                    break;
                }
            }

            //Cream lista cu regulile de productie ce au recursivitate stanga
            var LeftRec = (from Rule in ProdRules
                           where Rule.StartsWith(NonTermianl)
                           select Rule).ToList();

            if (LeftRec.Count() == 0)
            {
                return;
            }

            //Cream lista cu regulile de productie ce nu au recursivitate stanga
            var NoLeftRec = ProdRules.Except(LeftRec).ToList();

            //Cream Nonterminul care trebuie adaugat
            string ToAddNonTerminal = _Grammar.CreateNewNonterminal(NonTermianl);

            _Grammar._Nonterminals.Add(ToAddNonTerminal);

            //Scoatem din regulile de productie Nonterminalul care creeaza problema si adaug noul nonterminal
            for (int i = 0; i < LeftRec.Count(); i++)
            {
                LeftRec[i] = LeftRec[i].Substring(NonTermianl.Length + 1) + " " + ToAddNonTerminal;
            }

            //Creez Regulile de productie pentru noul terminal si le adaug
            LeftRec.Add("ε");
            ProductionRule NewRules = new ProductionRule(ToAddNonTerminal, LeftRec);

            _Grammar._ProductionRules.Add(NewRules);

            //Golesc lista de reguli de productie pentru Nonterminalul dat ca parametru
            int IndexOfNonterm = _Grammar._ProductionRules.FindIndex(a => a._LHS == NonTermianl);

            _Grammar._ProductionRules.ElementAt(IndexOfNonterm)._RHS.Clear();

            if (NoLeftRec == null)
            {
                _Grammar._ProductionRules.ElementAt(IndexOfNonterm)._RHS.Add(ToAddNonTerminal);
            }
            else
            {
                for (int i = 0; i < NoLeftRec.Count(); i++)
                {
                    if (NoLeftRec[i] == "ε")
                    {
                        NoLeftRec[i] = ToAddNonTerminal;
                    }
                    else
                    {
                        NoLeftRec[i] += " " + ToAddNonTerminal;
                    }
                }
                _Grammar._ProductionRules.ElementAt(IndexOfNonterm)._RHS = NoLeftRec;
            }
            return;
        }