[Avida-SVN] r2477 - development/source/script

brysonda at myxo.css.msu.edu brysonda at myxo.css.msu.edu
Wed Mar 19 16:47:55 PDT 2008


Author: brysonda
Date: 2008-03-19 19:47:55 -0400 (Wed, 19 Mar 2008)
New Revision: 2477

Modified:
   development/source/script/AvidaScript.h
   development/source/script/cDirectInterpretASTVisitor.cc
   development/source/script/cDirectInterpretASTVisitor.h
   development/source/script/cDumpASTVisitor.cc
   development/source/script/cLexer.l
   development/source/script/cParser.cc
   development/source/script/cSemanticASTVisitor.cc
Log:
AS:
Working dict type.

Modified: development/source/script/AvidaScript.h
===================================================================
--- development/source/script/AvidaScript.h	2008-03-19 17:59:34 UTC (rev 2476)
+++ development/source/script/AvidaScript.h	2008-03-19 23:47:55 UTC (rev 2477)
@@ -70,9 +70,10 @@
   AS_TOKEN_ARR_WILD,
   
   AS_TOKEN_LITERAL_DICT, // 33
+  AS_TOKEN_DICT_MAPPING,
   AS_TOKEN_LITERAL_MATRIX,
   
-  AS_TOKEN_TYPE_ARRAY, // 35
+  AS_TOKEN_TYPE_ARRAY, // 36
   AS_TOKEN_TYPE_BOOL,
   AS_TOKEN_TYPE_CHAR,
   AS_TOKEN_TYPE_DICT,
@@ -83,27 +84,27 @@
   AS_TOKEN_TYPE_VAR,
   AS_TOKEN_TYPE_VOID,
   
-  AS_TOKEN_CMD_IF, // 45
+  AS_TOKEN_CMD_IF, // 46
   AS_TOKEN_CMD_ELSE,
   AS_TOKEN_CMD_ELSEIF,
   AS_TOKEN_CMD_WHILE,
   AS_TOKEN_CMD_FOREACH,
   AS_TOKEN_CMD_FUNCTION,
   
-  AS_TOKEN_CMD_RETURN, // 51
+  AS_TOKEN_CMD_RETURN, // 52
   
-  AS_TOKEN_BUILTIN_CALL, // 52
+  AS_TOKEN_BUILTIN_CALL, // 53
   AS_TOKEN_BUILTIN_METHOD,
   
-  AS_TOKEN_ID, // 54
+  AS_TOKEN_ID, // 55
   
-  AS_TOKEN_FLOAT, // 55
+  AS_TOKEN_FLOAT, // 56
   AS_TOKEN_INT,
   AS_TOKEN_STRING,
   AS_TOKEN_CHAR,
   AS_TOKEN_BOOL,
   
-  AS_TOKEN_UNKNOWN, // 59
+  AS_TOKEN_UNKNOWN, // 60
   AS_TOKEN_INVALID
 } ASToken_t;
 
@@ -156,7 +157,9 @@
 typedef enum eASDirectInterpretErrors {
   AS_DIRECT_INTERPRET_ERR_DIVISION_BY_ZERO,
   AS_DIRECT_INTERPRET_ERR_INDEX_OUT_OF_BOUNDS,
+  AS_DIRECT_INTERPRET_ERR_INDEX_ERROR,
   AS_DIRECT_INTERPRET_ERR_INVALID_ARRAY_SIZE,
+  AS_DIRECT_INTERPRET_ERR_KEY_NOT_FOUND,
   AS_DIRECT_INTERPRET_ERR_OBJECT_ASSIGN_FAIL,
   AS_DIRECT_INTERPRET_ERR_TYPE_CAST,
   AS_DIRECT_INTERPRET_ERR_UNDEFINED_TYPE_OP,

Modified: development/source/script/cDirectInterpretASTVisitor.cc
===================================================================
--- development/source/script/cDirectInterpretASTVisitor.cc	2008-03-19 17:59:34 UTC (rev 2476)
+++ development/source/script/cDirectInterpretASTVisitor.cc	2008-03-19 23:47:55 UTC (rev 2477)
@@ -162,7 +162,11 @@
   
   node.GetExpression()->Accept(*this);
   
-  if (!obj->Set(m_rtype.type, m_rvalue)) INTERPRET_ERROR(OBJECT_ASSIGN_FAIL);
+  sAggregateValue val(m_rtype, m_rvalue);
+  if (!obj->Set(val)) {
+    val.Cleanup();
+    INTERPRET_ERROR(OBJECT_ASSIGN_FAIL);
+  }
 }
 
 
@@ -689,26 +693,79 @@
     case TOKEN(IDX_OPEN):
       if (m_obj_assign) {
         cObjectRef* obj = lval.as_ref;
-        sAggregateValue idx(m_rtype, m_rvalue);
+        sAggregateValue idx(rtype, rval);
+        sAggregateValue o_val;
         
-        // @TODO - handle dict indexing
+        if (!obj->Get(o_val)) {
+          idx.Cleanup();
+          INTERPRET_ERROR(INDEX_ERROR);
+        }
         
-        if (obj->GetType() != TYPE(ARRAY))
-          INTERPRET_ERROR(UNDEFINED_TYPE_OP, mapToken(TOKEN(IDX_OPEN)), mapType(obj->GetType()));
+        switch (o_val.type.type) {
+          case TYPE(ARRAY):
+          case TYPE(DICT):
+          case TYPE(MATRIX):
+            break;
+            
+          default:
+            INTERPRET_ERROR(UNDEFINED_TYPE_OP, mapToken(TOKEN(IDX_OPEN)), mapType(o_val.type));
+        }
         
         m_rvalue.as_ref = new cObjectIndexRef(obj, idx);
         m_rtype = TYPE(OBJECT_REF);
       } else {
         
-        // @TODO - handle dict indexing
-        cLocalArray* arr = asArray(ltype, lval, node);
-        int idx = asInt(rtype, rval, node);
+        switch (ltype.type) {
+          case TYPE(ARRAY):
+            {
+              cLocalArray* arr = lval.as_array;
+              int idx = asInt(rtype, rval, node);
+              
+              if (idx < 0 || idx >= arr->GetSize()) INTERPRET_ERROR(INDEX_OUT_OF_BOUNDS);
+              
+              const sAggregateValue val = arr->Get(idx);
+              m_rtype = val.type;
+              m_rvalue = val.value;
+            }
+            break;
+            
+          case TYPE(DICT):
+            {
+              cLocalDict* dict = lval.as_dict;
+              sAggregateValue idx(rtype, rval);
+              
+              sAggregateValue val;
+              if (!dict->Get(idx, val)) {
+                idx.Cleanup();
+                INTERPRET_ERROR(KEY_NOT_FOUND);
+              }
+              
+              idx.Cleanup();
+
+              m_rtype = val.type;
+              m_rvalue = val.value;
+            }
+            break;
+            
+          case TYPE(MATRIX): // @TODO - indexing 
+            INTERPRET_ERROR(INTERNAL);
+            
+          case TYPE(STRING):
+          {
+            cString* str = lval.as_string;
+            int idx = asInt(rtype, rval, node);
+            if (idx < 0 || idx >= str->GetSize()) INTERPRET_ERROR(INDEX_OUT_OF_BOUNDS);
+
+            m_rtype = TYPE(CHAR);
+            m_rvalue.as_char = (*str)[idx];
+            delete str;
+          }
+            
+          default:
+            INTERPRET_ERROR(TYPE_CAST, mapType(ltype.type), mapType(TYPE(ARRAY)));
+        }
         
-        if (idx < 0 || idx >= arr->GetSize()) INTERPRET_ERROR(INDEX_OUT_OF_BOUNDS);
         
-        const sAggregateValue val = arr->Get(idx);
-        m_rtype = val.type;
-        m_rvalue = val.value;
       }
       break;
       
@@ -1106,7 +1163,7 @@
   if (m_obj_assign) {
     switch (node.GetType().type) {
       case TYPE(ARRAY):       m_rvalue.as_ref = new cArrayVarRef(m_call_stack[sp + var_id].value); break;
-      case TYPE(DICT):        INTERPRET_ERROR(INTERNAL); // @TODO - var ref object assignment
+      case TYPE(DICT):        m_rvalue.as_ref = new cDictVarRef(m_call_stack[sp + var_id].value); break;
       case TYPE(OBJECT_REF):  INTERPRET_ERROR(INTERNAL); // @TODO - var ref object assignment
       case TYPE(MATRIX):      INTERPRET_ERROR(INTERNAL); // @TODO - var ref object assignment
       case TYPE(STRING):      INTERPRET_ERROR(INTERNAL); // @TODO - var ref object assignment
@@ -1602,9 +1659,14 @@
 void cDirectInterpretASTVisitor::cLocalDict::Set(const sAggregateValue& idx, const sAggregateValue& val)
 {
   sAggregateValue o_val;
-  if (m_storage.Find(idx, o_val)) o_val.Cleanup();
+  if (m_storage.Find(idx, o_val)) {
+    o_val.Cleanup();
+    m_storage.SetValue(idx, val);
+    const_cast<sAggregateValue&>(idx).Cleanup();  // make sure to remove references to the index value
+  } else {
+    m_storage.SetValue(idx, val);
+  }
   
-  m_storage.SetValue(idx, val);
 }
 
 
@@ -1623,128 +1685,89 @@
 }
 
 
-sASTypeInfo cDirectInterpretASTVisitor::cArrayVarRef::GetType(const sAggregateValue& idx)
+bool cDirectInterpretASTVisitor::cArrayVarRef::Get(const sAggregateValue& idx, sAggregateValue& val)
 {
-  cLocalArray* arr = m_var.as_array;
-
   int idxi = -1;
   switch (idx.type.type) {
-    case TYPE(BOOL):    idxi = (idx.value.as_bool) ? 1 : 0; break;
-    case TYPE(CHAR):    idxi = (int)idx.value.as_char; break;
-    case TYPE(INT):     idxi = idx.value.as_int; break;
-    case TYPE(FLOAT):   idxi = (int)idx.value.as_float; break;
-    case TYPE(STRING):  idxi = idx.value.as_string->AsInt(); delete idx.value.as_string; break;
+    case TYPE(BOOL):        idxi = (idx.value.as_bool) ? 1 : 0; break;
+    case TYPE(CHAR):        idxi = (int)idx.value.as_char; break;
+    case TYPE(INT):         idxi = idx.value.as_int; break;
+    case TYPE(FLOAT):       idxi = (int)idx.value.as_float; break;
+    case TYPE(STRING):      idxi = idx.value.as_string->AsInt(); break;
     default: break;
   } 
-  if (idxi < 0 || idxi >= arr->GetSize()) return TYPE(INVALID);
 
-  ASType_t type = m_var.as_array->Get(idxi).type.type;
-  if (type == TYPE(OBJECT_REF)) return m_var.as_array->Get(idxi).value.as_ref->GetType();
-  else return type;
+  if (idxi < 0 || idxi >= m_var.as_array->GetSize()) return false;
+  
+  val = m_var.as_array->Get(idxi);
+  return true;
 }
 
-cDirectInterpretASTVisitor::uAnyType cDirectInterpretASTVisitor::cArrayVarRef::Get(const sAggregateValue& idx)
+bool cDirectInterpretASTVisitor::cArrayVarRef::Set(sAggregateValue& idx, sAggregateValue& val)
 {
   int idxi = -1;
   switch (idx.type.type) {
-    case TYPE(BOOL):    idxi = (idx.value.as_bool) ? 1 : 0; break;
-    case TYPE(CHAR):    idxi = (int)idx.value.as_char; break;
-    case TYPE(INT):     idxi = idx.value.as_int; break;
-    case TYPE(FLOAT):   idxi = (int)idx.value.as_float; break;
-    case TYPE(STRING):  idxi = idx.value.as_string->AsInt(); delete idx.value.as_string; break;
+    case TYPE(BOOL):        idxi = (idx.value.as_bool) ? 1 : 0; break;
+    case TYPE(CHAR):        idxi = (int)idx.value.as_char; break;
+    case TYPE(INT):         idxi = idx.value.as_int; break;
+    case TYPE(FLOAT):       idxi = (int)idx.value.as_float; break;
+    case TYPE(STRING):      idxi = idx.value.as_string->AsInt(); delete idx.value.as_string; break;
+    case TYPE(ARRAY):       idx.value.as_array->RemoveReference(); break;
+    case TYPE(DICT):        idx.value.as_dict->RemoveReference(); break;
+    case TYPE(MATRIX):      // @TODO - array ref get
+    case TYPE(OBJECT_REF):  delete idx.value.as_ref; break;
     default: break;
   } 
-
-  assert(idxi >= 0 && idxi < m_var.as_array->GetSize());
   
-  return m_var.as_array->Get(idxi).value;
-}
-
-bool cDirectInterpretASTVisitor::cArrayVarRef::Set(const sAggregateValue& idx, ASType_t type, uAnyType value)
-{
-  assert(idx.type.type == AS_TYPE_INT);
-  int idxi = idx.value.as_int;
+  if (idxi < 0 || idxi >= m_var.as_array->GetSize()) return false;
+    
+  m_var.as_array->Set(idxi, val.type, val.value);
   
-  cLocalArray* arr = m_var.as_array;
-  if (idxi < 0 || idxi >= arr->GetSize()) return false;
-
-  if (arr->IsShared()) {
-    arr = new cLocalArray(arr);
-    m_var.as_array->RemoveReference();
-    m_var.as_array = arr;
-  }
-  
-  arr->Set(idxi, type, value);
-  
   return true;
 }
 
 
-sASTypeInfo cDirectInterpretASTVisitor::cObjectIndexRef::GetType(const sAggregateValue& idx)
+
+
+bool cDirectInterpretASTVisitor::cDictVarRef::Get(const sAggregateValue& idx, sAggregateValue& val)
 {
-  switch (m_obj->GetType(m_idx).type) {
-    case TYPE(ARRAY):
-      {
-        cLocalArray* arr = m_obj->Get(m_idx).as_array;
-        
-        int idxi = -1;
-        switch (idx.type.type) {
-          case TYPE(BOOL):    idxi = (idx.value.as_bool) ? 1 : 0; break;
-          case TYPE(CHAR):    idxi = (int)idx.value.as_char; break;
-          case TYPE(INT):     idxi = idx.value.as_int; break;
-          case TYPE(FLOAT):   idxi = (int)idx.value.as_float; break;
-          case TYPE(STRING):  idxi = idx.value.as_string->AsInt(); delete idx.value.as_string; break;
-          default: break;
-        } 
-        if (idxi < 0 || idxi >= arr->GetSize()) return TYPE(INVALID);
-        
-        return arr->Get(idxi).type;
-      }
-      
-    case TYPE(DICT):
-      {
-        cLocalDict* dict = m_obj->Get(m_idx).as_dict;
-        sAggregateValue val;
-        if (dict->Get(idx, val)) return val.type;
-      }
-      return TYPE(INVALID);
-      
-    case TYPE(MATRIX):
-      return TYPE(ARRAY);
-      
-    default:
-      return TYPE(INVALID);
-  }  
+  return m_var.as_dict->Get(idx, val);
 }
 
+bool cDirectInterpretASTVisitor::cDictVarRef::Set(sAggregateValue& idx, sAggregateValue& val)
+{
+  m_var.as_dict->Set(idx, val);  
+  return true;
+}
 
-cDirectInterpretASTVisitor::uAnyType cDirectInterpretASTVisitor::cObjectIndexRef::Get(const sAggregateValue& idx)
+
+bool cDirectInterpretASTVisitor::cObjectIndexRef::Get(const sAggregateValue& idx, sAggregateValue& val)
 {
-  switch (m_obj->GetType(m_idx).type) {
+  sAggregateValue o_val;
+  
+  if (!m_obj->Get(m_idx, o_val)) return false;
+  
+  switch (o_val.type.type) {
     case TYPE(ARRAY):
       {
-        cLocalArray* arr = m_obj->Get(m_idx).as_array;
+        cLocalArray* arr = o_val.value.as_array;
         
         int idxi = -1;
         switch (idx.type.type) {
-          case TYPE(BOOL):    idxi = (idx.value.as_bool) ? 1 : 0; break;
-          case TYPE(CHAR):    idxi = (int)idx.value.as_char; break;
-          case TYPE(INT):     idxi = idx.value.as_int; break;
-          case TYPE(FLOAT):   idxi = (int)idx.value.as_float; break;
-          case TYPE(STRING):  idxi = idx.value.as_string->AsInt(); delete idx.value.as_string; break;
+          case TYPE(BOOL):        idxi = (idx.value.as_bool) ? 1 : 0; break;
+          case TYPE(CHAR):        idxi = (int)idx.value.as_char; break;
+          case TYPE(INT):         idxi = idx.value.as_int; break;
+          case TYPE(FLOAT):       idxi = (int)idx.value.as_float; break;
+          case TYPE(STRING):      idxi = idx.value.as_string->AsInt(); break;
           default: break;
         }      
-        assert(idxi >= 0 || idxi < arr->GetSize());
-        return arr->Get(idxi).value;
+        if (idxi < 0 || idxi >= arr->GetSize()) return false;
+        val = arr->Get(idxi);
+        return true;
       }
       
     case TYPE(DICT):
-      {
-        cLocalDict* dict = m_obj->Get(m_idx).as_dict;
-        sAggregateValue val;
-        if (dict->Get(idx, val)) return val.value;
-      }
-      break;
+      return o_val.value.as_dict->Get(idx, val);
       
     case TYPE(MATRIX): // @TODO - object index ref get
       break;
@@ -1753,41 +1776,46 @@
       break;
   }  
 
-  Avida::Exit(AS_EXIT_FAIL_INTERPRET);
   
-  uAnyType novalue;
-  return novalue;
+  return false;
 }
 
 
-bool cDirectInterpretASTVisitor::cObjectIndexRef::Set(const sAggregateValue& idx, ASType_t type, uAnyType value)
+bool cDirectInterpretASTVisitor::cObjectIndexRef::Set(sAggregateValue& idx, sAggregateValue& val)
 {
-  switch (m_obj->GetType(m_idx).type) {
+  sAggregateValue o_val;
+  
+  if (!m_obj->Get(m_idx)) {
+    idx.Cleanup();
+    return false;
+  }
+  
+  switch (o_val.type.type) {
     case TYPE(ARRAY):
       {
-        cLocalArray* arr = m_obj->Get(m_idx).as_array;
+        cLocalArray* arr = o_val.value.as_array;
         
         int idxi = -1;
         switch (idx.type.type) {
-          case TYPE(BOOL):    idxi = (idx.value.as_bool) ? 1 : 0; break;
-          case TYPE(CHAR):    idxi = (int)idx.value.as_char; break;
-          case TYPE(INT):     idxi = idx.value.as_int; break;
-          case TYPE(FLOAT):   idxi = (int)idx.value.as_float; break;
-          case TYPE(STRING):  idxi = value.as_string->AsInt(); delete value.as_string; break;
+          case TYPE(BOOL):        idxi = (idx.value.as_bool) ? 1 : 0; break;
+          case TYPE(CHAR):        idxi = (int)idx.value.as_char; break;
+          case TYPE(INT):         idxi = idx.value.as_int; break;
+          case TYPE(FLOAT):       idxi = (int)idx.value.as_float; break;
+          case TYPE(STRING):      idxi = idx.value.as_string->AsInt(); delete idx.value.as_string; break;
+          case TYPE(ARRAY):       idx.value.as_array->RemoveReference(); break;
+          case TYPE(DICT):        idx.value.as_dict->RemoveReference(); break;
+          case TYPE(MATRIX):      // @TODO - array ref get
+          case TYPE(OBJECT_REF):  delete idx.value.as_ref; break;
           default: break;
         }      
         if (idxi < 0 || idxi >= arr->GetSize()) return false;
         
-        arr->Set(idxi, type, value);
+        arr->Set(idxi, val.type, val.value);
       }
       return true;
       
     case TYPE(DICT):
-      {
-        cLocalDict* dict = m_obj->Get(m_idx).as_dict;
-        sAggregateValue val(type, value);
-        dict->Set(idx, val);
-      }
+      o_val.value.as_dict->Set(idx, val);
       return true;
       
     case TYPE(MATRIX): // @TODO - object index ref set
@@ -1796,7 +1824,8 @@
     default:
       break;
   }  
-  
+
+  idx.Cleanup();
   return false;
 }
 
@@ -1819,12 +1848,18 @@
     case AS_DIRECT_INTERPRET_ERR_DIVISION_BY_ZERO:
       std::cerr << "division by zero" << ERR_ENDL;
       break;
+    case AS_DIRECT_INTERPRET_ERR_INDEX_ERROR:
+      std::cerr << "index operation failed" << ERR_ENDL;
+      break;
     case AS_DIRECT_INTERPRET_ERR_INDEX_OUT_OF_BOUNDS:
       std::cerr << "array index out of bounds" << ERR_ENDL;
       break;
     case AS_DIRECT_INTERPRET_ERR_INVALID_ARRAY_SIZE:
       std::cerr << "invalid array dimension" << ERR_ENDL;
       break;
+    case AS_DIRECT_INTERPRET_ERR_KEY_NOT_FOUND:
+      std::cerr << "key not found" << ERR_ENDL;
+      break;
     case AS_DIRECT_INTERPRET_ERR_OBJECT_ASSIGN_FAIL:
       std::cerr << "aggregate assignment failed" << ERR_ENDL;
       break;

Modified: development/source/script/cDirectInterpretASTVisitor.h
===================================================================
--- development/source/script/cDirectInterpretASTVisitor.h	2008-03-19 17:59:34 UTC (rev 2476)
+++ development/source/script/cDirectInterpretASTVisitor.h	2008-03-19 23:47:55 UTC (rev 2477)
@@ -202,13 +202,11 @@
     virtual ~cObjectRef() { ; }
 
     virtual bool IsWritable() = 0;
-    virtual sASTypeInfo GetType() = 0;
-    virtual sASTypeInfo GetType(const sAggregateValue& idx) = 0;
     
-    virtual uAnyType Get() = 0;
-    virtual uAnyType Get(const sAggregateValue& idx) = 0;
-    virtual bool Set(ASType_t type, uAnyType value) = 0;
-    virtual bool Set(const sAggregateValue& idx, ASType_t type, uAnyType value) = 0;
+    virtual bool Get(sAggregateValue& val) = 0;
+    virtual bool Get(const sAggregateValue& idx, sAggregateValue& val) = 0;
+    virtual bool Set(sAggregateValue& val) = 0;
+    virtual bool Set(sAggregateValue& idx, sAggregateValue& val) = 0;
   };
 
   class cArrayVarRef : public cObjectRef
@@ -221,15 +219,30 @@
     ~cArrayVarRef() { ; }
 
     bool IsWritable() { return true; }
-    sASTypeInfo GetType() { return AS_TYPE_ARRAY; }
-    sASTypeInfo GetType(const sAggregateValue& idx);
     
-    uAnyType Get() { return m_var; }
-    uAnyType Get(const sAggregateValue& idx);
-    bool Set(ASType_t type, uAnyType value) { return false; }
-    bool Set(const sAggregateValue& idx, ASType_t type, uAnyType value);
+    bool Get(sAggregateValue& val) { val.value = m_var; val.type = AS_TYPE_ARRAY; return true; }
+    bool Get(const sAggregateValue& idx, sAggregateValue& val);
+    bool Set(sAggregateValue& val) { return false; }
+    bool Set(sAggregateValue& idx, sAggregateValue& val);
   };
   
+  class cDictVarRef : public cObjectRef
+  {
+  private:
+    uAnyType& m_var;
+    
+  public:
+    cDictVarRef(uAnyType& var) : m_var(var) { ; }
+    ~cDictVarRef() { ; }
+    
+    bool IsWritable() { return true; }
+    
+    bool Get(sAggregateValue& val) { val.value = m_var; val.type = AS_TYPE_DICT; return true;}
+    bool Get(const sAggregateValue& idx, sAggregateValue& val);
+    bool Set(sAggregateValue& val) { return false; }
+    bool Set(sAggregateValue& idx, sAggregateValue& val);
+  };
+  
   class cObjectIndexRef : public cObjectRef
   {
   private:
@@ -241,13 +254,11 @@
     ~cObjectIndexRef() { delete m_obj; }
     
     bool IsWritable() { return m_obj->IsWritable(); }
-    sASTypeInfo GetType() { return m_obj->GetType(m_idx); }
-    sASTypeInfo GetType(const sAggregateValue& idx);
     
-    uAnyType Get() { return m_obj->Get(m_idx); }
-    uAnyType Get(const sAggregateValue& idx);
-    bool Set(ASType_t type, uAnyType value) { return m_obj->Set(m_idx, type, value); }
-    bool Set(const sAggregateValue& idx, ASType_t type, uAnyType value);
+    bool Get(sAggregateValue& val) { return m_obj->Get(m_idx, val); }
+    bool Get(const sAggregateValue& idx, sAggregateValue& val);
+    bool Set(sAggregateValue& val) { return m_obj->Set(m_idx, val); }
+    bool Set(sAggregateValue& idx, sAggregateValue& val);
   };
 };
 

Modified: development/source/script/cDumpASTVisitor.cc
===================================================================
--- development/source/script/cDumpASTVisitor.cc	2008-03-19 17:59:34 UTC (rev 2476)
+++ development/source/script/cDumpASTVisitor.cc	2008-03-19 23:47:55 UTC (rev 2477)
@@ -399,7 +399,7 @@
     mapping->idx->Accept(*this);
     m_depth--;
     indent();
-    cout << ":" << endl;
+    cout << "=>" << endl;
     m_depth++;
     mapping->val->Accept(*this);
   }

Modified: development/source/script/cLexer.l
===================================================================
--- development/source/script/cLexer.l	2008-03-19 17:59:34 UTC (rev 2476)
+++ development/source/script/cLexer.l	2008-03-19 23:47:55 UTC (rev 2477)
@@ -84,6 +84,7 @@
 \.\.        return AS_TOKEN_ARR_WILD;
 
 @\{         return AS_TOKEN_LITERAL_DICT;  // Aggregate literals
+=\>         return AS_TOKEN_DICT_MAPPING;
 \$\{        return AS_TOKEN_LITERAL_MATRIX;
 
 array       return AS_TOKEN_TYPE_ARRAY;    // Built-in Types

Modified: development/source/script/cParser.cc
===================================================================
--- development/source/script/cParser.cc	2008-03-19 17:59:34 UTC (rev 2476)
+++ development/source/script/cParser.cc	2008-03-19 23:47:55 UTC (rev 2477)
@@ -188,7 +188,7 @@
  */
 
 #ifndef DEBUG_AS_PARSER
-#define DEBUG_AS_PARSER 0
+#define DEBUG_AS_PARSER 1
 #endif
 
 #if DEBUG_AS_PARSER
@@ -868,14 +868,18 @@
   PARSE_TRACE("parseLiteralDict");
   cASTLiteralDict* ld = new cASTLiteralDict(FILEPOS);
   
-  if (nextToken() != TOKEN(ARR_CLOSE)) {
+  if (peekToken() != TOKEN(ARR_CLOSE)) {
     do {
+      nextToken(); // consume ',' (or '@{' on first pass)
       cASTNode* idxexpr = parseExpression();
-      if (currentToken() != TOKEN(ARR_RANGE)) PARSE_UNEXPECT();
+      if (currentToken() != TOKEN(DICT_MAPPING)) PARSE_UNEXPECT();
+      nextToken(); // consume '=>'
       cASTNode* valexpr = parseExpression();
       
       ld->AddMapping(idxexpr, valexpr);
-    } while (currentToken() == TOKEN(COMMA) && nextToken());
+    } while (currentToken() == TOKEN(COMMA));
+  } else {
+    nextToken();
   }
   
   return ld;

Modified: development/source/script/cSemanticASTVisitor.cc
===================================================================
--- development/source/script/cSemanticASTVisitor.cc	2008-03-19 17:59:34 UTC (rev 2476)
+++ development/source/script/cSemanticASTVisitor.cc	2008-03-19 23:47:55 UTC (rev 2477)
@@ -33,7 +33,7 @@
 
 
 #ifndef DEBUG_AS_SEMANTIC
-#define DEBUG_AS_SEMANTIC 0
+#define DEBUG_AS_SEMANTIC 1
 #endif
 
 #define SEMANTIC_ERROR(code, ...) reportError(AS_SEMANTIC_ERR_ ## code, node.GetFilePosition(),  __LINE__, ##__VA_ARGS__)
@@ -375,8 +375,21 @@
   
   switch (node.GetOperator()) {
     case TOKEN(IDX_OPEN):
-      checkCast(node.GetLeft()->GetType(), TYPEINFO(ARRAY));
-      checkCast(node.GetRight()->GetType(), TYPEINFO(INT));
+      switch (node.GetLeft()->GetType().type) {
+        case TYPE(ARRAY):
+        case TYPE(MATRIX):
+        case TYPE(STRING):
+          checkCast(node.GetRight()->GetType(), TYPEINFO(INT));
+          break;
+          
+        case TYPE(DICT):
+        case TYPE(RUNTIME):
+          break;
+          
+        default:
+          SEMANTIC_ERROR(UNDEFINED_TYPE_OP, mapToken(node.GetOperator()), mapType(node.GetLeft()->GetType()));
+          break;
+      }
       node.SetType(m_obj_assign ? TYPEINFO(OBJECT_REF) : TYPEINFO(RUNTIME));
       break;
     case TOKEN(ARR_RANGE):




More information about the Avida-cvs mailing list