変換プログラム作成


 さあ、アルゴリズムが分かったので変換プログラムを作ってみましょう。
 基本的には前ページのアルゴリズムをそのままプログラムすればいいのでそれほぼ難しくはありません。
 
 ただ、ここ以降のプログラムは基本的にC++で作っていきますので、C++が分からない方はちょっと難しいかもしれません。
 そういう場合はせめてC++を読める程度にがんばってください。Cで作るといろいろと面倒なもんで・・・。
 また、本筋のアルゴリズムには関係無いところはプログラムが無駄に長くなるのを防ぐためにSTLを使っています。STLを知らない方にとっては分かりにくいものですが、覚えるととても便利なので、この機会に覚えるといいかもしれません(^_^;)
 
 まず準備です。最初に演算子の優先順位を決めます。これは
 
 * > / > + > −
 
 とします。特に問題は無いですね。優先度を / > * > − > + としてもかまいません。ただしそうすると変換結果がちょっと変わります(変換結果が間違っているわけではありません)。
 
 ではプログラムです。
 
 はじめにコマンドラインの引数チェックをしてから、CCompiler::Initial() で演算子とその優先度データの map コンテナを構築します。
 その後、式の解析を始めます。まずはトークンの取り出しです。このプログラムの場合は数字か演算子の取り出しになります。
 取り出しの手順は、関係ない空白を飛ばしてから最初に見つかる文字が演算子かどうかで処理を変えています。
 演算子の場合はそのまま1文字でリターン。それ以外は数字なので、演算子か空白が来るまで文字を持ってきます。
//	トークン取り出し
CSource CSource::GetToken()
{
	CSource retStr;
	bool bChar = false;		//	文字か

	EraseSpace();	//	空白があったら取る

	retStr.append(1,GetCurrentChar());
	Foward();

	if(strchr("()*/+-",retStr[0])){	//	演算子
		return retStr;
	}
	
	//	2文字目以降(数字)
	while(!IsEnd()){
		if(strchr(" \t\n",GetCurrentChar())){
			break;
		}
		retStr.append(1,GetCurrentChar());
		Foward();
	}

	return retStr;
}

 その後は前ページのフローチャートの通りに進んでいきます。スタックに関しては stl のスタックをほぼそのまま使っています。

 メインのアルゴリズム以外はSTLですので、余分なソースが無く分かりやすいと思います。
 プログラムはここにLZHで圧縮してありますので、ご自由にお使いください。

 VC++の場合、新規プロジェクトで Win32 Console Application を選んで poland という名前で作ってからソースファイルを追加してください。そのままビルドすれば大丈夫なはずです。
 そうしたら、プロジェクト→設定→デバッグ→プログラムの引数に "(1 + 4) * (3 + 7) / 5" のようにダブルクォーテーションで囲んだ式か、コマンドプロンプトを開いてから
 
 porland.exe "4+5*8/3-4"
 porland.exe "(1 + 4) * (3 + 7) / 5"
 
 のようにコマンドラインから実行してください。数字と演算子の間に空白はいくつあってもかまいません。
 
矢印前ページ トップ
次ページ矢印