JFlexTokenizer.java revision d2e3f3641cebe445e5a99af0e33c455b16140b2b
2827b0d03f7b6bafa504d22a5d7ca39cbda048b3Pavel Březina/*
2827b0d03f7b6bafa504d22a5d7ca39cbda048b3Pavel Březina * CDDL HEADER START
2827b0d03f7b6bafa504d22a5d7ca39cbda048b3Pavel Březina *
2827b0d03f7b6bafa504d22a5d7ca39cbda048b3Pavel Březina * The contents of this file are subject to the terms of the
2827b0d03f7b6bafa504d22a5d7ca39cbda048b3Pavel Březina * Common Development and Distribution License (the "License").
2827b0d03f7b6bafa504d22a5d7ca39cbda048b3Pavel Březina * You may not use this file except in compliance with the License.
2827b0d03f7b6bafa504d22a5d7ca39cbda048b3Pavel Březina *
2827b0d03f7b6bafa504d22a5d7ca39cbda048b3Pavel Březina * See LICENSE.txt included in this distribution for the specific
2827b0d03f7b6bafa504d22a5d7ca39cbda048b3Pavel Březina * language governing permissions and limitations under the License.
2827b0d03f7b6bafa504d22a5d7ca39cbda048b3Pavel Březina *
2827b0d03f7b6bafa504d22a5d7ca39cbda048b3Pavel Březina * When distributing Covered Code, include this CDDL HEADER in each
2827b0d03f7b6bafa504d22a5d7ca39cbda048b3Pavel Březina * file and include the License file at LICENSE.txt.
2827b0d03f7b6bafa504d22a5d7ca39cbda048b3Pavel Březina * If applicable, add the following below this CDDL HEADER, with the
2827b0d03f7b6bafa504d22a5d7ca39cbda048b3Pavel Březina * fields enclosed by brackets "[]" replaced with your own identifying
2827b0d03f7b6bafa504d22a5d7ca39cbda048b3Pavel Březina * information: Portions Copyright [yyyy] [name of copyright owner]
2827b0d03f7b6bafa504d22a5d7ca39cbda048b3Pavel Březina *
2827b0d03f7b6bafa504d22a5d7ca39cbda048b3Pavel Březina * CDDL HEADER END
2827b0d03f7b6bafa504d22a5d7ca39cbda048b3Pavel Březina */
2827b0d03f7b6bafa504d22a5d7ca39cbda048b3Pavel Březina
2827b0d03f7b6bafa504d22a5d7ca39cbda048b3Pavel Březina/*
2827b0d03f7b6bafa504d22a5d7ca39cbda048b3Pavel Březina * Copyright (c) 2009, 2013, Oracle and/or its affiliates. All rights reserved.
2827b0d03f7b6bafa504d22a5d7ca39cbda048b3Pavel Březina */
2827b0d03f7b6bafa504d22a5d7ca39cbda048b3Pavel Březinapackage org.opensolaris.opengrok.analysis;
2827b0d03f7b6bafa504d22a5d7ca39cbda048b3Pavel Březina
2827b0d03f7b6bafa504d22a5d7ca39cbda048b3Pavel Březinaimport java.io.IOException;
b0abb3bfdfd95951a23c9fc223c735805ffd2969Pavel Březinaimport java.io.Reader;
2827b0d03f7b6bafa504d22a5d7ca39cbda048b3Pavel Březinaimport java.util.Stack;
2827b0d03f7b6bafa504d22a5d7ca39cbda048b3Pavel Březinaimport org.apache.lucene.analysis.Tokenizer;
2827b0d03f7b6bafa504d22a5d7ca39cbda048b3Pavel Březinaimport org.apache.lucene.analysis.tokenattributes.CharTermAttribute;
2827b0d03f7b6bafa504d22a5d7ca39cbda048b3Pavel Březinaimport org.apache.lucene.analysis.tokenattributes.OffsetAttribute;
2827b0d03f7b6bafa504d22a5d7ca39cbda048b3Pavel Březinaimport org.apache.lucene.analysis.tokenattributes.PositionIncrementAttribute;
2827b0d03f7b6bafa504d22a5d7ca39cbda048b3Pavel Březina
c47e9d522f0d87259e5074ea643daaa3dfcb8d92Pavel Březina/**
e5b34f0166ae61468e53f369578e691ddb09cdd0Pavel Březina *
e5b34f0166ae61468e53f369578e691ddb09cdd0Pavel Březina * Generally this is a "template" for all new Tokenizers, so be carefull when
c47e9d522f0d87259e5074ea643daaa3dfcb8d92Pavel Březina * changing it, it will impact almost ALL symbol tokenizers in OpenGrok ...
c47e9d522f0d87259e5074ea643daaa3dfcb8d92Pavel Březina *
76db25eab9010a33657f35e5afc8477c996df7a3Pavel Březina * Created on August 24, 2009
76db25eab9010a33657f35e5afc8477c996df7a3Pavel Březina *
76db25eab9010a33657f35e5afc8477c996df7a3Pavel Březina * @author Lubos Kosco
76db25eab9010a33657f35e5afc8477c996df7a3Pavel Březina */
76db25eab9010a33657f35e5afc8477c996df7a3Pavel Březinapublic abstract class JFlexTokenizer extends Tokenizer {
2827b0d03f7b6bafa504d22a5d7ca39cbda048b3Pavel Březina
2827b0d03f7b6bafa504d22a5d7ca39cbda048b3Pavel Březina protected Stack<Integer> stack = new Stack<Integer>();
41ef946f3f74a46b9e26118116e4811e259b30efPavel Březina
2a25713afc6beefb11a799903a43f695c5d7a4f9Adam Tkac // default jflex scanner methods and variables
2a25713afc6beefb11a799903a43f695c5d7a4f9Adam Tkac abstract public boolean yylex() throws IOException;
2a25713afc6beefb11a799903a43f695c5d7a4f9Adam Tkac
41ef946f3f74a46b9e26118116e4811e259b30efPavel Březina abstract public void yyreset(Reader reader);
41ef946f3f74a46b9e26118116e4811e259b30efPavel Březina
41ef946f3f74a46b9e26118116e4811e259b30efPavel Březina abstract public void yyclose() throws IOException;
c9aab1c04c399ca2d1abef74f6df22ced34983dcPavel Březina
52e3ee5c5ff2c5a4341041826a803ad42d2b2de7Pavel Březina abstract public void yybegin(int newState);
2827b0d03f7b6bafa504d22a5d7ca39cbda048b3Pavel Březina
2827b0d03f7b6bafa504d22a5d7ca39cbda048b3Pavel Březina abstract public int yystate();
2827b0d03f7b6bafa504d22a5d7ca39cbda048b3Pavel Březina
2827b0d03f7b6bafa504d22a5d7ca39cbda048b3Pavel Březina public JFlexTokenizer(Reader input) {
41ef946f3f74a46b9e26118116e4811e259b30efPavel Březina super(input);
76db25eab9010a33657f35e5afc8477c996df7a3Pavel Březina }
b0abb3bfdfd95951a23c9fc223c735805ffd2969Pavel Březina
b0abb3bfdfd95951a23c9fc223c735805ffd2969Pavel Březina /**
46d3d2c731e8c7e138462e5b60a39a279dc77d81Pavel Březina * Reinitialize the tokenizer with new reader.
15d41c8f28259061e39715acdbbbaea778b6ecc8Pavel Březina */
20f82655b3a29cf0784ba5c912927d1ada1287dfPavel Březina @Override
b0abb3bfdfd95951a23c9fc223c735805ffd2969Pavel Březina public void reset() throws IOException {
b0abb3bfdfd95951a23c9fc223c735805ffd2969Pavel Březina super.reset();
5ff1c3c5a12930692cb6284d14f7fda3a974af8ePavel Březina stack.clear();
2827b0d03f7b6bafa504d22a5d7ca39cbda048b3Pavel Březina this.yyreset(input);
2827b0d03f7b6bafa504d22a5d7ca39cbda048b3Pavel Březina }
2827b0d03f7b6bafa504d22a5d7ca39cbda048b3Pavel Březina
2827b0d03f7b6bafa504d22a5d7ca39cbda048b3Pavel Březina @Override
b3ca35780617b2e5a7637f9888b089e8e26a4e8cPavel Březina public final void close() throws IOException {
b3ca35780617b2e5a7637f9888b089e8e26a4e8cPavel Březina this.yyclose();
b3ca35780617b2e5a7637f9888b089e8e26a4e8cPavel Březina }
b3ca35780617b2e5a7637f9888b089e8e26a4e8cPavel Březina protected CharTermAttribute termAtt = addAttribute(CharTermAttribute.class);
b3ca35780617b2e5a7637f9888b089e8e26a4e8cPavel Březina protected OffsetAttribute offsetAtt = addAttribute(OffsetAttribute.class);
b3ca35780617b2e5a7637f9888b089e8e26a4e8cPavel Březina protected PositionIncrementAttribute posIncrAtt = addAttribute(PositionIncrementAttribute.class);
b3ca35780617b2e5a7637f9888b089e8e26a4e8cPavel Březina protected int finalOffset;
b3ca35780617b2e5a7637f9888b089e8e26a4e8cPavel Březina
b3ca35780617b2e5a7637f9888b089e8e26a4e8cPavel Březina /**
b3ca35780617b2e5a7637f9888b089e8e26a4e8cPavel Březina * This will re-initalize internal AttributeImpls, or it returns false if
b3ca35780617b2e5a7637f9888b089e8e26a4e8cPavel Březina * end of input Reader ...
c47e9d522f0d87259e5074ea643daaa3dfcb8d92Pavel Březina *
15d41c8f28259061e39715acdbbbaea778b6ecc8Pavel Březina * @return false if no more tokens, otherwise true
15d41c8f28259061e39715acdbbbaea778b6ecc8Pavel Březina * @throws IOException
15d41c8f28259061e39715acdbbbaea778b6ecc8Pavel Březina */
15d41c8f28259061e39715acdbbbaea778b6ecc8Pavel Březina @Override
15d41c8f28259061e39715acdbbbaea778b6ecc8Pavel Březina public final boolean incrementToken() throws IOException {
710472d946f6c337a095699dfd79134fa8b9eab9Pavel Březina return this.yylex();
710472d946f6c337a095699dfd79134fa8b9eab9Pavel Březina }
710472d946f6c337a095699dfd79134fa8b9eab9Pavel Březina
5ff1c3c5a12930692cb6284d14f7fda3a974af8ePavel Březina protected void setAttribs(String str, int start, int end) {
710472d946f6c337a095699dfd79134fa8b9eab9Pavel Březina clearAttributes();
710472d946f6c337a095699dfd79134fa8b9eab9Pavel Březina //FIXME increasing below by one(default) might be tricky, need more analysis
710472d946f6c337a095699dfd79134fa8b9eab9Pavel Březina // after lucene upgrade to 3.5 below is most probably not even needed
2827b0d03f7b6bafa504d22a5d7ca39cbda048b3Pavel Březina this.posIncrAtt.setPositionIncrement(1);
3b09b74bf65867d882af87ec60e2a517b15264a6Jakub Hrozek this.termAtt.setEmpty();
3b09b74bf65867d882af87ec60e2a517b15264a6Jakub Hrozek this.termAtt.append(str);
3b09b74bf65867d882af87ec60e2a517b15264a6Jakub Hrozek this.offsetAtt.setOffset(start, end);
3b09b74bf65867d882af87ec60e2a517b15264a6Jakub Hrozek }
3b09b74bf65867d882af87ec60e2a517b15264a6Jakub Hrozek
3d55c65fbe50074f6a63dcb8ae866c038a9e6b2bStephen Gallagher public void yypush(int newState) {
e5b34f0166ae61468e53f369578e691ddb09cdd0Pavel Březina this.stack.push(yystate());
5ff1c3c5a12930692cb6284d14f7fda3a974af8ePavel Březina this.yybegin(newState);
e5b34f0166ae61468e53f369578e691ddb09cdd0Pavel Březina }
3b09b74bf65867d882af87ec60e2a517b15264a6Jakub Hrozek
3b09b74bf65867d882af87ec60e2a517b15264a6Jakub Hrozek public void yypop() {
3b09b74bf65867d882af87ec60e2a517b15264a6Jakub Hrozek this.yybegin(this.stack.pop());
3b09b74bf65867d882af87ec60e2a517b15264a6Jakub Hrozek }
3b09b74bf65867d882af87ec60e2a517b15264a6Jakub Hrozek}
3b09b74bf65867d882af87ec60e2a517b15264a6Jakub Hrozek