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

搜索引擎

开发平台:

C#

  1. /**f
  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. options {
  17.   STATIC = false;
  18. //IGNORE_CASE = true;
  19. //BUILD_PARSER = false;
  20.   UNICODE_INPUT = true;
  21.   USER_CHAR_STREAM = true;
  22.   OPTIMIZE_TOKEN_MANAGER = true;
  23. //DEBUG_TOKEN_MANAGER = true;
  24. }
  25. PARSER_BEGIN(StandardTokenizer)
  26. package org.apache.lucene.analysis.standard;
  27. import java.io.*;
  28. /** A grammar-based tokenizer constructed with JavaCC.
  29.  *
  30.  * <p> This should be a good tokenizer for most European-language documents:
  31.  *
  32.  * <ul>
  33.  *   <li>Splits words at punctuation characters, removing punctuation. However, a 
  34.  *     dot that's not followed by whitespace is considered part of a token.
  35.  *   <li>Splits words at hyphens, unless there's a number in the token, in which case
  36.  *     the whole token is interpreted as a product number and is not split.
  37.  *   <li>Recognizes email addresses and internet hostnames as one token.
  38.  * </ul>
  39.  *
  40.  * <p>Many applications have specific tokenizer needs.  If this tokenizer does
  41.  * not suit your application, please consider copying this source code
  42.  * directory to your project and maintaining your own grammar-based tokenizer.
  43.  */
  44. public class StandardTokenizer extends org.apache.lucene.analysis.Tokenizer {
  45.   /** Constructs a tokenizer for this Reader. */
  46.   public StandardTokenizer(Reader reader) {
  47.     this(new FastCharStream(reader));
  48.     this.input = reader;
  49.   }
  50. }
  51. PARSER_END(StandardTokenizer)
  52. TOKEN : {   // token patterns
  53.   // basic word: a sequence of digits & letters
  54.   <ALPHANUM: (<LETTER>|<DIGIT>|<KOREAN>)+ >
  55.   // internal apostrophes: O'Reilly, you're, O'Reilly's
  56.   // use a post-filter to remove possesives
  57. | <APOSTROPHE: <ALPHA> ("'" <ALPHA>)+ >
  58.   // acronyms: U.S.A., I.B.M., etc.
  59.   // use a post-filter to remove dots
  60. | <ACRONYM: <ALPHA> "." (<ALPHA> ".")+ >
  61.   // company names like AT&T and Excite@Home.
  62. | <COMPANY: <ALPHA> ("&"|"@") <ALPHA> >
  63.   // email addresses
  64. | <EMAIL: <ALPHANUM> (("."|"-"|"_") <ALPHANUM>)* "@" <ALPHANUM> (("."|"-") <ALPHANUM>)+ >
  65.   // hostname
  66. | <HOST: <ALPHANUM> ("." <ALPHANUM>)+ >
  67.   // floating point, serial, model numbers, ip addresses, etc.
  68.   // every other segment must have at least one digit
  69. | <NUM: (<ALPHANUM> <P> <HAS_DIGIT>
  70.        | <HAS_DIGIT> <P> <ALPHANUM>
  71.        | <ALPHANUM> (<P> <HAS_DIGIT> <P> <ALPHANUM>)+
  72.        | <HAS_DIGIT> (<P> <ALPHANUM> <P> <HAS_DIGIT>)+
  73.        | <ALPHANUM> <P> <HAS_DIGIT> (<P> <ALPHANUM> <P> <HAS_DIGIT>)+
  74.        | <HAS_DIGIT> <P> <ALPHANUM> (<P> <HAS_DIGIT> <P> <ALPHANUM>)+
  75.         )
  76.   >
  77. | <#P: ("_"|"-"|"/"|"."|",") >
  78. | <#HAS_DIGIT:   // at least one digit
  79.     (<LETTER>|<DIGIT>)*
  80.     <DIGIT>
  81.     (<LETTER>|<DIGIT>)*
  82.   >
  83. | < #ALPHA: (<LETTER>)+>
  84. | < #LETTER:   // unicode letters
  85.       [
  86.        "u0041"-"u005a",
  87.        "u0061"-"u007a",
  88.        "u00c0"-"u00d6",
  89.        "u00d8"-"u00f6",
  90.        "u00f8"-"u00ff",
  91.        "u0100"-"u1fff"
  92.       ]
  93.   >
  94. | < CJ:                                          // Chinese, Japanese
  95.       [
  96.        "u3040"-"u318f",
  97.        "u3300"-"u337f",
  98.        "u3400"-"u3d2d",
  99.        "u4e00"-"u9fff",
  100.        "uf900"-"ufaff"
  101.       ]
  102.   >
  103. | < KOREAN:                                          // Korean
  104.       [
  105.        "uac00"-"ud7af"
  106.       ]
  107.   >
  108. | < #DIGIT:   // unicode digits
  109.       [
  110.        "u0030"-"u0039",
  111.        "u0660"-"u0669",
  112.        "u06f0"-"u06f9",
  113.        "u0966"-"u096f",
  114.        "u09e6"-"u09ef",
  115.        "u0a66"-"u0a6f",
  116.        "u0ae6"-"u0aef",
  117.        "u0b66"-"u0b6f",
  118.        "u0be7"-"u0bef",
  119.        "u0c66"-"u0c6f",
  120.        "u0ce6"-"u0cef",
  121.        "u0d66"-"u0d6f",
  122.        "u0e50"-"u0e59",
  123.        "u0ed0"-"u0ed9",
  124.        "u1040"-"u1049"
  125.       ]
  126.   >
  127. }
  128. SKIP : {   // skip unrecognized chars
  129.  <NOISE: ~[] >
  130. }
  131. /** Returns the next token in the stream, or null at EOS.
  132.  * <p>The returned token's type is set to an element of {@link
  133.  * StandardTokenizerConstants#tokenImage}.
  134.  */
  135. org.apache.lucene.analysis.Token next() throws IOException :
  136. {
  137.   Token token = null;
  138. }
  139. {
  140.   ( token = <ALPHANUM> |
  141.     token = <APOSTROPHE> |
  142.     token = <ACRONYM> |
  143.     token = <COMPANY> |
  144.     token = <EMAIL> |
  145.     token = <HOST> |
  146.     token = <NUM> |
  147.     token = <CJ> |
  148.     token = <EOF>
  149.    )
  150.     {
  151.       if (token.kind == EOF) {
  152. return null;
  153.       } else {
  154. return
  155.   new org.apache.lucene.analysis.Token(token.image,
  156. token.beginColumn,token.endColumn,
  157. tokenImage[token.kind]);
  158.       }
  159.     }
  160. }