Tokenizer for domain-like hierarchies.

Take something like:

 www.site.co.uk 
and make:
 www.site.co.uk site.co.uk co.uk uk 

Inheritance: Tokenizer
            protected internal override Analyzer.TokenStreamComponents createComponents(string fieldName, Reader reader)
            {
                Tokenizer tokenizer = new ReversePathHierarchyTokenizer(reader);

                return(new Analyzer.TokenStreamComponents(tokenizer, tokenizer));
            }
 //JAVA TO C# CONVERTER WARNING: Method 'throws' clauses are not available in .NET:
 //ORIGINAL LINE: public void testEndOfDelimiterReverseSkip() throws Exception
 public virtual void testEndOfDelimiterReverseSkip()
 {
     string path = "/a/b/c/";
     ReversePathHierarchyTokenizer t = new ReversePathHierarchyTokenizer(new StringReader(path), 1);
     assertTokenStreamContents(t, new string[]{"/a/b/", "a/b/", "b/"}, new int[]{0, 1, 3}, new int[]{5, 5, 5}, new int[]{1, 0, 0}, path.Length);
 }
 //JAVA TO C# CONVERTER WARNING: Method 'throws' clauses are not available in .NET:
 //ORIGINAL LINE: public void testOnlyDelimitersReverseSkip() throws Exception
 public virtual void testOnlyDelimitersReverseSkip()
 {
     string path = "//";
     ReversePathHierarchyTokenizer t = new ReversePathHierarchyTokenizer(new StringReader(path), 1);
     assertTokenStreamContents(t, new string[]{"/"}, new int[]{0}, new int[]{1}, new int[]{1}, path.Length);
 }
 //JAVA TO C# CONVERTER WARNING: Method 'throws' clauses are not available in .NET:
 //ORIGINAL LINE: public void testBasicReverse() throws Exception
 public virtual void testBasicReverse()
 {
     string path = "/a/b/c";
     ReversePathHierarchyTokenizer t = new ReversePathHierarchyTokenizer(new StringReader(path));
     assertTokenStreamContents(t, new string[]{"/a/b/c", "a/b/c", "b/c", "c"}, new int[]{0, 1, 3, 5}, new int[]{6, 6, 6, 6}, new int[]{1, 0, 0, 0}, path.Length);
 }
 protected internal override Analyzer.TokenStreamComponents createComponents(string fieldName, Reader reader)
 {
     Tokenizer tokenizer = new ReversePathHierarchyTokenizer(reader);
     return new Analyzer.TokenStreamComponents(tokenizer, tokenizer);
 }
 //JAVA TO C# CONVERTER WARNING: Method 'throws' clauses are not available in .NET:
 //ORIGINAL LINE: public void testStartOfCharReverseSkip() throws Exception
 public virtual void testStartOfCharReverseSkip()
 {
     string path = "a/b/c";
     ReversePathHierarchyTokenizer t = new ReversePathHierarchyTokenizer(new StringReader(path), 1);
     assertTokenStreamContents(t, new string[]{"a/b/", "b/"}, new int[]{0, 2}, new int[]{4, 4}, new int[]{1, 0}, path.Length);
 }
 //JAVA TO C# CONVERTER WARNING: Method 'throws' clauses are not available in .NET:
 //ORIGINAL LINE: public void testStartOfCharEndOfDelimiterReverse() throws Exception
 public virtual void testStartOfCharEndOfDelimiterReverse()
 {
     string path = "a/b/c/";
     ReversePathHierarchyTokenizer t = new ReversePathHierarchyTokenizer(new StringReader(path));
     assertTokenStreamContents(t, new string[]{"a/b/c/", "b/c/", "c/"}, new int[]{0, 2, 4}, new int[]{6, 6, 6}, new int[]{1, 0, 0}, path.Length);
 }
 //JAVA TO C# CONVERTER WARNING: Method 'throws' clauses are not available in .NET:
 //ORIGINAL LINE: public void testReverseSkip2() throws Exception
 public virtual void testReverseSkip2()
 {
     string path = "/a/b/c/";
     ReversePathHierarchyTokenizer t = new ReversePathHierarchyTokenizer(new StringReader(path), 2);
     assertTokenStreamContents(t, new string[]{"/a/", "a/"}, new int[]{0, 1}, new int[]{3, 3}, new int[]{1, 0}, path.Length);
 }