Ejemplo n.º 1
0
    Symbol::State Sentence::Evaluate() const
    {
      switch(type)
	{
	case T_TRUE:
	  return Symbol::KNOWN_TRUE;
	  break;
	case T_FALSE:
	  return Symbol::KNOWN_FALSE;
	  break;
	case T_SYMBOL:
	  return symbol->GetValue();
	  break;
	case T_UNARY:
	  {
	    Symbol::State t = rhs->Evaluate();
	    if(t == Symbol::UNKNOWN)
	      {
		return t;
	      }
	    switch(op)
	      {
	      case O_NOT:
		if(t == Symbol::KNOWN_TRUE)
		  {
		    return Symbol::KNOWN_FALSE;
		  }
		else if(t == Symbol::KNOWN_FALSE)
		  {
		    return Symbol::KNOWN_TRUE;
		  }
		else
		  {
		    std::cerr << "Unknown Symbol Value." << std::endl;
		    { int *i = 0; (*i) = 0; }
		    return Symbol::UNKNOWN;
		  }
		break;
	      default:
		std::cerr << "Unknown Sentence Operator." << std::endl;
		{ int *i = 0; (*i) = 0; }
		return Symbol::UNKNOWN;
		break;
	      }
	  }
	  break;
	case T_BINARY:
	  return EvaluateBinary();
	  break;
	default:
	  std::cerr << "Unknown Sentence Type." << std::endl;
	  { int *i = 0; (*i) = 0; }
	  return Symbol::UNKNOWN;
	  break;
	}
    }
Ejemplo n.º 2
0
//
//	Evaluate (flatten) the specified expression and
//	return it's numeric value
//
bool Evaluate(HGRIDITEM hParent, ExprNode *expr, size_w baseOffset, HWND hwndHV, HWND hwndGV, ExprNode *result)
{
	//unsigned left, right, cond;
	ExprNode left;//(EXPR_NUMBER, TOK_INUMBER);
	ExprNode right;//(EXPR_NUMBER, TOK_INUMBER);
	ExprNode cond;//(/EXPR_NUMBER, TOK_INUMBER);

	Symbol *sym;
	GVITEM gvitem	= { 0 };
	GVITEM gvi2		= { 0 };

	if(expr == 0)
		return false;

	switch(expr->type)
	{
	case EXPR_IDENTIFIER:
	case EXPR_FIELD:

		HGRIDITEM hItem;
		
		// look for the note in the GridView that corresponds to the field expression!
		if((hItem = FindGridItem(hParent, expr, hwndGV)) == 0)
		{
			// not a field. maybe it's an enum tag though?
			if(expr->type == EXPR_IDENTIFIER)
			{
				if((sym = LookupSymbol(globalIdentifierList, expr->str)) == 0)
					return false;
				
				if(sym->type->ty == typeENUMVALUE)
				{
					result->val = sym->type->evptr->val;
					result->tok = TOK_INUMBER;
					return true;
					//Enum *e = sym->type->evptr->parent;
					//return e->Evaluate(sym->name, &result);
				}
				else
				{
					// lvalue is not a structure!
					return false;
				}
			}
			
			return false;
		}

		gvitem.iSubItem		= COLIDX_OFFSET;
		gvitem.mask	= GVIF_PARAM;
		GridView2_GetItem(hwndGV, hItem, &gvitem);

		gvi2.iSubItem		= COLIDX_OFFSET;
		gvi2.mask		= GVIF_PARAM;
		GridView2_GetItem(hwndGV, hParent, &gvi2);

		HexView_GetData(hwndHV, gvitem.param + gvi2.param, (BYTE *)result, sizeof(*result));
		return true;

	case EXPR_NUMBER:
		*result = *expr;
		//*result = (expr->tok == TOK_INUMBER) ? expr->val : (int)expr->fval;
		return true;

	//case EXPR_IDENTIFIER:
		// is it a structure member?

	case EXPR_UNARY:

		if(Evaluate(hParent, expr->left, baseOffset, hwndHV, hwndGV, &left))
		{
			if(left.tok == TOK_INUMBER)
			{
				result->tok = TOK_INUMBER;			
				return EvaluateUnary(left.val, expr->tok, &result->val);
			}
			else
			{
				result->tok = TOK_FNUMBER;			
				return EvaluateUnary(left.fval, expr->tok, &result->fval);
			}
		}
		else
		{
			return false;
		}
		
	case EXPR_BINARY:

		if(Evaluate(hParent, expr->left, baseOffset, hwndHV, hwndGV, &left) &&
		   Evaluate(hParent, expr->right, baseOffset, hwndHV, hwndGV, &right))
		{
			if(left.tok == TOK_INUMBER && right.tok == TOK_FNUMBER)
			{
				// we need to convert so they are the same base
				left.fval = (double)(signed __int64)left.val;
				left.tok  = TOK_FNUMBER;
			}
			else if(left.tok == TOK_FNUMBER && right.tok == TOK_INUMBER)
			{
				right.fval = (double)(signed __int64)right.val;
				right.tok  = TOK_FNUMBER;
			}

			if(left.tok == TOK_INUMBER)
			{
				result->tok = TOK_INUMBER;
				return EvaluateBinary(left.val, right.val, expr->tok, &result->val);
			}
			else
			{
				result->tok = TOK_FNUMBER;
				return EvaluateBinary(left.fval, right.fval, expr->tok, &result->fval);
			}
		}
		else
		{
			return false;
		}


	case EXPR_TERTIARY:

		if(Evaluate(hParent, expr->cond, baseOffset, hwndHV, hwndGV, &cond))
		{
			if(cond.val)
			{
				if(Evaluate(hParent, expr->left, baseOffset, hwndHV, hwndGV, &left))
					*result = left;
				else
					return false;
			}
			else
			{
				if(Evaluate(hParent, expr->right, baseOffset, hwndHV, hwndGV, &right))
					*result = right;
				else
					return false;
			}

			return true;
		}
		else
		{
			return false;
		}

	default:
		// don't understand anything else
		return false;
	}
}