[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