Log in Help
Print
HomegatepluginsJAPE_Plussrccomontotextjapeautomaton 〉 EpsilonClosure.java
 
/*
 *  EpsilonClosure.java
 *
 *  Copyright (c) 2010-2011, Ontotext (www.ontotext.com).
 *
 *  This file is part of GATE (see http://gate.ac.uk/), and is free
 *  software, licenced under the GNU Library General Public License,
 *  Version 2, June 1991 (in the distribution as file licence.html,
 *  and also available at http://gate.ac.uk/gate/licence.html).
 *
 *
 *  $Id$
 */
package com.ontotext.jape.automaton;

final public class EpsilonClosure {
	protected IntSequence state;
	protected IntSequence next;
	protected int stored;
	protected int[] stateMark;
	protected int[] stateClosure;
	protected int marker;
	protected int first;

	protected EpsilonClosure(Automaton a) {
		state = new IntSequence();
		next = new IntSequence();
		stateMark = new int[a.statesStored];
		stateClosure = new int[a.statesStored];
		for (int i = 0; i < a.statesStored; i++) {
			stateMark[i] = Constants.NO;
			stateClosure[i] = Constants.NO;
		}
		state.add(Constants.NO);
		next.add(Constants.NO);
		stored = 1;
	}

	protected void setMarker(int state) {
		marker = state;
		first = Constants.NO;
	}

	protected int closure(int state) {
		return stateClosure[state];
	}

	protected void finish() {
		if (first == Constants.NO) {
			stateClosure[marker] = 0;
		} else {
			stateClosure[marker] = first;
		}
	}

	protected boolean isMarked(int state) {
		return (stateMark[state] == marker);
	}

	protected void mark(int state) {
		stateMark[state] = marker;
		if (state == marker) {
			return;
		}
		this.state.add(state);
		next.add(first);
		first = stored;
		stored++;
	}
}