Untitled
unknown
plain_text
4 years ago
5.3 kB
6
Indexable
int evaluateTree(BTNode *root) {
int retval = 0, lv = 0, rv = 0;
int i,j;
int left,right;
if (root != NULL) {
switch (root->data) {
case ID:
retval = getval(root->lexeme);
r[number]=retval;
for(i=0;i<sbcount;i++)
{
if( strcmp(table[i].name,root->lexeme)==0 )
{
printf("MOV r%d [%d]\n",number,i*4);
break;
}
}
number++;
break;
case INT:
retval = atoi(root->lexeme);
r[number]=retval;
printf("MOV r%d %d\n",number,r[number]);
number++;
break;
case ASSIGN:
rv = evaluateTree(root->right);
retval = setval(root->left->lexeme, rv);
for(i=0;i<sbcount;i++)
{
if( strcmp(table[i].name,root->left->lexeme)==0)
{
for(j=number-1;j>=0;j--)
{
if(rv==r[j])
{
printf("MOV [%d] r%d\n",i*4,j);
break;
}
}
break;
}
}
break;
case ADDSUB:
case MULDIV:
if (root -> left == NULL || root -> right == NULL) {
err(NOVALUE);
}
lv = evaluateTree(root->left);
rv = evaluateTree(root->right);
right = --number;
left = --number;
number++;
if (strcmp(root->lexeme, "+") == 0) {
retval = lv + rv;
r[left]=retval; r[right]=0;
printf("ADD r%d r%d\n",left,right);
} else if (strcmp(root->lexeme, "-") == 0) {
retval = lv - rv;
r[left]=retval; r[right]=0;
printf("SUB r%d r%d\n",left,right);
} else if (strcmp(root->lexeme, "*") == 0) {
retval = lv * rv;
r[left]=retval; r[right]=0;
printf("MUL r%d r%d\n",left,right);
} else if (strcmp(root->lexeme, "/") == 0) {
if (rv == 0){
look_value=0;
look(root->right);
if(look_value)
retval = 0;
else
error(DIVZERO);
}
else retval = lv / rv;
r[left]=retval; r[right]=0;
printf("DIV r%d r%d\n",left,right);
}
break;
case INCDEC:
if (root -> left == NULL || root -> right == NULL) {
err(NOVALUE);
}
lv = evaluateTree(root->left);
rv = evaluateTree(root->right);
right = --number;
left = --number;
number++;
number++;
if (strcmp(root->lexeme, "++") == 0) {
retval=lv+rv;
setval(root->right->lexeme, retval);
r[left]=1; r[right]=retval;
printf("ADD r%d r%d\n",right,left);
} else if (strcmp(root->lexeme, "--") == 0) {
retval=rv-lv;
setval(root->right->lexeme, retval);
r[left]=1; r[right]=retval;
printf("SUB r%d r%d\n",right,left);
}
break;
case AND:
case OR:
case XOR:
if (root -> left == NULL || root -> right == NULL) {
err(NOVALUE);
}
lv = evaluateTree(root->left);
rv = evaluateTree(root->right);
right = --number;
left = --number;
number++;
if (strcmp(root->lexeme, "&") == 0) {
retval = lv & rv;
r[left]=retval; r[right]=0;
printf("AND r%d r%d\n",left,right);
} else if (strcmp(root->lexeme, "|") == 0) {
retval = lv | rv;
r[left]=retval; r[right]=0;
printf("OR r%d r%d\n",left,right);
} else if (strcmp(root->lexeme, "^") == 0) {
retval = lv ^ rv;
r[left]=retval; r[right]=0;
printf("XOR r%d r%d\n",left,right);
}
break;
default:
retval = 0;
}
}
return retval;
}Editor is loading...