Exemple #1
0
        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();
            }
        }
Exemple #2
0
        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);
        }