diff --git a/src/language.yacc b/src/language.yacc
index 05bf04b611c2732c6781dde026506260349c7f78..55ac4caf9b6dc70dd632cc84a4c98fbab2b0ac89 100644
--- a/src/language.yacc
+++ b/src/language.yacc
@@ -179,7 +179,7 @@
 /* This is the grammar definition of Pike. */
 
 #include "global.h"
-RCSID("$Id: language.yacc,v 1.101 1998/08/29 21:33:05 grubba Exp $");
+RCSID("$Id: language.yacc,v 1.102 1998/08/29 22:15:15 grubba Exp $");
 #ifdef HAVE_MEMORY_H
 #include <memory.h>
 #endif
@@ -1614,7 +1614,8 @@ expr4: string
 idents: low_idents
   | idents '.' F_IDENTIFIER
   {
-    $$=index_node($1, $3->u.sval.u.string);
+    $$=index_node($1, last_identifier?last_identifier->str:NULL,
+		  $3->u.sval.u.string);
     free_node($1);
     if(last_identifier) free_string(last_identifier);
     copy_shared_string(last_identifier, $3->u.sval.u.string);
@@ -1628,7 +1629,7 @@ idents: low_idents
     SAFE_APPLY_MASTER("handle_import",2);
     tmp=mkconstantsvaluenode(sp-1);
     pop_stack();
-    $$=index_node(tmp, $2->u.sval.u.string);
+    $$=index_node(tmp, ".", $2->u.sval.u.string);
     free_node(tmp);
     if(last_identifier) free_string(last_identifier);
     copy_shared_string(last_identifier, $2->u.sval.u.string);
@@ -1673,9 +1674,11 @@ low_idents: F_IDENTIFIER
 #ifdef __CHECKER__
     tmp.subtype=0;
 #endif /* __CHECKER__ */
+    if(last_identifier) free_string(last_identifier);
+    copy_shared_string(last_identifier, $3->u.sval.u.string);
     tmp.u.mapping=get_builtin_constants();
     tmp2=mkconstantsvaluenode(&tmp);
-    $$=index_node(tmp2, $3->u.sval.u.string);
+    $$=index_node(tmp2, "predef", $3->u.sval.u.string);
     free_node(tmp2);
     free_node($3);
   }
@@ -1685,6 +1688,9 @@ low_idents: F_IDENTIFIER
   }
   | F_IDENTIFIER F_COLON_COLON F_IDENTIFIER
   {
+    if(last_identifier) free_string(last_identifier);
+    copy_shared_string(last_identifier, $3->u.sval.u.string);
+
     $$=reference_inherited_identifier($1->u.sval.u.string,
 				     $3->u.sval.u.string);
     if (!$$)
@@ -1704,6 +1710,9 @@ low_idents: F_IDENTIFIER
   {
     int e,i;
 
+    if(last_identifier) free_string(last_identifier);
+    copy_shared_string(last_identifier, $2->u.sval.u.string);
+
     $$=0;
     for(e=1;e<(int)new_program->num_inherits;e++)
     {
diff --git a/src/las.c b/src/las.c
index 88457d5795514333fae2cb6f0a60f7a6a3912cf9..a0c778bc4b72c3fcdfc158b1c0299f4c92df140e 100644
--- a/src/las.c
+++ b/src/las.c
@@ -4,7 +4,7 @@
 ||| See the files COPYING and DISCLAIMER for more information.
 \*/
 #include "global.h"
-RCSID("$Id: las.c,v 1.65 1998/08/05 22:48:01 hubbe Exp $");
+RCSID("$Id: las.c,v 1.66 1998/08/29 22:15:17 grubba Exp $");
 
 #include "language.h"
 #include "interpret.h"
@@ -680,7 +680,7 @@ void resolv_program(node *n)
 
 
 
-node *index_node(node *n, struct pike_string * id)
+node *index_node(node *n, char *node_name, struct pike_string *id)
 {
   node *ret;
   JMP_BUF tmp;
@@ -695,23 +695,38 @@ node *index_node(node *n, struct pike_string * id)
     APPLY_MASTER("handle_error", 1);
     pop_stack();
     UNSET_ONERROR(tmp);
-    
-    yyerror("Couldn't index module.");
+
+    if (node_name) {
+      my_yyerror("Couldn't index module '%s'.", node_name);
+    } else {
+      yyerror("Couldn't index module.");
+    }
     push_int(0);
   }else{
     resolv_constant(n);
     switch(sp[-1].type)
     {
     case T_INT:
-      if(!num_parse_error)
-	yyerror("Failed to index module (module doesn't exist?)");
+      if(!num_parse_error) {
+	if (node_name) {
+	  my_yyerror("Failed to index module '%s' (module doesn't exist?)",
+		     node_name);
+	} else {
+	  yyerror("Failed to index module (module doesn't exist?)");
+	}
+      }
       break;
 
     case T_PROGRAM:
     case T_FLOAT:
     case T_STRING:
     case T_ARRAY:
-      yyerror("Failed to index module (Not a module?)");
+      if (node_name) {
+	my_yyerror("Failed to index module '%s' (Not a module?)",
+		   node_name);
+      } else {
+	yyerror("Failed to index module (Not a module?)");
+      }
       pop_stack();
       push_int(0);
       break;
@@ -733,7 +748,12 @@ node *index_node(node *n, struct pike_string * id)
 	   !sp[-1].u.integer &&
 	   sp[-1].subtype==NUMBER_UNDEFINED)
 	{
-	  my_yyerror("Index '%s' not present in module.",id->str);
+	  if (node_name) {
+	    my_yyerror("Index '%s' not present in module '%s'.",
+		       id->str, node_name);
+	  } else {
+	    my_yyerror("Index '%s' not present in module.", id->str);
+	  }
 	}
 	END_CYCLIC();
       }
diff --git a/src/las.h b/src/las.h
index 7a308693cb76005d1b599cad221bd2cee30d3baa..8b63e0dc0442ecf73f8805046ab8a43ea6eaeac8 100644
--- a/src/las.h
+++ b/src/las.h
@@ -5,7 +5,7 @@
 \*/
 
 /*
- * $Id: las.h,v 1.15 1998/06/06 03:27:26 hubbe Exp $
+ * $Id: las.h,v 1.16 1998/08/29 22:15:18 grubba Exp $
  */
 #ifndef LAS_H
 #define LAS_H
@@ -86,7 +86,7 @@ node *mkexternalnode(int level,
 node *mkcastnode(struct pike_string *type,node *n);
 void resolv_constant(node *n);
 void resolv_program(node *n);
-node *index_node(node *n, struct pike_string * id);
+node *index_node(node *n, char *node_name, struct pike_string * id);
 int node_is_eq(node *a,node *b);
 node *mkconstantsvaluenode(struct svalue *s);
 node *mkliteralsvaluenode(struct svalue *s);