AOJ0109

問題:Smart Calculator
四則演算の計算機。
以前貼りつけた文字列を計算するやつが超絶バグっていてやばかった。
構文解析ってどうやってやるの?とかいいながら構文解析 Howto(もう答え)を参考にしながらポチポチした。ほぼ写経。

#include <iostream>
#include <string>
#include <sstream>
#include <vector>
#include <algorithm>

#define DEBUG(a) cerr << #a << ":" << a << endl;
using namespace std;

int number( string::iterator& it );
int joujo( string::iterator& it );
int sisoku( string::iterator& it );
int kakko_or_number( string::iterator& it );

int number( string::iterator& it )
{
	int ret = 0;
	while( *it >= '0' && *it <= '9')
	{
		ret *= 10;
		ret += *it - '0';
		++it;
	}
	return ret;
}
int joujo( string::iterator& it )
{
	int ret = kakko_or_number( it );
	while(true)
	{
		if( *it == '*' )ret *= kakko_or_number( ++it );
		else if( *it == '/' )ret /= kakko_or_number( ++it );
		else return ret;
	}
}
int sisoku( string::iterator& it )
{
	int ret = joujo( it );
	while(true)
	{
		if( *it == '+' )ret += joujo( ++it );
		else if( *it == '-' )ret -= joujo( ++it );
		else return ret;
	}
}
int kakko_or_number( string::iterator& it )
{
	if( *it == '(' )
	{
		int ret = sisoku( ++it );
		++it;
		return ret;
	}
	else return number( it );
}
int main()
{
	int n;
	cin >> n;
	while( n-- )
	{
		string s;
		cin>>s;
		string::iterator it = s.begin();
		cout << sisoku( it ) << endl;
	}
}