#include<stdio.h>
#include<string.h>
#include<ctype.h>
#include<stdlib.h>
#define DELIMITER 1
#define VARIABLE 2
#define NUMBER 3
char expr1[1011],aux[1011],*prog,varb[26],ccc;
int 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};
int l,i,j,ok,k,lv,p,sol,n,cc;
char token[80];
char tok_type;
void eval_exp(int *answer);
void eval_exp1(int *answer);
void eval_exp2(int *answer);
void eval_exp3(int *answer);
void eval_exp4(int *answer);
void eval_exp5(int *answer);
void eval_exp6(int *answer);
void atom(int *answer);
void get_token();
void putback();
void serror(int error);
int find_var(char *s);
int isdelim(char cc);
int main()
{
FILE *f,*g;
f=fopen("bool.in","r");
g=fopen("bool.out","w");
fgets(aux,1002,f);
l=strlen(aux);
while(i<l)
{ if(aux[i]==' ')i++;
else if(aux[i]=='T'&&aux[i+1]=='R'){expr1[j]='1';i=i+4;j++;}
else if(aux[i]=='F'&&aux[i+1]=='A'){expr1[j]='0';i=i+5;j++;}
else if(aux[i]=='O'&&aux[i+1]=='R'){expr1[j]='+';i=i+2;j++;}
else if(aux[i]=='A'&&aux[i+1]=='N'){expr1[j]='*';i=i+3;j++;}
else if(aux[i]=='N'&&aux[i+1]=='O'){expr1[j]='-';i=i+3;j++;}
else if(aux[i]==')'){expr1[j]=aux[i];i++;j++;}
else if(aux[i]=='('){expr1[j]=aux[i];i++;j++;}
else if(aux[i]=='\n'){expr1[j]=aux[i];i++;j++;}
else { ok=1;
for(k=0;k<=lv;k++)
if(aux[i]==varb[k]){ ok=0;break;}
if(ok) {varb[lv]=aux[i];lv++;}
expr1[j]=aux[i];i++;j++;
}
}
prog=expr1;
eval_exp(&sol);
fscanf(f,"%d",&n);
fscanf(f,"%c",&ccc);
for(i=1;i<=n;i++)
{ fscanf(f,"%c",&ccc);
if(!strchr(varb,ccc))
fprintf(g,"%d",sol);
else
{ prog=expr1;
cc=toupper(ccc)-'A';
vars[cc]=1-vars[cc];
eval_exp(&sol);
fprintf(g,"%d",sol);
}
}
fprintf(g,"\n");
fcloseall();
return 0;
}
void eval_exp(int *answer)
{
get_token();
if(!*token)
{
serror(2);
return;
}
eval_exp1(answer);
}
void eval_exp1(int *answer)
{
int slot;
char ttok_type;
char temp_token[80];
if(tok_type==VARIABLE)
{
strcpy(temp_token,token);
ttok_type=tok_type;
slot=toupper(*token)-'A';
get_token();
if(*token!='=')
{
putback();
strcpy(token,temp_token);
tok_type=ttok_type;
}
else
{
get_token();
eval_exp2(answer);
vars[slot]=*answer;
return;
}
}
eval_exp2(answer);
}
void eval_exp2(int *answer)
{
char op;
int temp;
eval_exp3(answer);
while((op=*token)=='+'||op=='#')
{
get_token();
eval_exp3(&temp);
switch(op)
{
case '+':*answer=*answer||temp;break;
case '#':*answer=*answer||temp;break;
}
}
}
void eval_exp3(int *answer)
{
char op;
int temp;
eval_exp4(answer);
while((op=*token)=='*'||op=='#')
{
get_token();
eval_exp4(&temp);
switch(op)
{
case '*':*answer=*answer&&temp;break;
case '#':*answer=*answer&&temp;break;
}
}
}
void eval_exp4(int *answer)
{
eval_exp5(answer);
if(*token=='^')
{
*answer=*answer+2;
}
}
void eval_exp5(int *answer)
{
char op;
op=0;
if((tok_type==DELIMITER)&& *token=='-')
{
op=*token;
get_token();
}
eval_exp6(answer);
if(op=='-') *answer=1-(*answer);
}
void eval_exp6( int *answer)
{
if(*token=='(')
{
get_token();
eval_exp2(answer);
if(*token!=')')
serror(1);
get_token();
}
else
atom(answer);
}
void atom(int *answer)
{
switch(tok_type)
{
case VARIABLE: *answer=find_var(token);get_token();return;
case NUMBER: *answer=atoi(token);get_token();return;
default : serror(0);
}
}
void putback()
{
char *t;
t=token;
for(;*t;t++) prog--;
}
void serror(int error)
{
char *e[]={
"syntax error",
"unbalanced parentheses",
"no expresion present"
};
printf("%s\n",e[error]);
}
void get_token()
{
char *temp;
tok_type=0;
temp=token;
*temp='\0';
if(*prog=='\n') return;
while(isspace(*prog))++prog;
if(strchr("+-*()",*prog))
{
tok_type=DELIMITER;
*temp++ =*prog++;
}
else
if(isalpha(*prog))
{
while(!isdelim(*prog))
*temp++=*prog++;
tok_type=VARIABLE;
}
else
if(isdigit(*prog))
{
while(!isdelim(*prog))
*temp++=*prog++;
tok_type=NUMBER;
}
*temp='\0';
}
int isdelim(char cc)
{
if(strchr("+-*()",cc)||cc==9||cc==0)
return 1;
return 0;
}
int find_var(char *s)
{
if(!isalpha(*s))
{ serror(1);
return 0;
}
return vars[toupper(*token)-'A'];
}