public void AddExpression(string text, bool caseSensitive, bool needSeparators, IPatternMatcher matcher,
            object tag)
        {
            if (StringUtils.IsNullOrEmpty(text))
                throw new ArgumentException("text may not be empty", "text"); // do not localize

            Char = text[0];

            if (!caseSensitive)
                ContainsCaseInsensitiveData = true;

            if (text.Length == 1)
            {
                PatternMatchReference patternMatcherReference = new PatternMatchReference(matcher);
                patternMatcherReference.NextSibling = FirstExpression;
                patternMatcherReference.Tag = tag;
                FirstExpression = patternMatcherReference;
            }
            else
            {
                string leftovers = text.Substring(1);
                char childChar = leftovers[0];
                int childIndex = (int) childChar & 0xff; //make a lookupindex

                TokenTreeNode node = ChildNodes[childIndex];
                if (node == null)
                {
                    TokenTreeNode child = new TokenTreeNode();
                    ChildNodes[childIndex] = child;
                    child.AddExpression(leftovers, caseSensitive, needSeparators, matcher, tag);

                    if (child.Char == ' ')
                    {
                        // if the node contains " " (whitespace)
                        // then add the node as a childnode of itself.
                        // thus allowing it to parse things like
                        // "end         sub" even if the pattern is "end sub" // do not localize
                        child.ChildNodes[(int) ' '] = child;
                    }
                }
                else
                {
                    while (node.NextSibling != null && node.Char != childChar)
                    {
                        node = node.NextSibling;
                    }

                    if (node.Char != childChar)
                    {
                        TokenTreeNode child = new TokenTreeNode();
                        node.NextSibling = child;
                        child.AddExpression(leftovers, caseSensitive, needSeparators, matcher, tag);
                    }
                    else
                    {
                        node.AddExpression(leftovers, caseSensitive, needSeparators, matcher, tag);
                    }
                }
            }
        }
 private void AddExpressionWithoutPrefix(IPatternMatcher matcher, bool caseSensitive, bool needSeparators,
     object tag)
 {
     if (matcher.DefaultPrefixes != null)
     {
         foreach (string defaultPrefix in matcher.DefaultPrefixes)
         {
             AddExpression(defaultPrefix, caseSensitive, needSeparators, matcher, tag);
         }
     }
     else
     {
         PatternMatchReference patternMatcherReference = new PatternMatchReference(matcher);
         patternMatcherReference.Tag = tag;
         patternMatcherReference.NextSibling = root.FirstExpression;
         root.FirstExpression = patternMatcherReference;
     }
 }