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

brysonda at myxo.css.msu.edu brysonda at myxo.css.msu.edu
Mon Mar 17 20:32:04 PDT 2008


Author: brysonda
Date: 2008-03-17 23:32:03 -0400 (Mon, 17 Mar 2008)
New Revision: 2462

Modified:
   development/source/script/AvidaScript.cc
   development/source/script/AvidaScript.h
   development/source/script/cDirectInterpretASTVisitor.cc
   development/source/script/cDirectInterpretASTVisitor.h
   development/source/script/cLexer.l
   development/source/script/cParser.cc
   development/source/script/cSemanticASTVisitor.cc
Log:
AS:
Fully working var type.
Initial parser and semantic support for dict type.

Modified: development/source/script/AvidaScript.cc
===================================================================
--- development/source/script/AvidaScript.cc	2008-03-17 21:30:13 UTC (rev 2461)
+++ development/source/script/AvidaScript.cc	2008-03-18 03:32:03 UTC (rev 2462)
@@ -73,14 +73,16 @@
     case AS_TYPE_ARRAY:       return "array";
     case AS_TYPE_BOOL:        return "bool";
     case AS_TYPE_CHAR:        return "char";
+    case AS_TYPE_DICT:        return "dict";
     case AS_TYPE_FLOAT:       return "float";
     case AS_TYPE_INT:         return "int";
     case AS_TYPE_MATRIX:      return "matrix";
+    case AS_TYPE_OBJECT_REF:  return type.info;
     case AS_TYPE_STRING:      return "string";
-    case AS_TYPE_OBJECT_REF:  return type.info;
-    case AS_TYPE_RUNTIME:     return "runtime";
+    case AS_TYPE_VAR:         return "var";
+    case AS_TYPE_RUNTIME:     return "-runtime-";
     case AS_TYPE_VOID:        return "void";
-      
+
     case AS_TYPE_INVALID:
     default:
       return "*INVALID*";

Modified: development/source/script/AvidaScript.h
===================================================================
--- development/source/script/AvidaScript.h	2008-03-17 21:30:13 UTC (rev 2461)
+++ development/source/script/AvidaScript.h	2008-03-18 03:32:03 UTC (rev 2462)
@@ -74,33 +74,35 @@
   AS_TOKEN_TYPE_ARRAY, // 34
   AS_TOKEN_TYPE_BOOL,
   AS_TOKEN_TYPE_CHAR,
+  AS_TOKEN_TYPE_DICT,
   AS_TOKEN_TYPE_FLOAT,
   AS_TOKEN_TYPE_INT,
   AS_TOKEN_TYPE_MATRIX,
   AS_TOKEN_TYPE_STRING,
+  AS_TOKEN_TYPE_VAR,
   AS_TOKEN_TYPE_VOID,
   
-  AS_TOKEN_CMD_IF, // 42
+  AS_TOKEN_CMD_IF, // 44
   AS_TOKEN_CMD_ELSE,
   AS_TOKEN_CMD_ELSEIF,
   AS_TOKEN_CMD_WHILE,
   AS_TOKEN_CMD_FOREACH,
   AS_TOKEN_CMD_FUNCTION,
   
-  AS_TOKEN_CMD_RETURN, // 48
+  AS_TOKEN_CMD_RETURN, // 50
   
-  AS_TOKEN_BUILTIN_CALL, // 49
+  AS_TOKEN_BUILTIN_CALL, // 51
   AS_TOKEN_BUILTIN_METHOD,
   
-  AS_TOKEN_ID, // 51
+  AS_TOKEN_ID, // 53
   
-  AS_TOKEN_FLOAT, // 52
+  AS_TOKEN_FLOAT, // 54
   AS_TOKEN_INT,
   AS_TOKEN_STRING,
   AS_TOKEN_CHAR,
   AS_TOKEN_BOOL,
   
-  AS_TOKEN_UNKNOWN, // 56
+  AS_TOKEN_UNKNOWN, // 58
   AS_TOKEN_INVALID
 } ASToken_t;
 
@@ -192,14 +194,16 @@
   AS_TYPE_ARRAY = 0,
   AS_TYPE_BOOL,
   AS_TYPE_CHAR,
+  AS_TYPE_DICT,
   AS_TYPE_FLOAT,
   AS_TYPE_INT,
   AS_TYPE_OBJECT_REF,
   AS_TYPE_MATRIX,
   AS_TYPE_STRING,
+  AS_TYPE_VAR,
   
   AS_TYPE_RUNTIME,
-
+  
   AS_TYPE_VOID,
 
   AS_TYPE_INVALID

Modified: development/source/script/cDirectInterpretASTVisitor.cc
===================================================================
--- development/source/script/cDirectInterpretASTVisitor.cc	2008-03-17 21:30:13 UTC (rev 2461)
+++ development/source/script/cDirectInterpretASTVisitor.cc	2008-03-18 03:32:03 UTC (rev 2462)
@@ -54,14 +54,14 @@
   m_call_stack.Resize(m_global_symtbl->GetNumVariables());
   for (int i = 0; i < m_global_symtbl->GetNumVariables(); i++) {
     switch (m_global_symtbl->GetVariableType(i).type) {
-      case TYPE(ARRAY):       m_call_stack[i].as_array = new cLocalArray; break;
-      case TYPE(BOOL):        m_call_stack[i].as_bool = false; break;
-      case TYPE(CHAR):        m_call_stack[i].as_char = 0; break;
-      case TYPE(INT):         m_call_stack[i].as_int = 0; break;
-      case TYPE(FLOAT):       m_call_stack[i].as_float = 0.0; break;
-      case TYPE(MATRIX):      m_call_stack[i].as_matrix = NULL; break;
-      case TYPE(OBJECT_REF):  m_call_stack[i].as_ref = NULL; break;
-      case TYPE(STRING):      m_call_stack[i].as_string = NULL; break;
+      case TYPE(ARRAY):       m_call_stack[i].value.as_array = new cLocalArray; break;
+      case TYPE(BOOL):        m_call_stack[i].value.as_bool = false; break;
+      case TYPE(CHAR):        m_call_stack[i].value.as_char = 0; break;
+      case TYPE(INT):         m_call_stack[i].value.as_int = 0; break;
+      case TYPE(FLOAT):       m_call_stack[i].value.as_float = 0.0; break;
+      case TYPE(MATRIX):      m_call_stack[i].value.as_matrix = NULL; break;
+      case TYPE(OBJECT_REF):  m_call_stack[i].value.as_ref = NULL; break;
+      case TYPE(STRING):      m_call_stack[i].value.as_string = NULL; break;
       default: break;
     }
   }
@@ -70,15 +70,18 @@
 cDirectInterpretASTVisitor::~cDirectInterpretASTVisitor()
 {
   for (int i = 0; i < m_global_symtbl->GetNumVariables(); i++) {
-    switch (m_global_symtbl->GetVariableType(i).type) {
-      case TYPE(ARRAY):       m_call_stack[i].as_array->RemoveReference(); break;
+    ASType_t type = m_global_symtbl->GetVariableType(i).type;
+    if (type == TYPE(VAR)) type = m_call_stack[i].type.type;
+    
+    switch (type) {
+      case TYPE(ARRAY):       m_call_stack[i].value.as_array->RemoveReference(); break;
       case TYPE(BOOL):        break;
       case TYPE(CHAR):        break;
       case TYPE(INT):         break;
       case TYPE(FLOAT):       break;
       case TYPE(MATRIX):      break; // @TODO - cleanup scope
-      case TYPE(OBJECT_REF):  delete m_call_stack[i].as_ref; break;
-      case TYPE(STRING):      delete m_call_stack[i].as_string; break;
+      case TYPE(OBJECT_REF):  delete m_call_stack[i].value.as_ref; break;
+      case TYPE(STRING):      delete m_call_stack[i].value.as_string; break;
       default: break;
     }
   }
@@ -105,23 +108,28 @@
   node.GetExpression()->Accept(*this);
   
   switch (symtbl->GetVariableType(var_id).type) {
-    case TYPE(BOOL):        m_call_stack[sp + var_id].as_bool = asBool(m_rtype, m_rvalue, node); break;
-    case TYPE(CHAR):        m_call_stack[sp + var_id].as_char = asChar(m_rtype, m_rvalue, node); break;
-    case TYPE(FLOAT):       m_call_stack[sp + var_id].as_float = asFloat(m_rtype, m_rvalue, node); break;
-    case TYPE(INT):         m_call_stack[sp + var_id].as_int = asInt(m_rtype, m_rvalue, node); break;
+    case TYPE(BOOL):        m_call_stack[sp + var_id].value.as_bool = asBool(m_rtype, m_rvalue, node); break;
+    case TYPE(CHAR):        m_call_stack[sp + var_id].value.as_char = asChar(m_rtype, m_rvalue, node); break;
+    case TYPE(FLOAT):       m_call_stack[sp + var_id].value.as_float = asFloat(m_rtype, m_rvalue, node); break;
+    case TYPE(INT):         m_call_stack[sp + var_id].value.as_int = asInt(m_rtype, m_rvalue, node); break;
     case TYPE(OBJECT_REF):  INTERPRET_ERROR(INTERNAL); // @TODO - assignment
 
+    case TYPE(VAR):
+      m_call_stack[sp + var_id].value = m_rvalue;
+      m_call_stack[sp + var_id].type = m_rtype;
+      break;
+      
     case TYPE(ARRAY):
-      m_call_stack[sp + var_id].as_array->RemoveReference();
-      m_call_stack[sp + var_id].as_array = asArray(m_rtype, m_rvalue, node);
+      m_call_stack[sp + var_id].value.as_array->RemoveReference();
+      m_call_stack[sp + var_id].value.as_array = asArray(m_rtype, m_rvalue, node);
       break;
       
 
     case TYPE(MATRIX):      INTERPRET_ERROR(INTERNAL); // @TODO - assignment
 
     case TYPE(STRING):
-      delete m_call_stack[sp + var_id].as_string;
-      m_call_stack[sp + var_id].as_string = asString(m_rtype, m_rvalue, node);
+      delete m_call_stack[sp + var_id].value.as_string;
+      m_call_stack[sp + var_id].value.as_string = asString(m_rtype, m_rvalue, node);
       break;
       
     default:
@@ -183,23 +191,27 @@
     // Set the variable value for this iteration
     const sAggregateValue& val = arr->Get(i);
     switch (var_type.type) {
-      case TYPE(BOOL):        m_call_stack[var_idx].as_bool = asBool(val.type, val.value, node); break;
-      case TYPE(CHAR):        m_call_stack[var_idx].as_char = asChar(val.type, val.value, node); break;
-      case TYPE(FLOAT):       m_call_stack[var_idx].as_float = asFloat(val.type, val.value, node); break;
-      case TYPE(INT):         m_call_stack[var_idx].as_int = asInt(val.type, val.value, node); break;
+      case TYPE(BOOL):        m_call_stack[var_idx].value.as_bool = asBool(val.type, val.value, node); break;
+      case TYPE(CHAR):        m_call_stack[var_idx].value.as_char = asChar(val.type, val.value, node); break;
+      case TYPE(FLOAT):       m_call_stack[var_idx].value.as_float = asFloat(val.type, val.value, node); break;
+      case TYPE(INT):         m_call_stack[var_idx].value.as_int = asInt(val.type, val.value, node); break;
       case TYPE(OBJECT_REF):  INTERPRET_ERROR(INTERNAL); // @TODO - assignment
         
       case TYPE(ARRAY):
-        m_call_stack[var_idx].as_array->RemoveReference();
-        m_call_stack[var_idx].as_array = asArray(val.type, val.value, node);
+        m_call_stack[var_idx].value.as_array->RemoveReference();
+        m_call_stack[var_idx].value.as_array = asArray(val.type, val.value, node);
         break;
         
+      case TYPE(VAR):
+        m_call_stack[var_idx].value = val.value;
+        m_call_stack[var_idx].type = val.type;
+        break;
         
       case TYPE(MATRIX):      INTERPRET_ERROR(INTERNAL); // @TODO - assignment
         
       case TYPE(STRING):
-        delete m_call_stack[var_idx].as_string;
-        m_call_stack[var_idx].as_string = asString(val.type, val.value, node);
+        delete m_call_stack[var_idx].value.as_string;
+        m_call_stack[var_idx].value.as_string = asString(val.type, val.value, node);
         break;
         
       default:
@@ -263,18 +275,23 @@
     node.GetAssignmentExpression()->Accept(*this);
     
     switch (node.GetType().type) {
-      case TYPE(ARRAY):       m_call_stack[m_sp + var_id].as_array = asArray(m_rtype, m_rvalue, node); break;
-      case TYPE(BOOL):        m_call_stack[m_sp + var_id].as_bool = asBool(m_rtype, m_rvalue, node); break;
-      case TYPE(CHAR):        m_call_stack[m_sp + var_id].as_char = asChar(m_rtype, m_rvalue, node); break;
-      case TYPE(FLOAT):       m_call_stack[m_sp + var_id].as_float = asFloat(m_rtype, m_rvalue, node); break;
-      case TYPE(INT):         m_call_stack[m_sp + var_id].as_int = asInt(m_rtype, m_rvalue, node); break;
+      case TYPE(ARRAY):       m_call_stack[m_sp + var_id].value.as_array = asArray(m_rtype, m_rvalue, node); break;
+      case TYPE(BOOL):        m_call_stack[m_sp + var_id].value.as_bool = asBool(m_rtype, m_rvalue, node); break;
+      case TYPE(CHAR):        m_call_stack[m_sp + var_id].value.as_char = asChar(m_rtype, m_rvalue, node); break;
+      case TYPE(FLOAT):       m_call_stack[m_sp + var_id].value.as_float = asFloat(m_rtype, m_rvalue, node); break;
+      case TYPE(INT):         m_call_stack[m_sp + var_id].value.as_int = asInt(m_rtype, m_rvalue, node); break;
       case TYPE(OBJECT_REF):  INTERPRET_ERROR(INTERNAL); // @TODO - assignment
       case TYPE(MATRIX):      INTERPRET_ERROR(INTERNAL); // @TODO - assignment
       case TYPE(STRING):
-        delete m_call_stack[m_sp + var_id].as_string;
-        m_call_stack[m_sp + var_id].as_string = asString(m_rtype, m_rvalue, node);
+        delete m_call_stack[m_sp + var_id].value.as_string;
+        m_call_stack[m_sp + var_id].value.as_string = asString(m_rtype, m_rvalue, node);
         break;
         
+      case TYPE(VAR):
+        m_call_stack[m_sp + var_id].value = m_rvalue;
+        m_call_stack[m_sp + var_id].type = m_rtype;
+        break;
+        
       default:
         INTERPRET_ERROR(INTERNAL);
     }
@@ -285,7 +302,7 @@
       
       cLocalArray* arr = new cLocalArray();
       arr->Resize(asInt(m_rtype, m_rvalue, node));
-      m_call_stack[m_sp + node.GetVarID()].as_array = arr;
+      m_call_stack[m_sp + node.GetVarID()].value.as_array = arr;
     } else if (node.GetType() == TYPE(MATRIX)) { // @TODO - variable def dimensions
       
     } else {
@@ -788,13 +805,13 @@
         args->Iterator().Next()->Accept(*this);
         int sz = asInt(m_rtype, m_rvalue, node);
         
-        cLocalArray* arr = m_call_stack[var_idx].as_array;
+        cLocalArray* arr = m_call_stack[var_idx].value.as_array;
         if (arr->IsShared()) {
           arr = new cLocalArray(arr);
-          m_call_stack[var_idx].as_array->RemoveReference();
-          m_call_stack[var_idx].as_array = arr;         
+          m_call_stack[var_idx].value.as_array->RemoveReference();
+          m_call_stack[var_idx].value.as_array = arr;         
         }
-        m_call_stack[var_idx].as_array->Resize(sz);
+        m_call_stack[var_idx].value.as_array->Resize(sz);
       } else {
         // @TODO - resize matrix
       }
@@ -879,14 +896,15 @@
     m_call_stack.Resize(m_call_stack.GetSize() + func_symtbl->GetNumVariables());
     for (int i = 0; i < func_symtbl->GetNumVariables(); i++) {
       switch (func_symtbl->GetVariableType(i).type) {
-        case TYPE(ARRAY):       m_call_stack[sp + i].as_array = new cLocalArray; break;
-        case TYPE(BOOL):        m_call_stack[sp + i].as_bool = false; break;
-        case TYPE(CHAR):        m_call_stack[sp + i].as_char = 0; break;
-        case TYPE(INT):         m_call_stack[sp + i].as_int = 0; break;
-        case TYPE(FLOAT):       m_call_stack[sp + i].as_float = 0.0; break;
-        case TYPE(MATRIX):      m_call_stack[sp + i].as_matrix = NULL; break;
-        case TYPE(OBJECT_REF):  m_call_stack[sp + i].as_ref = NULL; break;
-        case TYPE(STRING):      m_call_stack[sp + i].as_string = NULL; break;
+        case TYPE(ARRAY):       m_call_stack[sp + i].value.as_array = new cLocalArray; break;
+        case TYPE(BOOL):        m_call_stack[sp + i].value.as_bool = false; break;
+        case TYPE(CHAR):        m_call_stack[sp + i].value.as_char = 0; break;
+        case TYPE(INT):         m_call_stack[sp + i].value.as_int = 0; break;
+        case TYPE(FLOAT):       m_call_stack[sp + i].value.as_float = 0.0; break;
+        case TYPE(MATRIX):      m_call_stack[sp + i].value.as_matrix = NULL; break;
+        case TYPE(OBJECT_REF):  m_call_stack[sp + i].value.as_ref = NULL; break;
+        case TYPE(STRING):      m_call_stack[sp + i].value.as_string = NULL; break;
+        case TYPE(VAR):         m_call_stack[sp + i].type = TYPE(INVALID); break;
         default: break;
       }
     }
@@ -903,19 +921,24 @@
       int var_id = arg_def->GetVarID();
 
       switch (m_cur_symtbl->GetVariableType(var_id).type) {
-        case TYPE(ARRAY):       m_call_stack[sp + var_id].as_array = asArray(m_rtype, m_rvalue, node); break;
-        case TYPE(BOOL):        m_call_stack[sp + var_id].as_bool = asBool(m_rtype, m_rvalue, node); break;
-        case TYPE(CHAR):        m_call_stack[sp + var_id].as_char = asChar(m_rtype, m_rvalue, node); break;
-        case TYPE(FLOAT):       m_call_stack[sp + var_id].as_float = asFloat(m_rtype, m_rvalue, node); break;
-        case TYPE(INT):         m_call_stack[sp + var_id].as_int = asInt(m_rtype, m_rvalue, node); break;
+        case TYPE(ARRAY):       m_call_stack[sp + var_id].value.as_array = asArray(m_rtype, m_rvalue, node); break;
+        case TYPE(BOOL):        m_call_stack[sp + var_id].value.as_bool = asBool(m_rtype, m_rvalue, node); break;
+        case TYPE(CHAR):        m_call_stack[sp + var_id].value.as_char = asChar(m_rtype, m_rvalue, node); break;
+        case TYPE(FLOAT):       m_call_stack[sp + var_id].value.as_float = asFloat(m_rtype, m_rvalue, node); break;
+        case TYPE(INT):         m_call_stack[sp + var_id].value.as_int = asInt(m_rtype, m_rvalue, node); break;
         case TYPE(OBJECT_REF):  INTERPRET_ERROR(INTERNAL); // @TODO - assignment
         case TYPE(MATRIX):      INTERPRET_ERROR(INTERNAL); // @TODO - assignment
         case TYPE(STRING):
           {
-            m_call_stack[sp + var_id].as_string = asString(m_rtype, m_rvalue, node);
+            m_call_stack[sp + var_id].value.as_string = asString(m_rtype, m_rvalue, node);
           }
           break;
           
+        case TYPE(VAR):
+          m_call_stack[sp + var_id].value = m_rvalue;
+          m_call_stack[sp + var_id].type = m_rtype;
+          break;
+          
         default:
           INTERPRET_ERROR(INTERNAL);
       }
@@ -937,24 +960,28 @@
       case TYPE(OBJECT_REF):  INTERPRET_ERROR(INTERNAL); // @TODO - return
       case TYPE(MATRIX):      INTERPRET_ERROR(INTERNAL); // @TODO - return
       case TYPE(STRING):      m_rvalue.as_string = asString(m_rtype, m_rvalue, node); break;
+      case TYPE(VAR):         break;
       case TYPE(VOID):        break;
         
       default:
         INTERPRET_ERROR(INTERNAL);
     }
-    m_rtype = node.GetType();
+    if (node.GetType() != TYPE(VAR)) m_rtype = node.GetType();
 
     // Clean up variables in the current scope
     for (int i = 0; i < func_symtbl->GetNumVariables(); i++) {
-      switch (func_symtbl->GetVariableType(i).type) {
-        case TYPE(ARRAY):       m_call_stack[sp + i].as_array->RemoveReference(); break;
+      ASType_t type = func_symtbl->GetVariableType(i).type;
+      if (type == TYPE(VAR)) type = m_call_stack[sp + i].type.type;
+      
+      switch (type) {
+        case TYPE(ARRAY):       m_call_stack[sp + i].value.as_array->RemoveReference(); break;
         case TYPE(BOOL):        break;
         case TYPE(CHAR):        break;
         case TYPE(INT):         break;
         case TYPE(FLOAT):       break;
         case TYPE(MATRIX):      break; // @TODO - cleanup scope
-        case TYPE(OBJECT_REF):  delete m_call_stack[sp + i].as_ref; break;
-        case TYPE(STRING):      delete m_call_stack[sp + i].as_string; break;
+        case TYPE(OBJECT_REF):  delete m_call_stack[sp + i].value.as_ref; break;
+        case TYPE(STRING):      delete m_call_stack[sp + i].value.as_string; break;
         default: break;
       }
     }
@@ -1040,7 +1067,7 @@
   
   if (m_obj_assign) {
     switch (node.GetType().type) {
-      case TYPE(ARRAY):       m_rvalue.as_ref = new cArrayVarRef(m_call_stack[sp + var_id]); break;
+      case TYPE(ARRAY):       m_rvalue.as_ref = new cArrayVarRef(m_call_stack[sp + var_id].value); break;
       case TYPE(OBJECT_REF):  INTERPRET_ERROR(INTERNAL); // @TODO - assignment
       case TYPE(MATRIX):      INTERPRET_ERROR(INTERNAL); // @TODO - assignment
       case TYPE(STRING):      INTERPRET_ERROR(INTERNAL); // @TODO - assignment
@@ -1050,20 +1077,26 @@
     }
     m_rtype = TYPE(OBJECT_REF);
   } else {
-    switch (node.GetType().type) {
-      case TYPE(ARRAY):       m_rvalue.as_array = m_call_stack[sp + var_id].as_array->GetReference(); break;
-      case TYPE(BOOL):        m_rvalue.as_bool = m_call_stack[sp + var_id].as_bool; break;
-      case TYPE(CHAR):        m_rvalue.as_char = m_call_stack[sp + var_id].as_char; break;
-      case TYPE(FLOAT):       m_rvalue.as_float = m_call_stack[sp + var_id].as_float; break;
-      case TYPE(INT):         m_rvalue.as_int = m_call_stack[sp + var_id].as_int; break;
+    ASType_t type = node.GetType().type;
+    if (type == TYPE(VAR)) type = m_call_stack[sp + var_id].type.type;
+    
+    m_rtype = sASTypeInfo(type);
+    
+    switch (type) {
+      case TYPE(ARRAY):       m_rvalue.as_array = m_call_stack[sp + var_id].value.as_array->GetReference(); break;
+      case TYPE(BOOL):        m_rvalue.as_bool = m_call_stack[sp + var_id].value.as_bool; break;
+      case TYPE(CHAR):        m_rvalue.as_char = m_call_stack[sp + var_id].value.as_char; break;
+      case TYPE(FLOAT):       m_rvalue.as_float = m_call_stack[sp + var_id].value.as_float; break;
+      case TYPE(INT):         m_rvalue.as_int = m_call_stack[sp + var_id].value.as_int; break;
+      case TYPE(MATRIX):      INTERPRET_ERROR(INTERNAL); // @TODO - assignment
+      case TYPE(STRING):      m_rvalue.as_string = new cString(*m_call_stack[sp + var_id].value.as_string); break;
+
+      
       case TYPE(OBJECT_REF):  INTERPRET_ERROR(INTERNAL); // @TODO - assignment
-      case TYPE(MATRIX):      INTERPRET_ERROR(INTERNAL); // @TODO - assignment
-      case TYPE(STRING):      m_rvalue.as_string = new cString(*m_call_stack[sp + var_id].as_string); break;
         
       default:
         INTERPRET_ERROR(INTERNAL);
     }
-    m_rtype = node.GetType();
   }
 }
 
@@ -1086,23 +1119,28 @@
     // Set the variable value for this iteration
     const sAggregateValue& val = arr->Get(i);
     switch (var_type.type) {
-      case TYPE(BOOL):        m_call_stack[var_idx].as_bool = asBool(val.type, val.value, node); break;
-      case TYPE(CHAR):        m_call_stack[var_idx].as_char = asChar(val.type, val.value, node); break;
-      case TYPE(FLOAT):       m_call_stack[var_idx].as_float = asFloat(val.type, val.value, node); break;
-      case TYPE(INT):         m_call_stack[var_idx].as_int = asInt(val.type, val.value, node); break;
+      case TYPE(BOOL):        m_call_stack[var_idx].value.as_bool = asBool(val.type, val.value, node); break;
+      case TYPE(CHAR):        m_call_stack[var_idx].value.as_char = asChar(val.type, val.value, node); break;
+      case TYPE(FLOAT):       m_call_stack[var_idx].value.as_float = asFloat(val.type, val.value, node); break;
+      case TYPE(INT):         m_call_stack[var_idx].value.as_int = asInt(val.type, val.value, node); break;
       case TYPE(OBJECT_REF):  INTERPRET_ERROR(INTERNAL); // @TODO - assignment
         
+      case TYPE(VAR):
+        m_call_stack[var_idx].value = val.value;
+        m_call_stack[var_idx].type = val.type;
+        break;
+        
       case TYPE(ARRAY):
-        m_call_stack[var_idx].as_array->RemoveReference();
-        m_call_stack[var_idx].as_array = asArray(val.type, val.value, node);
+        m_call_stack[var_idx].value.as_array->RemoveReference();
+        m_call_stack[var_idx].value.as_array = asArray(val.type, val.value, node);
         break;
         
         
       case TYPE(MATRIX):      INTERPRET_ERROR(INTERNAL); // @TODO - assignment
         
       case TYPE(STRING):
-        delete m_call_stack[var_idx].as_string;
-        m_call_stack[var_idx].as_string = asString(val.type, val.value, node);
+        delete m_call_stack[var_idx].value.as_string;
+        m_call_stack[var_idx].value.as_string = asString(val.type, val.value, node);
         break;
         
       default:
@@ -1121,8 +1159,8 @@
       wild->Set(i, val.type, val.value);
     }
     
-    m_call_stack[var_idx].as_array->RemoveReference();
-    m_call_stack[var_idx].as_array = wild;
+    m_call_stack[var_idx].value.as_array->RemoveReference();
+    m_call_stack[var_idx].value.as_array = wild;
   }
   
   arr->RemoveReference();
@@ -1211,7 +1249,7 @@
       INTERPRET_ERROR(TYPE_CAST, mapType(type), mapType(TYPE(CHAR)));
   }
   
-  return false;
+  return 0;
 }
 
 
@@ -1237,7 +1275,7 @@
       INTERPRET_ERROR(TYPE_CAST, mapType(type), mapType(TYPE(INT)));
   }
   
-  return false;
+  return 0;
 }
 
 
@@ -1263,7 +1301,7 @@
       INTERPRET_ERROR(TYPE_CAST, mapType(type), mapType(TYPE(INT)));
   }
   
-  return false;
+  return 0.0;
 }
 
 
@@ -1299,10 +1337,11 @@
       INTERPRET_ERROR(TYPE_CAST, mapType(type), mapType(TYPE(INT)));
   }
   
-  return false;
+  return NULL;
 }
 
 
+
 ASType_t cDirectInterpretASTVisitor::getRuntimeType(ASType_t ltype, ASType_t rtype, bool allow_str)
 {
   switch (ltype) {
@@ -1320,8 +1359,6 @@
         case TYPE(STRING):
           return TYPE(BOOL);
           
-        case TYPE(RUNTIME):
-          return TYPE(INVALID);
         default: break;
       }
       break;
@@ -1334,7 +1371,6 @@
         case TYPE(INT):       return TYPE(INT);
         case TYPE(MATRIX):    return TYPE(MATRIX);
         case TYPE(STRING):    if (allow_str) return TYPE(STRING); break;
-        case TYPE(RUNTIME):   return TYPE(INVALID);
         default: break;
       }
       break;
@@ -1347,7 +1383,6 @@
         case TYPE(INT):       return TYPE(FLOAT);
         case TYPE(MATRIX):    return TYPE(MATRIX);
         case TYPE(STRING):    if (allow_str) return TYPE(FLOAT); break;
-        case TYPE(RUNTIME):   return TYPE(INVALID);
         default: break;
       }
       break;
@@ -1360,7 +1395,6 @@
         case TYPE(INT):       return TYPE(INT);
         case TYPE(MATRIX):    return TYPE(MATRIX);
         case TYPE(STRING):    if (allow_str) return TYPE(INT); break;
-        case TYPE(RUNTIME):   return TYPE(INVALID);
         default: break;
       }
       break;
@@ -1369,9 +1403,6 @@
     case TYPE(STRING):
       if (allow_str) return TYPE(STRING); break;
       
-    case TYPE(RUNTIME):
-      return TYPE(INVALID);
-      
     default: break;
   }
   
@@ -1379,11 +1410,11 @@
 }
 
 
-void cDirectInterpretASTVisitor::cLocalArray::Set(int i, ASType_t type, uAnyType value)
+void cDirectInterpretASTVisitor::cLocalArray::Set(int i, const sASTypeInfo& type, uAnyType value)
 {
   m_storage[i].type = type;
 
-  switch (type) {
+  switch (type.type) {
     case TYPE(BOOL):
     case TYPE(CHAR):
     case TYPE(INT):
@@ -1411,7 +1442,7 @@
 {
   for (int i = 0; i < in_storage.GetSize(); i++) {
     m_storage[i + offset].type = in_storage[i].type;
-    switch (in_storage[i].type) {
+    switch (in_storage[i].type.type) {
       case TYPE(BOOL):    m_storage[i + offset].value.as_bool = in_storage[i].value.as_bool; break;
       case TYPE(CHAR):    m_storage[i + offset].value.as_char = in_storage[i].value.as_char; break;
       case TYPE(INT):     m_storage[i + offset].value.as_int = in_storage[i].value.as_int; break;
@@ -1446,7 +1477,7 @@
   // Cleanup values stored in the array
   for (int i = 0; i < sz; i++) {
     sAggregateValue& cell = m_storage[i];
-    switch (cell.type) {
+    switch (cell.type.type) {
       case TYPE(STRING):  delete cell.value.as_string; break;
       case TYPE(ARRAY):   cell.value.as_array->RemoveReference(); break;
       case TYPE(MATRIX):  delete cell.value.as_matrix; break;

Modified: development/source/script/cDirectInterpretASTVisitor.h
===================================================================
--- development/source/script/cDirectInterpretASTVisitor.h	2008-03-17 21:30:13 UTC (rev 2461)
+++ development/source/script/cDirectInterpretASTVisitor.h	2008-03-18 03:32:03 UTC (rev 2462)
@@ -51,6 +51,11 @@
     cObjectRef* as_ref;
   } uAnyType;
   
+  struct sAggregateValue {
+    uAnyType value;
+    sASTypeInfo type;
+  };
+    
 
   // --------  Internal Variables  --------
   cSymbolTable* m_global_symtbl;
@@ -59,7 +64,7 @@
   uAnyType m_rvalue;
   sASTypeInfo m_rtype;
   
-  tSmartArray<uAnyType> m_call_stack;
+  tSmartArray<sAggregateValue> m_call_stack;
   int m_sp;
   bool m_has_returned;
   bool m_obj_assign;
@@ -119,11 +124,6 @@
   
 
   // --------  Internal Type Definitions  --------
-  struct sAggregateValue {
-    uAnyType value;
-    ASType_t type;
-  };
-  
   class cLocalArray
   {
   private:
@@ -146,7 +146,7 @@
     void Resize(int sz);
     
     inline const sAggregateValue& Get(int i) const { return m_storage[i]; }    
-    void Set(int i, ASType_t type, uAnyType value);
+    void Set(int i, const sASTypeInfo& type, uAnyType value);
     
     
   private:
@@ -232,7 +232,7 @@
 {
   if (idx < 0 || idx >= m_var.as_array->GetSize()) return AS_TYPE_INVALID;
   else {
-    ASType_t type = m_var.as_array->Get(idx).type;
+    ASType_t type = m_var.as_array->Get(idx).type.type;
     if (type == AS_TYPE_OBJECT_REF) return m_var.as_array->Get(idx).value.as_ref->GetType();
     else return type;
   }

Modified: development/source/script/cLexer.l
===================================================================
--- development/source/script/cLexer.l	2008-03-17 21:30:13 UTC (rev 2461)
+++ development/source/script/cLexer.l	2008-03-18 03:32:03 UTC (rev 2462)
@@ -88,10 +88,12 @@
 array       return AS_TOKEN_TYPE_ARRAY;    // Built-in Types
 bool        return AS_TOKEN_TYPE_BOOL;
 char        return AS_TOKEN_TYPE_CHAR;
+dict        return AS_TOKEN_TYPE_DICT;
 float       return AS_TOKEN_TYPE_FLOAT;
 int         return AS_TOKEN_TYPE_INT;
 matrix      return AS_TOKEN_TYPE_MATRIX;
 string      return AS_TOKEN_TYPE_STRING;
+var         return AS_TOKEN_TYPE_VAR;
 void        return AS_TOKEN_TYPE_VOID;
 
 if          return AS_TOKEN_CMD_IF;        // Blocks

Modified: development/source/script/cParser.cc
===================================================================
--- development/source/script/cParser.cc	2008-03-17 21:30:13 UTC (rev 2461)
+++ development/source/script/cParser.cc	2008-03-18 03:32:03 UTC (rev 2462)
@@ -675,10 +675,12 @@
     case TOKEN(TYPE_ARRAY):  type.type = AS_TYPE_ARRAY;  break;
     case TOKEN(TYPE_BOOL):   type.type = AS_TYPE_BOOL;   break;
     case TOKEN(TYPE_CHAR):   type.type = AS_TYPE_CHAR;   break;
+    case TOKEN(TYPE_DICT):   type.type = AS_TYPE_DICT;   break;
     case TOKEN(TYPE_FLOAT):  type.type = AS_TYPE_FLOAT;  break;
     case TOKEN(TYPE_INT):    type.type = AS_TYPE_INT;    break;
     case TOKEN(TYPE_MATRIX): type.type = AS_TYPE_MATRIX; break;
     case TOKEN(TYPE_STRING): type.type = AS_TYPE_STRING; break;
+    case TOKEN(TYPE_VAR):    type.type = AS_TYPE_VAR;    break;
     case TOKEN(TYPE_VOID):   type.type = AS_TYPE_VOID;   break;
     case TOKEN(ID):
       if (peekToken() != TOKEN(REF)) {
@@ -743,10 +745,12 @@
     case TOKEN(TYPE_ARRAY):  type.type = AS_TYPE_ARRAY;  break;
     case TOKEN(TYPE_BOOL):   type.type = AS_TYPE_BOOL;   break;
     case TOKEN(TYPE_CHAR):   type.type = AS_TYPE_CHAR;   break;
+    case TOKEN(TYPE_DICT):   type.type = AS_TYPE_DICT;   break;
     case TOKEN(TYPE_FLOAT):  type.type = AS_TYPE_FLOAT;  break;
     case TOKEN(TYPE_INT):    type.type = AS_TYPE_INT;    break;
     case TOKEN(TYPE_MATRIX): type.type = AS_TYPE_MATRIX; break;
     case TOKEN(TYPE_STRING): type.type = AS_TYPE_STRING; break;
+    case TOKEN(TYPE_VAR):    type.type = AS_TYPE_VAR;    break;
     case TOKEN(TYPE_VOID):   type.type = AS_TYPE_VOID;   break;
     case TOKEN(ID):
       if (peekToken() != TOKEN(REF)) {
@@ -951,10 +955,12 @@
       case TOKEN(TYPE_ARRAY):
       case TOKEN(TYPE_BOOL):
       case TOKEN(TYPE_CHAR):
+      case TOKEN(TYPE_DICT):
       case TOKEN(TYPE_FLOAT):
       case TOKEN(TYPE_INT):
       case TOKEN(TYPE_MATRIX):
       case TOKEN(TYPE_STRING):
+      case TOKEN(TYPE_VAR):
         node.Set(parseVariableDefinition());
         break;
         
@@ -990,10 +996,12 @@
     case TOKEN(TYPE_ARRAY):  vtype.type = AS_TYPE_ARRAY;  break;
     case TOKEN(TYPE_BOOL):   vtype.type = AS_TYPE_BOOL;   break;
     case TOKEN(TYPE_CHAR):   vtype.type = AS_TYPE_CHAR;   break;
+    case TOKEN(TYPE_DICT):   vtype.type = AS_TYPE_DICT;   break;
     case TOKEN(TYPE_FLOAT):  vtype.type = AS_TYPE_FLOAT;  break;
     case TOKEN(TYPE_INT):    vtype.type = AS_TYPE_INT;    break;
     case TOKEN(TYPE_MATRIX): vtype.type = AS_TYPE_MATRIX; break;
     case TOKEN(TYPE_STRING): vtype.type = AS_TYPE_STRING; break;
+    case TOKEN(TYPE_VAR):    vtype.type = AS_TYPE_VAR;    break;
     case TOKEN(ID):
       if (peekToken() != TOKEN(REF)) {
         nextToken();

Modified: development/source/script/cSemanticASTVisitor.cc
===================================================================
--- development/source/script/cSemanticASTVisitor.cc	2008-03-17 21:30:13 UTC (rev 2461)
+++ development/source/script/cSemanticASTVisitor.cc	2008-03-18 03:32:03 UTC (rev 2462)
@@ -44,19 +44,21 @@
 #define TYPEINFO(x) sASTypeInfo(AS_TYPE_ ## x)
 
 namespace AvidaScript {
-  static const bool valid_cast[11][11] = {
-  // ARRAY, BOOL , CHAR , FLOAT, INT  , @OBJ , MATRX, STRNG, RUNTM, VOID , INVLD
-    {true , true , false, false, false, false, false, true , true , false, false}, // TYPE(ARRAY)
-    {false, true , true , true , true , false, true , true , true , false, false}, // TYPE(BOOL)
-    {false, true , true , true , true , false, true , true , true , false, false}, // TYPE(CHAR)
-    {false, true , false, true , true , false, true , true , true , false, false}, // TYPE(FLOAT)
-    {false, true , true , true , true , false, true , true , true , false, false}, // TYPE(INT)
-    {false, true , false, false, false, true , false, true , false, false, false}, // TYPE(OBJECT_REF)
-    {true , true , false, false, false, false, true , true , true , false, false}, // TYPE(MATRIX)
-    {true , true , false, true , true , false, false, true , true , false, false}, // TYPE(STRNG)
-    {true , true , true , true , true , true , true , true , true , false, false}, // TYPE(RUNTIME)
-    {false, false, false, false, false, false, false, false, false, false, false}, // TYPE(VOID)
-    {false, false, false, false, false, false, false, false, false, false, false}  // TYPE(INVALID)
+  static const bool valid_cast[13][13] = {
+  // ARRAY, BOOL , CHAR , DICT , FLOAT, INT  , @OBJ , MATRX, STRNG, VAR  , RUNTM, VOID , INVLD
+    {true , true , false, true , false, false, false, false, true , true , true , false, false}, // TYPE(ARRAY)
+    {false, true , true , false, true , true , false, true , true , true , true , false, false}, // TYPE(BOOL)
+    {false, true , true , false, true , true , false, true , true , true , true , false, false}, // TYPE(CHAR)
+    {false, false, false, true , false, false, false, false, true , true , true , false, false}, // TYPE(DICT)
+    {false, true , false, false, true , true , false, true , true , true , true , false, false}, // TYPE(FLOAT)
+    {false, true , true , false, true , true , false, true , true , true , true , false, false}, // TYPE(INT)
+    {false, true , false, false, false, false, true , false, true , true , false, false, false}, // TYPE(OBJECT_REF)
+    {true , true , false, false, false, false, false, true , true , true , true , false, false}, // TYPE(MATRIX)
+    {true , true , false, false, true , true , false, false, true , true , true , false, false}, // TYPE(STRNG)
+    {true , true , true , true , true , true , true , true , true , true , true , false, false}, // TYPE(VAR)
+    {true , true , true , true , true , true , true , true , true , true , true , false, false}, // TYPE(RUNTIME)
+    {false, false, false, false, false, false, false, false, false, false, false, false, false}, // TYPE(VOID)
+    {false, false, false, false, false, false, false, false, false, false, false, false, false}  // TYPE(INVALID)
   };
 }
 
@@ -825,6 +827,7 @@
         case TYPE(STRING):
           return TYPE(BOOL);
 
+        case TYPE(VAR):
         case TYPE(RUNTIME):
           return TYPE(RUNTIME);
         default: break;
@@ -839,6 +842,7 @@
         case TYPE(INT):       return TYPE(INT);
         case TYPE(MATRIX):    return TYPE(MATRIX);
         case TYPE(STRING):    return TYPE(STRING);
+        case TYPE(VAR):       return TYPE(RUNTIME);
         case TYPE(RUNTIME):   return TYPE(RUNTIME);
         default: break;
       }
@@ -852,6 +856,7 @@
         case TYPE(INT):       return TYPE(FLOAT);
         case TYPE(MATRIX):    return TYPE(MATRIX);
         case TYPE(STRING):    return TYPE(FLOAT);
+        case TYPE(VAR):       return TYPE(RUNTIME);
         case TYPE(RUNTIME):   return TYPE(RUNTIME);
         default: break;
       }
@@ -865,6 +870,7 @@
         case TYPE(INT):       return TYPE(INT);
         case TYPE(MATRIX):    return TYPE(MATRIX);
         case TYPE(STRING):    return TYPE(INT);
+        case TYPE(VAR):       return TYPE(RUNTIME);
         case TYPE(RUNTIME):   return TYPE(RUNTIME);
         default: break;
       }
@@ -873,6 +879,9 @@
       return TYPE(MATRIX);
     case TYPE(STRING):
       return TYPE(STRING);
+      
+    case TYPE(VAR):
+      return TYPE(RUNTIME);
     
     case TYPE(RUNTIME):
       return TYPE(RUNTIME);




More information about the Avida-cvs mailing list