public Factorisation(SubRule subRuleIn, NonterminalHeadD nontHeadIn)
 {
     subRule = subRuleIn;
     nontHeads = new List<NonterminalHeadD>();
     nontHeads.Add(nontHeadIn);
 }
        /// <summary>
        /// Returns all sub rules for a given rule in string representation
        /// </summary>
        /// <param name="nontHead"></param>
        /// <returns></returns>
        private static List<SubRule> SubRules(NonterminalHeadD nontHead)
        {
            // assert that choiceLineD has 1 child and it is of type ChoiceD
            if (nontHead.Rule.Children.Count > 1)
                throw new Exception("The choiceLineD has more than one child, cannot analyse.");

            if (!(nontHead.Rule.Children[0] is ChoiceD))
                throw new Exception("The rule does not have the structure ChoiceLineD -> ChoiceD -> ...");

            List<SubRule> returnVal = new List<SubRule>();

            // get the lexemes from the nonthead rule
            List<Lexeme> totalLexemes = LexemeGenerator.Reverse(nontHead.Rule.Children[0]);
            SubRule totalRule = new SubRule(totalLexemes, nontHead);

            for (int stepSize = 2; stepSize <= totalRule.SymbolCount; stepSize++)
            {
                for (int position = 0; position <= totalRule.SymbolCount - stepSize; position++)
                {
                    List<Lexeme> lexemes = totalRule.getSubRule(position, stepSize);
                    SubRule subRule = new SubRule(lexemes, nontHead);
                    returnVal.Add(subRule);
                }
            }

            return returnVal;
        }
 public Factorisation(SubRule subRuleIn, List<NonterminalHeadD> nontHeadsIn)
 {
     subRule = subRuleIn;
     nontHeads = nontHeadsIn;
 }