[Avida-SVN] r2492 - development/source/script
brysonda at myxo.css.msu.edu
brysonda at myxo.css.msu.edu
Sun Mar 23 11:46:08 PDT 2008
Author: brysonda
Date: 2008-03-23 14:46:08 -0400 (Sun, 23 Mar 2008)
New Revision: 2492
Modified:
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:
String indexing.
Fix character parsing to strip quotes.
Allow escape sequences in literal characters.
Validated literal characters in semantic check.
Modified: development/source/script/AvidaScript.h
===================================================================
--- development/source/script/AvidaScript.h 2008-03-23 18:25:19 UTC (rev 2491)
+++ development/source/script/AvidaScript.h 2008-03-23 18:46:08 UTC (rev 2492)
@@ -143,6 +143,7 @@
AS_SEMANTIC_ERR_FUNCTION_UNDECLARED,
AS_SEMANTIC_ERR_FUNCTION_UNDEFINED,
AS_SEMANTIC_ERR_INVALID_ASSIGNMENT_TARGET,
+ AS_SEMANTIC_ERR_INVALID_CHAR_LITERAL,
AS_SEMANTIC_ERR_TOO_MANY_ARGUMENTS,
AS_SEMANTIC_ERR_UNDEFINED_TYPE_OP,
AS_SEMANTIC_ERR_UNPACK_WILD_NONARRAY,
Modified: development/source/script/cDirectInterpretASTVisitor.cc
===================================================================
--- development/source/script/cDirectInterpretASTVisitor.cc 2008-03-23 18:25:19 UTC (rev 2491)
+++ development/source/script/cDirectInterpretASTVisitor.cc 2008-03-23 18:46:08 UTC (rev 2492)
@@ -719,6 +719,7 @@
case TYPE(ARRAY):
case TYPE(DICT):
case TYPE(MATRIX):
+ case TYPE(STRING):
break;
default:
@@ -1439,7 +1440,7 @@
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): m_rvalue.as_ref = new cMatrixVarRef(m_call_stack[sp + var_id].value); break;
- case TYPE(STRING): INTERPRET_ERROR(INTERNAL); // @TODO - var ref object assignment
+ case TYPE(STRING): m_rvalue.as_ref = new cStringVarRef(m_call_stack[sp + var_id].value); break;
default:
INTERPRET_ERROR(INTERNAL);
@@ -2140,6 +2141,18 @@
}
+bool cDirectInterpretASTVisitor::cDictVarRef::Get(const sAggregateValue& idx, sAggregateValue& val)
+{
+ 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;
+}
+
+
bool cDirectInterpretASTVisitor::cMatrixVarRef::Get(const sAggregateValue& idx, sAggregateValue& val)
{
int idxi = -1;
@@ -2188,18 +2201,6 @@
-bool cDirectInterpretASTVisitor::cDictVarRef::Get(const sAggregateValue& idx, sAggregateValue& val)
-{
- 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;
-}
-
-
bool cDirectInterpretASTVisitor::cObjectIndexRef::Get(const sAggregateValue& idx, sAggregateValue& val)
{
sAggregateValue o_val;
@@ -2328,6 +2329,57 @@
}
+bool cDirectInterpretASTVisitor::cStringVarRef::Get(const 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(); break;
+ default: break;
+ }
+
+ if (idxi < 0 || idxi >= m_var.as_string->GetSize()) return false;
+
+ val.value.as_char = (*m_var.as_string)[idxi];
+ val.type = TYPE(CHAR);
+ return true;
+}
+
+bool cDirectInterpretASTVisitor::cStringVarRef::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(ARRAY): idx.value.as_array->RemoveReference(); break;
+ case TYPE(DICT): idx.value.as_dict->RemoveReference(); break;
+ case TYPE(MATRIX): idx.value.as_matrix->RemoveReference(); break;
+ case TYPE(OBJECT_REF): delete idx.value.as_ref; break;
+ default: break;
+ }
+
+ if (idxi < 0 || idxi >= m_var.as_string->GetSize()) return false;
+
+ switch (val.type.type) {
+ case TYPE(BOOL): (*m_var.as_string)[idxi] = (val.value.as_bool) ? 1 : 0; break;
+ case TYPE(CHAR): (*m_var.as_string)[idxi] = val.value.as_char; break;
+ case TYPE(INT): (*m_var.as_string)[idxi] = (char)val.value.as_int; break;
+
+ default:
+ return false;
+ }
+
+ return true;
+}
+
+
+
void cDirectInterpretASTVisitor::reportError(ASDirectInterpretError_t err, const cASFilePosition& fp, const int line, ...)
{
#if DEBUG_AS_DIRECT_INTERPRET
Modified: development/source/script/cDirectInterpretASTVisitor.h
===================================================================
--- development/source/script/cDirectInterpretASTVisitor.h 2008-03-23 18:25:19 UTC (rev 2491)
+++ development/source/script/cDirectInterpretASTVisitor.h 2008-03-23 18:46:08 UTC (rev 2492)
@@ -263,35 +263,35 @@
bool Set(sAggregateValue& idx, sAggregateValue& val);
};
- class cMatrixVarRef : public cObjectRef
+ class cDictVarRef : public cObjectRef
{
private:
uAnyType& m_var;
public:
- cMatrixVarRef(uAnyType& var) : m_var(var) { ; }
- ~cMatrixVarRef() { ; }
+ cDictVarRef(uAnyType& var) : m_var(var) { ; }
+ ~cDictVarRef() { ; }
bool IsWritable() { return true; }
- bool Get(sAggregateValue& val) { val.value = m_var; val.type = AS_TYPE_MATRIX; 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 cDictVarRef : public cObjectRef
+ class cMatrixVarRef : public cObjectRef
{
private:
uAnyType& m_var;
public:
- cDictVarRef(uAnyType& var) : m_var(var) { ; }
- ~cDictVarRef() { ; }
+ cMatrixVarRef(uAnyType& var) : m_var(var) { ; }
+ ~cMatrixVarRef() { ; }
bool IsWritable() { return true; }
- bool Get(sAggregateValue& val) { val.value = m_var; val.type = AS_TYPE_DICT; return true;}
+ bool Get(sAggregateValue& val) { val.value = m_var; val.type = AS_TYPE_MATRIX; return true; }
bool Get(const sAggregateValue& idx, sAggregateValue& val);
bool Set(sAggregateValue& val) { return false; }
bool Set(sAggregateValue& idx, sAggregateValue& val);
@@ -314,6 +314,24 @@
bool Set(sAggregateValue& val) { return m_obj->Set(m_idx, val); }
bool Set(sAggregateValue& idx, sAggregateValue& val);
};
+
+ class cStringVarRef : public cObjectRef
+ {
+ private:
+ uAnyType& m_var;
+
+ public:
+ cStringVarRef(uAnyType& var) : m_var(var) { ; }
+ ~cStringVarRef() { ; }
+
+ bool IsWritable() { return true; }
+
+ bool Get(sAggregateValue& val) { val.value = m_var; val.type = AS_TYPE_STRING; return true; }
+ bool Get(const sAggregateValue& idx, sAggregateValue& val);
+ bool Set(sAggregateValue& val) { return false; }
+ bool Set(sAggregateValue& idx, sAggregateValue& val);
+ };
+
};
namespace nHashTable {
Modified: development/source/script/cLexer.l
===================================================================
--- development/source/script/cLexer.l 2008-03-23 18:25:19 UTC (rev 2491)
+++ development/source/script/cLexer.l 2008-03-23 18:46:08 UTC (rev 2492)
@@ -140,7 +140,7 @@
[0-9]+ return AS_TOKEN_INT;
\"\" return AS_TOKEN_STRING;
\"([^"\\\n]|\\\"|\\\\|\\.)*\" return AS_TOKEN_STRING;
-\'([^'\\\n]|\\\'|\\\\)\' return AS_TOKEN_CHAR;
+\'([^'\\\n]|\\\'|\\\\|\\.)\' return AS_TOKEN_CHAR;
. return AS_TOKEN_UNKNOWN; // Unrecognized Tokens
Modified: development/source/script/cParser.cc
===================================================================
--- development/source/script/cParser.cc 2008-03-23 18:25:19 UTC (rev 2491)
+++ development/source/script/cParser.cc 2008-03-23 18:46:08 UTC (rev 2492)
@@ -608,7 +608,8 @@
expr.Set(new cASTLiteral(FILEPOS, AS_TYPE_INT, currentText()));
break;
case TOKEN(CHAR):
- expr.Set(new cASTLiteral(FILEPOS, AS_TYPE_CHAR, currentText()));
+ expr.Set(new cASTLiteral(FILEPOS, AS_TYPE_CHAR,
+ currentText().Substring(1, currentText().GetSize() - 2).ParseEscapeSequences()));
break;
case TOKEN(BOOL):
expr.Set(new cASTLiteral(FILEPOS, AS_TYPE_BOOL, currentText()));
Modified: development/source/script/cSemanticASTVisitor.cc
===================================================================
--- development/source/script/cSemanticASTVisitor.cc 2008-03-23 18:25:19 UTC (rev 2491)
+++ development/source/script/cSemanticASTVisitor.cc 2008-03-23 18:46:08 UTC (rev 2492)
@@ -778,7 +778,9 @@
void cSemanticASTVisitor::VisitLiteral(cASTLiteral& node)
{
- // Nothing to do here... type already determined by the parser
+ if (node.GetType() == TYPE(CHAR) && node.GetValue().GetSize() != 1) {
+ SEMANTIC_ERROR(INVALID_CHAR_LITERAL);
+ }
}
@@ -1111,6 +1113,9 @@
case AS_SEMANTIC_ERR_INVALID_ASSIGNMENT_TARGET:
std::cerr << "invalid assignment target" << ERR_ENDL;
break;
+ case AS_SEMANTIC_ERR_INVALID_CHAR_LITERAL:
+ std::cerr << "invalid char literal" << ERR_ENDL;
+ break;
case AS_SEMANTIC_ERR_TOO_MANY_ARGUMENTS:
std::cerr << "too many arguments" << ERR_ENDL;
break;
More information about the Avida-cvs
mailing list