예제 #1
0
Type TypeCheck_::check_expression(AST_Expression e)
{
  Type ct,t1,t2,t;
  switch (e->expressionType()) {
  case EXPBINOP:
  {
    AST_Expression_BinOp b = e->getAsBinOp();
    return check_binop(b->left() , b->right() , b->binopType());
  }
  case EXPUMINUS:
  {
    AST_Expression_UMinus b = e->getAsUMinus();
    t = check_expression(b->exp());
    if ( check_equal(t , T("Integer")) or check_equal(t , T("Real")) ) return t;
    throw "Type Error (3)";
  }

  case EXPOUTPUT :
  {
    AST_Expression_Output b = e->getAsOutput();
    return check_expression(b->expressionList()->front() );
  }

  case EXPIF:
  {
    AST_Expression_If b = e->getAsIf();
    ct = check_expression(b->condition() );
    t1 = check_expression(b->then() );
    t2 = check_expression(b->else_exp()); // Falta el elseIF
    if ( !check_equal(ct, T("Boolean")) ) throw "Type Error (4)";
    if ( !check_equal(t1,t2) ) throw "Type Error (5)";
    return t1;

  }

  case EXPCALL:
  {
    // Añadir las funciones en la listaaaa de variables
    AST_Expression_Call c = e->getAsCall();
    if ( toStr(c->name()) == "sample" ) return  T("Boolean");
    if ( toStr(c->name()) == "pre" ) 		
		return  check_expression(c->arguments()->front());
	return T("Real");
  }

  case EXPCOMPREF:
  {
    AST_Expression_ComponentReference b = e->getAsComponentReference();

    VarInfo  tt = varEnv->lookup(  toStr(b->names()->front()) );

    if (tt == NULL) {
      cerr << "Var:" <<  b->names()->front() << ":";
      throw "Variable no existe (8)";
    }
    if (b->indexes()->front()->size() == 0)
      return tt->type();
    else {
      Type t = tt->type();
      AST_ExpressionListIterator exit;
      foreach(exit , b->indexes()->front() )
      if (t->getType() == TYARRAY)
        t = t->getAsArray()->arrayOf();
      else throw "Type Error (7)";
      return t;
    }

    break;
  }
  case EXPDERIVATIVE:
    return T("Real");
  case EXPBOOLEAN:
    return T("Boolean");
  case EXPSTRING:
    return T("String");
  case EXPREAL:
    return T("Real");
  case EXPINTEGER:
    return T("Integer");
  case EXPBOOLEANNOT:
  {
    AST_Expression_BooleanNot b = e->getAsBooleanNot();
    t = check_expression(b->exp());
    if ( !check_equal(t, T("Boolean")) ) throw "Type Error (6)";
    return t;
  }
  default:
    throw "No implrementado aun! (check_expression)";

  }
}
예제 #2
0
int
MMO_EvalInitExp_::foldTraverseElement (AST_Expression exp)
{
  int ret = 0;
  switch (exp->expressionType ())
    {
    case EXPCOMPREF:
      {
	AST_Expression_ComponentReference cr = exp->getAsComponentReference ();
	VarInfo vi = _vt->lookup (cr->name ());
	if (vi == NULL)
	  {
	    Error::getInstance ()->add (exp->lineNum (),
	    EM_IR | EM_VARIABLE_NOT_FOUND,
					ER_Error, "%s", cr->name ().c_str ());
	    return (ret);
	  }
	if (!vi->isConstant ())
	  {
	    Error::getInstance ()->add (
		exp->lineNum (), EM_IR | EM_INIT_EXP, ER_Error,
		"Only constants allowed inside initial expressions. %s",
		cr->name ().c_str ());
	    return (ret);
	  }
	return (vi->value ());
      }
    case EXPBOOLEAN:
      {
	AST_Expression_Boolean eb = exp->getAsBoolean ();
	if (eb->value ())
	  {
	    return (1);
	  }
	else
	  {
	    return (0);
	  }
      }
    case EXPBOOLEANNOT:
      {
	AST_Expression_BooleanNot ebn = exp->getAsBooleanNot ();
	int res = foldTraverse (ebn->exp ());
	if (res == 0)
	  {
	    return (1);
	  }
	else
	  {
	    return (0);
	  }
      }
    case EXPREAL:
      Error::getInstance ()->add (
	  0, EM_IR | EM_INIT_EXP, ER_Warning,
	  "Implicit conversion from Real to Integer, in initial expression.");
      return (exp->getAsReal ()->val ());
    case EXPINTEGER:
      return (exp->getAsInteger ()->val ());
    default:
      Error::getInstance ()->add (
	  0,
	  EM_IR | EM_INIT_EXP,
	  ER_Warning,
	  "Initial expression not recognized, returning zero as default value.");
      break;
    }
  return (ret);
}