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); }
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; }