CharTokenizer.cs
上传用户:zhangkuixh
上传日期:2013-09-30
资源大小:5473k
文件大小:3k
源码类别:

搜索引擎

开发平台:

C#

  1. /*
  2.  * Copyright 2004 The Apache Software Foundation
  3.  * 
  4.  * Licensed under the Apache License, Version 2.0 (the "License");
  5.  * you may not use this file except in compliance with the License.
  6.  * You may obtain a copy of the License at
  7.  * 
  8.  * http://www.apache.org/licenses/LICENSE-2.0
  9.  * 
  10.  * Unless required by applicable law or agreed to in writing, software
  11.  * distributed under the License is distributed on an "AS IS" BASIS,
  12.  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  13.  * See the License for the specific language governing permissions and
  14.  * limitations under the License.
  15.  */
  16. using System;
  17. namespace Lucene.Net.Analysis
  18. {
  19. /// <summary>An abstract base class for simple, character-oriented tokenizers.</summary>
  20. public abstract class CharTokenizer : Tokenizer
  21. {
  22. public CharTokenizer(System.IO.TextReader input) : base(input)
  23. {
  24. }
  25. private int offset = 0, bufferIndex = 0, dataLen = 0;
  26. private const int MAX_WORD_LEN = 255;
  27. private const int IO_BUFFER_SIZE = 1024;
  28. private char[] buffer = new char[MAX_WORD_LEN];
  29. private char[] ioBuffer = new char[IO_BUFFER_SIZE];
  30. /// <summary>Returns true iff a character should be included in a token.  This
  31. /// tokenizer generates as tokens adjacent sequences of characters which
  32. /// satisfy this predicate.  Characters for which this is false are used to
  33. /// define token boundaries and are not included in tokens. 
  34. /// </summary>
  35. protected internal abstract bool IsTokenChar(char c);
  36. /// <summary>Called on each token character to normalize it before it is added to the
  37. /// token.  The default implementation does nothing.  Subclasses may use this
  38. /// to, e.g., lowercase tokens. 
  39. /// </summary>
  40. protected internal virtual char Normalize(char c)
  41. {
  42. return c;
  43. }
  44. /// <summary>Returns the next token in the stream, or null at EOS. </summary>
  45. public override Token Next()
  46. {
  47. int length = 0;
  48. int start = offset;
  49. while (true)
  50. {
  51. char c;
  52. offset++;
  53. if (bufferIndex >= dataLen)
  54. {
  55. dataLen = input.Read((System.Char[]) ioBuffer, 0, ioBuffer.Length);
  56. bufferIndex = 0;
  57. }
  58. ;
  59. if (dataLen <= 0)
  60. {
  61. if (length > 0)
  62. break;
  63. else
  64. return null;
  65. }
  66. else
  67. c = ioBuffer[bufferIndex++];
  68. if (IsTokenChar(c))
  69. {
  70. // if it's a token char
  71. if (length == 0)
  72. // start of token
  73. start = offset - 1;
  74. buffer[length++] = Normalize(c); // buffer it, normalized
  75. if (length == MAX_WORD_LEN)
  76. // buffer overflow!
  77. break;
  78. }
  79. else if (length > 0)
  80. // at non-Letter w/ chars
  81. break; // return 'em
  82. }
  83. return new Token(new System.String(buffer, 0, length), start, start + length);
  84. }
  85. }
  86. }