/**
 * LOGICAL-PARADOX.ORG
 * Copyright (C)2004 satoshi akabane(akabane@logical-paradox.org)
 *
 */
package org.logical_paradox.kinako.logic.parser;

import org.logical_paradox.common.fsm.Symbol;
import org.logical_paradox.phalanx.binding.condition.Condition;

/**
 * 検索条件をパースする
 * @author satoshi akabane@logical-paradox.org
 * @version $Revision: 1.1 $
 */
public class SearchConditionParser {
	private static final SearchConditionParser parser = new SearchConditionParser();
	
	private SearchConditionParser() {
	}
	/**
	 * 検索条件パーサーのインスタンスを生成して返す
	 * @return 検索条件パーサー
	 */
	public static SearchConditionParser getParser() {
		return parser;
	}
	/**
	 * 入力された検索キーワードを検索条件オブジェクトのツリー構造に展開する
	 * @param keyword 検索キーワード
	 * @return 展開された検索条件
	 */
	public Condition parse(String keyword) throws Exception {
		// 全角スペースを半角スペースに変換する
		String halfSpacedKeyword = keyword.replace('　', ' ');

		// 入力されたキーワードの文字列を入力記号集合に変換する
		char[] characters = halfSpacedKeyword.toCharArray();
		Symbol[] symbols = new Symbol[characters.length];

		for(int i = 0; i < symbols.length; i++) {
			symbols[i] = new CharacterSymbol(characters[i]);
		}

		// 検索条件の生成
		SearchConditionFsm fsm = new SearchConditionFsm("search condition fsm");
		fsm.execute(symbols);

		return (Condition)fsm.getResult();
	}
}
