#include "AST.h" #include "interp.h" static void printFunc(AST *args); int executeExpr(AST *p) { if(p == NULL) return 0; switch(p->op){ case NUM: return p->val; case SYM: return getValue(getSymbol(p)); case EQ_OP: return setValue(getSymbol(p->left),executeExpr(p->right)); case PLUS_OP: return executeExpr(p->left) + executeExpr(p->right); case MINUS_OP: return executeExpr(p->left) - executeExpr(p->right); case MUL_OP: return executeExpr(p->left) * executeExpr(p->right); case LT_OP: return executeExpr(p->left) < executeExpr(p->right); case GT_OP: return executeExpr(p->left) > executeExpr(p->right); case GET_ARRAY_OP: return getArray(executeExpr(p->left),executeExpr(p->right)); case SET_ARRAY_OP: return setArray(executeExpr(getNth(p->left,0)), executeExpr(getNth(p->left,1)), executeExpr(p->right)); case CALL_OP: return executeCallFunc(getSymbol(p->left),p->right); case PRINTLN_OP: printFunc(p->left); return 0; default: error("unknown operater/statement"); } } static void printFunc(AST *args) { printf((char *)executeExpr(getNth(args,0)), executeExpr(getNth(args,1))); printf("\n"); } /* * global variable */ void declareVariable(Symbol *vsym,AST *init_value) { if(init_value != NULL){ vsym->val = executeExpr(init_value); } } /* * Array */ void declareArray(Symbol *a, AST *size) { a->val = (int)malloc(sizeof(int)*executeExpr(size)); } int getArray(int a, int index) { int *ap; ap = (int *)a; return ap[index]; } int setArray(int a,int index,int value) { int *ap; ap = (int *)a; ap[index] = value; return value; }