//
// 四則演算用の再帰降下構文解析器
//

#include <stdio.h>
#include <stdlib.h>

char* input;
int point;
double expression( void );


// 「数」を処理する(指数表現には未対応)
double number( void ){ 
  double result=0.0;
  double flag = 1.0; //整数部か小数部か
  while( ('0'<=input[point] && input[point]<='9') || input[point]=='.' ){
    if( input[point]=='.' ){ // 小数点を見つけた
      flag = 0.1;
    } else { // 数字
      if( flag>=1.0 ){ // 整数部
	result = 10*result + input[point]-'0';
      } else { // 小数部
	result = result + (input[point]-'0')*flag;
	flag /= 10.0;
      }
    }
    point++;
  }
  return( result );
}


// 「要素」を処理する
double factor( void ){
  double result;
  if( input[point]=='(' ){
    point++;
    result = expression();
    if( input[point]==')' ){
      point++;
      return result;
    } else {
      printf( "Error\n" );
      exit(1);
    }
  } else if( '0'<=input[point] && input[point]<='9' ){
    return( number() );
  } else {
    // 変数名、関数名などの処理はここで行う
    printf( "変数名、関数名など\n" );
    return( 0.0 );
  }
}


// 「項」を処理する
double term( void ){
  double result = factor(); // 要素1を処理
  while( input[point]=='*' || input[point]=='/' ){
    switch( input[point++] ){
    case '*': 
      result *= factor(); // 要素2を処理
      break;
    case '/': 
      result /= factor(); // 要素2を処理
      break;
    default:
      return result;
    }
  }
  return result;
}  


// 「式」を処理する
double expression( void ){
  double result = 0.0;
  if( input[point]!='+' && input[point]!='-' ){
    result  = term(); // 項1を処理
  }
  while( input[point]=='+' || input[point]=='-' ){
    switch( input[point++] ){
    case '+': 
      result += term(); // 項2を処理
      break;
    case '-': 
      result -= term(); // 項2を処理
      break;
    default:
      return result;
    }

  }
  return result;
}  


// メイン
int main( int argc, char* argv[] ){
    input = argv[1];
    point = 0;
    if( argc==1 ){ 
      printf( "数式を引数として入れてください\n" );
      exit(1);
    }
    printf( "Result = %f\n", expression() );
}
