void SemanticEval::evaluateNumericExpr(ExpressionValue& ev, int line) {
  if(!ev.isPrimitive() || !ev.isNumeric()) {
    stringstream err;
    err << "Esperando uma expressão numérica. Encontrado expressão \"" << ev.toString() << "\"";
    ErrorHandler::self()->add(err.str(), line);
  }
}
void SemanticEval::evaluateAttribution(ExpressionValue&  lv, ExpressionValue& rv, int line) {
//lvalue e rvalue devem ter tipos compativeis
//  -numericos (inteiro, logico, real, caractere) sao compativeis entre si.

  stringstream msg;

  if(!lv.isPrimitive()) {
    msg << "Apenas variáveis de tipos primitivos podem receber valores";
    ErrorHandler::self()->add(msg.str(), line);
    return;
  }

  if(rv.primitiveType() == TIPO_NULO) {
    msg << "Expressão não retorna resultado para variável";  
    ErrorHandler::self()->add(msg.str(), line);
  } else  if(!lv.isCompatibleWidth(rv)) {
    msg << "Variável não pode receber valores do tipo '"
        << rv.toString() << "'";      
    ErrorHandler::self()->add(msg.str(), line);
  }
}