Пример #1
0
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();
}
Пример #2
0
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;
}
Пример #3
0
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();
    }
  }
}
Пример #4
0
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();
    }
  }
}