#include <stdio.h>
#include <stdlib.h>
#include <string.h>
char buffer[1000]; /* 式入力バッファ */
char *bufferptr; /* 入力バッファポインタ */
char token[100]; /* トークン */
/*----------------------------------------------------------------------*/
int isblank( char c ) { return c=='\t' || c==' '; }
char *inittoken( char *str );
char *gettoken();
int factor();
int term();
int expr();
char *inittoken( char *str )
{
strcpy( buffer, str );
bufferptr = buffer;
return gettoken();
}
char *gettoken()
{
char *tp = token;
*tp = '\0';
while( isblank(*bufferptr) )
++bufferptr;
if( (*bufferptr == '\n') || (*bufferptr == '\0') )
return NULL;
if( isdigit(*bufferptr) ) {
while( isdigit(*bufferptr) )
*tp++ = *bufferptr++;
} else {
*tp++ = *bufferptr++;
}
*tp = '\0';
return bufferptr;
}
int factor()
{
int value;
if(isdigit( token[0] ) ){
value = atoi(token);
gettoken();
}else if( token[0] == '(' ){
gettoken();
value = expr();
if( token[0] == ')' ) {
gettoken();
}else{
fprintf(stderr,"エラー ( と ) がバランスしていない\n");
exit(EXIT_FAILURE);
}
}
return value;
}
int term()
{
int value, v;
char op;
value = factor();
for(;;){
op = token[0];
if( !( op =='*' || op=='/' ) )
break;
if( !gettoken() )
break;
v = factor();
switch( op ){
case '*': value *= v;
break;
case '/':
value /= v;
break;
}
}
return value;
}
int expr()
{
int value, v;
int sign = 1;
char op;
if( token[0] == '+' ){
gettoken();
}else if( token[0] == '-' ){
sign = -1;
gettoken();
}
value = term();
if( sign == -1 )
value = -value;
for(;;){
op = token[0];
if( !( op =='+' || op=='-' ) )
break;
if( !gettoken())
break;
v = term();
switch( op ){
case '+': value += v;
break;
case '-': value -= v;
break;
}
}
return value;
}
int expression(char *str )
{
inittoken( str );
return expr();
}
int main(int argc, char **argv )
{
char str[1000] = {'\0'};
int i;
for(i=1;i<argc;i++)
strcat(str,argv[i]);
printf( "答えは %d\n", expression(str) );
return 0;
}