Index: tol/btol/bgrammar/oprimp.cpp
===================================================================
--- tol/btol/bgrammar/oprimp.cpp	(revision 46c93bf0d89373830a846c2b88a5c25b9bfc9674)
+++ tol/btol/bgrammar/oprimp.cpp	(revision c5f245dcafe720d114831f73b18cd5366e970806)
@@ -51,5 +51,8 @@
 BTraceInit("oprimp.cpp");
 
-      BText   BEqualOperator::creatingName_;
+BText BEqualOperator::creatingName_;
+BText BEqualOperator::currentFatherName_;
+bool   BEqualOperator::isCreatingNameBlock_= false;
+BText BEqualOperator::currentFullName_;
 const BClass* BEqualOperator::creatingClass_ = NULL;
 
@@ -812,7 +815,25 @@
                           name, rest, str, cls);
   creatingClass_ = NULL;
-  if(gra==GraNameBlock()) 
+  bool oldIsCreatingNameBlock = isCreatingNameBlock_;
+  bool isNameBlock = gra==GraNameBlock();
+  isCreatingNameBlock_ = isNameBlock;
+
+  BText oldName, oldFullName;
+  const BClass* oldClass;
+  if(isNameBlock) 
   { 
+    oldFullName = currentFullName_;
+    currentFatherName_ = oldFullName;
+    oldName = creatingName_;
+    oldClass = creatingClass_;
     creatingName_  = name; 
+    if(currentFullName_.HasName())
+    {
+      currentFullName_ = currentFullName_ + "::" +name;
+    }
+    else
+    {
+      currentFullName_ = name;
+    }
     creatingClass_ = cls;
   }
@@ -843,4 +864,11 @@
 	  Error(I2("Bad use for \"=\" in\n", "Uso indebido de \"=\" en\n") +
 	        BParser::Unparse(argList));
+  }
+  if(isNameBlock) 
+  { 
+    currentFullName_ = currentFatherName_;
+    creatingName_    = oldName; 
+    creatingClass_   = oldClass;
+    isCreatingNameBlock_ = oldIsCreatingNameBlock;
   }
   return(result);
