#include <stdlib.h>
#include <ctype.h>
#include <stdio.h>
#include <string.h>
#define DEL 1
#define VAR 2
#define NR 3
char token
[80];
char tok_type;
char *prog;
double vars
[26]=
{0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0};
void asg
(int *ans
);
void exp
(int *ans
);
void atom
(int *ans
);
void get_token
(void);
int isdelim
(char c
);
int find_var
(char *s
);
void main
(void)
{
int ans;
char *p;
p=malloc
(100);
do
{
prog=p;
printf("enter expression: ");
gets
(prog
);
asg
(&ans
);
printf("answer is: %d\n",ans
);
} while (*p
);
}
void asg
(int *ans
)
{
int temp, slot;
char op;
get_token
();
if(tok_type==VAR
)
{
slot=toupper
(*token
)-
'A';
get_token
();
get_token
();
exp
(ans
);
vars
[slot
]=*ans;
return;
}
exp
(ans
);
}
void exp
(int *ans
)
{
char op;
int temp;
atom
(ans
);
while((op=*token
)==
'+' || op==
'-')
{
get_token
();
atom
(&temp
);
switch(op
)
{
case '-':
*ans=*ans-temp;
break;
case '+':
*ans=*ans+temp;
break;
}
}
}
void atom
(int *ans
)
{
switch(tok_type
)
{
case VAR:
*ans=find_var
(token
);
get_token
();
return;
case NR:
*ans=atoi
(token
);
get_token
();
return;
}
}
void get_token
(void)
{
char *temp;
tok_type=
0;
temp=token;
*temp=
'\0';
if (!*prog
) return;
while(isspace
(*prog
)) ++prog;
if (strchr
("+-*/=()", *prog
))
{
tok_type=DEL;
*temp++=*prog++;
}
else if(isalpha
(*prog
))
{
while(!isdelim
(*prog
)) *temp++=*prog++;
tok_type=VAR;
}
else if(isdigit
(*prog
))
{
while(!isdelim
(*prog
)) *temp++=*prog++;
tok_type=NR;
}
*temp=
'\0';
}
isdelim
(char c
)
{
if (strchr
(" +-/*=()", c
) || c==
9 || c==
'\r' || c==
0)
return 1;
return 0;
}
int find_var
(char *s
)
{
if(!isalpha
(*s
)) return 0;
return vars
[toupper
(*token
)-
'A'];
}