/*	
 *	clipshya.h
 *
 *	操車場アルゴリズム
 *
 *	CLiP - Common Library for P/ECE
 *	Copyright (C) 2001-2014 Naoyuki Sawa
 *
 *	* Wed May 14 22:25:54 JST 2014 Naoyuki Sawa
 *	- 1stリリース。
 */
#ifndef __CLIP_SHYA_H__
#define __CLIP_SHYA_H__

/****************************************************************************
 *	操車場アルゴリズム
 ****************************************************************************/

/* ST_ShuntingYard.fnGetTokenTypeの戻り値 */
#define ShuntingYard_TokenType_Number                    1 /* 数値 */
#define ShuntingYard_TokenType_Function                  2 /* 関数 */
#define ShuntingYard_TokenType_FunctionArgumentSeparator 3 /* 関数の引数セパレータ(カンマなど) */
#define ShuntingYard_TokenType_Operator                  4 /* 演算子 */
#define ShuntingYard_TokenType_LeftParenthesis           5 /* 左括弧 */
#define ShuntingYard_TokenType_RightParenthesis          6 /* 右括弧 */

/* 操車場アルゴリズムの実行情報 */
typedef struct _ST_ShuntingYard {
	int (*fnGetTokenType )(int iToken, void* pParam);		/* アプリケーション定義の関数:トークンの種類を返す */
	int (*fnIsOpLeftAssoc)(int iOpTok, void* pParam);		/* アプリケーション定義の関数:演算子が左結合かを返す */
	int (*fnCompareOpPrec)(int iOpTok1, int iOpTok2, void* pParam);	/* アプリケーション定義の関数:演算子の優先順位を較べる */
} ST_ShuntingYard;

/* 操車場アルゴリズムを使用して、中置記法のトークン並びを、逆ポーランド記法のトークン並びに変換します。
 * [in]
 *	pShuntingYard		操車場アルゴリズムの実行情報
 *	aInput			中置記法のトークン並び。(0終端)
 *	aOutput			逆ポーランド記法のトークン並び(0終端)を格納するバッファ
 *	pParam			アプリケーション定義の関数に引き渡される、任意のパラメータ。
 * [out]
 *	aOutput			逆ポーランド記法のトークン並び(0終端)
 * [note]
 *	- トークン値は、アプリケーション定義の任意の値です。
 *	   ただし、0終端とするために、トークン値として(0)は使用できません。
 *	- aOutput[]には、呼出し側にて、充分なサイズを確保してください。
 *	  当関数は、aOutput[]の終端を認識しないので、サイズが不足すると、バッファの終端を超えて書き込みます。
 *	  aInput[]と同じサイズを確保するようにすれば、安全です。
 *	- aInput[]とaOutput[]に同じバッファを指定しても、動作すると思いますが、まだ確証が持てません。
 *	  (当関数の処理は、aOutput[]への書込みよりも、aInput[]からの読出しの方が、早く進むと思うが…)
 */
void ShuntingYard(const ST_ShuntingYard* pShuntingYard, const int* aInput, int* aOutput, void* pParam);

/* 操車場アルゴリズムを利用して、式テキストの計算を行します。
 * [in]
 *	pText			式テキスト
 * [out]
 *	戻り値			計算結果
 * [note]
 *	- 操車場アルゴリズムを利用して、式テキストの計算を行うサンプルです。
 *	  サンプルではありますが、これはこれで利用価値があると思うので、アプリケーションからも利用可能にしました。
 */
int ShuntingYard_Eval(const char* pText);

#endif/*__CLIP_SHYA_H__*/
