public List<Token> postProcess(List<Token> tokens) {

		if (tokens.size() == 0) {
			return tokens;
		}

		List<Token> newTokens = new ArrayList<Token>();
		Token prevToken = null;
		Rule currentRule = null;
		outer_loop: for (int i = 0; i < tokens.size(); i++) {
			Token token = tokens.get(i);
			if (currentRule != null) {
				if ((prevToken.end() != token.getStart()) || (!currentRule.contains(token.getMorpheme().getPartOfSpeech()))) {
					currentRule = null;
					newTokens.add(prevToken);
					prevToken = null;
				} else {
					merge(prevToken, token, currentRule.getPartOfSpeech());
					if (i == tokens.size() - 1) {
						newTokens.add(prevToken);
						prevToken = null;
					}
					continue;
				}
			}
			for (int j = 0; j < this.rules.size(); j++) {
				Rule rule = this.rules.get(j);
				if (rule.contains(token.getMorpheme().getPartOfSpeech())) {
					currentRule = rule;
					prevToken = token;
					continue outer_loop;
				}
			}
			currentRule = null;
			newTokens.add(token);
		}

		if (prevToken != null) {
			newTokens.add(prevToken);
		}

		return newTokens;

	}