Ejemplo n.º 1
0
        private void RemoveCommonStart()
        {
            int NonTerminalToAnalyze = 0;

            for (int i = NonTerminalToAnalyze; i < _Grammar._ProductionRules.Count(); i++, NonTerminalToAnalyze++)
            {
                //Sparg partea dreapta a regulilor de productie
                List <string> CopiedList = new List <string>();
                _Grammar._ProductionRules[i]._RHS.ForEach(s => CopiedList.Add(s));

                //Verific daca sunt elemente cu inceput comun pana raman cu lista goala
                while (CopiedList.Count() != 0)
                {
                    //Caut cel mai lung inceput comun pentru cel putin 2 reguli
                    string LookedUpString = LongestCommonStart(CopiedList);

                    if (LookedUpString == null)
                    {
                        CopiedList.Clear();
                        continue;
                    }

                    var FiltredList = from RHS in CopiedList
                                      where RHS.StartsWith(LookedUpString)
                                      select RHS;

                    //Cream Nonterminul care trebuie adaugat
                    string ToAddNonTerminal = _Grammar.CreateNewNonterminal(_Grammar._ProductionRules[i]._LHS);

                    //Cream regula care trebuie adaugata pentru Nonterminalul curent
                    string ModifiedRule = LookedUpString + " " + ToAddNonTerminal;

                    //Cream regulile care trebuie adaugate noului terminal si facem adaugarea
                    List <string> NewRules = new List <string>();
                    foreach (var Rule in FiltredList)
                    {
                        int CommonStartEndIndex      = LookedUpString.Length + 1;
                        int UncommonStringStartIndex = Rule.Length - CommonStartEndIndex;

                        if (UncommonStringStartIndex > 0)
                        {
                            NewRules.Add(Rule.Substring(CommonStartEndIndex, UncommonStringStartIndex));
                        }
                        else
                        {
                            NewRules.Add("ε");
                        }
                    }
                    _Grammar._ProductionRules.Add(new ProductionRule(ToAddNonTerminal, NewRules));

                    //Adaugarea Nonterminaului in lista de Nonterminale
                    _Grammar._Nonterminals.Add(ToAddNonTerminal);

                    //Stergem regulile cu acelasi inceput
                    _Grammar._ProductionRules[i]._RHS.RemoveAll(s => s.StartsWith(LookedUpString));
                    CopiedList.RemoveAll(s => s.StartsWith(LookedUpString));

                    //Adaugam regula Nonterminalului curent
                    _Grammar._ProductionRules[i]._RHS.Add(string.Copy(ModifiedRule));

                    CopiedList.Clear();
                    _Grammar._ProductionRules[i]._RHS.ForEach(s => CopiedList.Add(s));
                }
            }

            //Setam noul numar de reguli de productie
            _Grammar._NumberOfProductionRules = 0;
            foreach (var ProdRules in _Grammar._ProductionRules)
            {
                _Grammar._NumberOfProductionRules += ProdRules._RHS.Count();
            }
        }