[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