double evaluate(char *expr) { int i = 0; char ch; memset(&buf[0], 0, MAXLEN); pos = 0; while((ch = *expr++) != '\0') { if(!isspace(ch)) { buf[i++] = ch; } } return addexpr(); }
double atom() { double res = NAN; if(isdigit(top())) { res = literal(); } else if(top() == '(') { next(); res = addexpr(); next(); } else if(top() == '-') { next(); res = -atom(); } return res; }
void dereference(void) /* assume address has already been pushed */ { while(tokeq(".") || tokeq("[") || tokeq("^")) { if(tokeq(".")) { scan(); g_pop_bx(); g_add_bx(member()); g_push_bx(); } else if(tokeq("[")) { scan(); addexpr(); if(tokeq("]")) { scan(); g_pop_ax(); g_pop_bx(); g_add_bx_ax(); g_push_bx(); } else { error("Missing ]"); } } else if(tokeq("^")) { scan(); g_pop_bx(); g_mov_ax_BX(); g_push_ax(); } } }
void compexpr(int findvar) { char x, y; if (findvar) { if(tokeq("*")) { scan(); shouldsym = name(1); } else { shouldsym = name(0); } g_pop_bx(); g_push_BX(); } else { addexpr(); } while(tokeq("=") || tokeq("<>") || tokeq(">") || tokeq(">=") || tokeq("<") || tokeq("<=")) { x = token[0]; y = token[1]; scan(); addexpr(); if(x == '=') { g_pop_ax(); g_pop_dx(); g_sub_ax_dx(); g_jz(+3); g_xor_ax_ax(); g_dec_ax(); g_label(); g_inc_ax(); g_push_ax(); } if(x == '<' && y == '>') { g_pop_ax(); g_pop_dx(); g_xor_cx_cx(); g_sub_ax_dx(); g_jz(+1); g_inc_cx(); g_label(); g_push_cx(); } if(x == '<' && y == 0) { g_pop_dx(); g_pop_ax(); g_xor_cx_cx(); g_cmp_ax_dx(); g_jge(+1); g_inc_cx(); g_label(); g_push_cx(); } if(x == '>' && y == 0) { g_pop_dx(); g_pop_ax(); g_xor_cx_cx(); g_cmp_ax_dx(); g_jle(+1); g_inc_cx(); g_label(); g_push_cx(); } if(x == '<' && y == '=') { g_pop_dx(); g_pop_ax(); g_xor_cx_cx(); g_cmp_ax_dx(); g_jg(+1); g_inc_cx(); g_label(); g_push_cx(); } if(x == '>' && y == '=') { g_pop_dx(); g_pop_ax(); g_xor_cx_cx(); g_cmp_ax_dx(); g_jl(+1); g_inc_cx(); g_label(); g_push_cx(); } } }