[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