public void ApplyFactorization(ref GrammarConverter grammarConverter) { while (isNeedToRepeatFactorization) { isNeedToRepeatFactorization = false; List <Rule> grammarList = grammarConverter.GetGrammarList(); List <IndexOfTerminal> indexOfTerminalList = grammarConverter.GetIndexOfTerminalList(); for (int i = 0; i < indexOfTerminalList.Count(); i++) { IndexOfTerminal currList = indexOfTerminalList[i]; ToExstractFirstComponents(ref grammarList, ref currList); } grammarConverter.SetGrammarList(newGrammarList); UpdateTerminalIndexList(); grammarConverter.SetTerminalIndexList(newIndexOfTerminal); UpdateTerminalList(); grammarConverter.SetTerminalList(newTerminalList); newGrammarList.Clear(); newIndexOfTerminal.Clear(); newTerminalList.Clear(); } }
public void ApplyLeftRecursion(ref GrammarConverter grammarConverter) { List <Rule> grammarList = grammarConverter.GetGrammarList(); for (int i = 0; i < grammarList.Count(); i++) { Rule rule = grammarList[i]; string ruleName = rule.ruleName; string firstComponent = rule.ruleСomposition[0]; if (ruleName == firstComponent) { rulesInNewGrammar.Add(ruleName); DeleteLeftRecursion(i, ruleName, ref grammarConverter); } } AddRulesWithoutRecursion(ref grammarConverter); grammarConverter.SetGrammarList(newGrammarList); UpdateTerminalIndexList(); grammarConverter.SetTerminalIndexList(newIndexOfTerminal); UpdateTerminalList(); grammarConverter.SetTerminalList(newTerminalList); }