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

brysonda at myxo.css.msu.edu brysonda at myxo.css.msu.edu
Tue Mar 4 16:35:05 PST 2008


Author: brysonda
Date: 2008-03-04 19:35:05 -0500 (Tue, 04 Mar 2008)
New Revision: 2424

Modified:
   development/source/script/ASTree.h
   development/source/script/AvidaScript.h
   development/source/script/cDirectInterpretASTVisitor.cc
   development/source/script/cDirectInterpretASTVisitor.h
   development/source/script/cSemanticASTVisitor.cc
Log:
AS:
Correct comparison semantic checking.
Char and int casting.
Some supporting methods for value comparisons.
Beginning of binary expression interpreting.


Modified: development/source/script/ASTree.h
===================================================================
--- development/source/script/ASTree.h	2008-03-04 23:48:22 UTC (rev 2423)
+++ development/source/script/ASTree.h	2008-03-05 00:35:05 UTC (rev 2424)
@@ -379,10 +379,11 @@
   cASTNode* m_left;
   cASTNode* m_right;
   ASType_t m_type;
+  ASType_t m_compare_type;
   
 public:
   cASTExpressionBinary(const cASFilePosition& fp, ASToken_t op, cASTNode* l, cASTNode* r)
-    : cASTNode(fp), m_op(op), m_left(l), m_right(r), m_type(AS_TYPE_INVALID) { ; }
+    : cASTNode(fp), m_op(op), m_left(l), m_right(r), m_type(AS_TYPE_INVALID), m_compare_type(AS_TYPE_INVALID) { ; }
   ~cASTExpressionBinary() { delete m_left; delete m_right; }
   
   inline ASToken_t GetOperator() { return m_op; }
@@ -394,6 +395,9 @@
   ASType_t GetType() const { return m_type; }
   inline void SetType(ASType_t type) { m_type = type; }
 
+  inline ASType_t GetCompareType() const { return m_compare_type; }
+  inline void SetCompareType(ASType_t type) { m_compare_type = type; }
+
   void Accept(cASTVisitor& visitor);
 };
 

Modified: development/source/script/AvidaScript.h
===================================================================
--- development/source/script/AvidaScript.h	2008-03-04 23:48:22 UTC (rev 2423)
+++ development/source/script/AvidaScript.h	2008-03-05 00:35:05 UTC (rev 2424)
@@ -122,6 +122,7 @@
   AS_SEMANTIC_ERR_ARGUMENT_DEFAULT_REQUIRED,
   AS_SEMANTIC_ERR_ARGUMENT_MISSING_REQUIRED,
   AS_SEMANTIC_ERR_CANNOT_CAST,
+  AS_SEMANTIC_ERR_CANNOT_COMPARE,
   AS_SEMANTIC_ERR_FUNCTION_CALL_SIGNATURE_MISMATCH,
   AS_SEMANTIC_ERR_FUNCTION_REDEFINITION,
   AS_SEMANTIC_ERR_FUNCTION_RTYPE_MISMATCH,

Modified: development/source/script/cDirectInterpretASTVisitor.cc
===================================================================
--- development/source/script/cDirectInterpretASTVisitor.cc	2008-03-04 23:48:22 UTC (rev 2423)
+++ development/source/script/cDirectInterpretASTVisitor.cc	2008-03-05 00:35:05 UTC (rev 2424)
@@ -112,12 +112,52 @@
 void cDirectInterpretASTVisitor::visitExpressionBinary(cASTExpressionBinary& node)
 {
   // @TODO - handle binary expression
+  
+  switch (node.GetOperator()) {
+    case TOKEN(ARR_RANGE):
+    case TOKEN(ARR_EXPAN):
+      // @TODO - implement array range/expand
+      INTERPRET_ERROR(INTERNAL);
+    
+    case TOKEN(OP_LOGIC_AND):
+    case TOKEN(OP_LOGIC_OR):
+      {
+        node.GetLeft()->Accept(*this);
+        bool lval = asBool(m_rtype, m_rvalue, node);
+        node.GetRight()->Accept(*this);
+        bool rval = asBool(m_rtype, m_rvalue, node);
+        m_rvalue.as_bool = (node.GetOperator() == TOKEN(OP_LOGIC_AND)) ? (lval && rval) : (lval || rval);
+      }
+      break;
+      
+    case TOKEN(OP_BIT_AND):
+    case TOKEN(OP_BIT_OR):
+      
+    case TOKEN(OP_EQ):
+    case TOKEN(OP_NEQ):
+
+    case TOKEN(OP_LE):
+    case TOKEN(OP_GE):
+    case TOKEN(OP_LT):
+    case TOKEN(OP_GT):
+      
+      
+    case TOKEN(OP_ADD):
+    case TOKEN(OP_SUB):
+    case TOKEN(OP_MUL):
+    case TOKEN(OP_DIV):
+    case TOKEN(OP_MOD):
+    case TOKEN(IDX_OPEN):
+      break;
+      
+    default:
+      INTERPRET_ERROR(INTERNAL);
+  }
 }
 
 
 void cDirectInterpretASTVisitor::visitExpressionUnary(cASTExpressionUnary& node)
 {
-  // @TODO - handle unary expression
   node.GetExpression()->Accept(*this);
   
   switch (node.GetOperator()) {
@@ -275,6 +315,47 @@
 }
 
 
+char cDirectInterpretASTVisitor::asChar(ASType_t type, uAnyType value, cASTNode& node)
+{
+  switch (type) {
+    case TYPE(BOOL):
+      return (value.as_bool) ? 1 : 0;
+    case TYPE(CHAR):
+      return value.as_char;
+    case TYPE(INT):
+      return (char)value.as_int;
+
+    default:
+      INTERPRET_ERROR(TYPE_CAST, mapType(type), mapType(TYPE(CHAR)));
+  }
+  
+  return false;
+}
+
+
+int cDirectInterpretASTVisitor::asInt(ASType_t type, uAnyType value, cASTNode& node)
+{
+  switch (type) {
+    case TYPE(BOOL):
+      return (value.as_bool) ? 1 : 0;
+    case TYPE(CHAR):
+      return (int)value.as_char;
+    case TYPE(INT):
+      return value.as_int;
+    case TYPE(FLOAT):
+      return (int)value.as_float;
+    case TYPE(STRING):
+      return value.as_string->AsInt();
+      
+    default:
+      INTERPRET_ERROR(TYPE_CAST, mapType(type), mapType(TYPE(INT)));
+  }
+  
+  return false;
+}
+
+
+
 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-04 23:48:22 UTC (rev 2423)
+++ development/source/script/cDirectInterpretASTVisitor.h	2008-03-05 00:35:05 UTC (rev 2424)
@@ -78,6 +78,8 @@
 
 private:
   bool asBool(ASType_t type, uAnyType value, cASTNode& node);
+  char asChar(ASType_t type, uAnyType value, cASTNode& node);
+  int asInt(ASType_t type, uAnyType value, cASTNode& node);
   void reportError(ASDirectInterpretError_t err, const cASFilePosition& fp, const int line, ...);
 };
 

Modified: development/source/script/cSemanticASTVisitor.cc
===================================================================
--- development/source/script/cSemanticASTVisitor.cc	2008-03-04 23:48:22 UTC (rev 2423)
+++ development/source/script/cSemanticASTVisitor.cc	2008-03-05 00:35:05 UTC (rev 2424)
@@ -372,20 +372,38 @@
       
     case TOKEN(OP_LOGIC_AND):
     case TOKEN(OP_LOGIC_OR):
+      checkCast(node.GetLeft()->GetType(), TYPE(BOOL));
+      checkCast(node.GetRight()->GetType(), TYPE(BOOL));
+      node.SetType(TYPE(BOOL));
+      break;
+    
     case TOKEN(OP_EQ):
+    case TOKEN(OP_NEQ):
+      if ((validArithmeticType(node.GetLeft()->GetType(), true) && validArithmeticType(node.GetRight()->GetType(), true)) ||
+          (node.GetLeft()->GetType() == TYPE(STRING) && node.GetRight()->GetType() == TYPE(STRING))) {
+        node.SetCompareType(getConsensusType(node.GetLeft()->GetType(), node.GetRight()->GetType()));
+        node.SetType(TYPE(BOOL));
+      } else {
+        SEMANTIC_ERROR(CANNOT_COMPARE);
+      }
+      break;
+      
     case TOKEN(OP_LE):
     case TOKEN(OP_GE):
     case TOKEN(OP_LT):
     case TOKEN(OP_GT):
-    case TOKEN(OP_NEQ):
-      checkCast(node.GetLeft()->GetType(), TYPE(BOOL));
-      checkCast(node.GetRight()->GetType(), TYPE(BOOL));
-      node.SetType(TYPE(BOOL));
+      if (validArithmeticType(node.GetLeft()->GetType(), true) && validArithmeticType(node.GetRight()->GetType(), true)) {
+        node.SetCompareType(getConsensusType(node.GetLeft()->GetType(), node.GetRight()->GetType()));
+        node.SetType(TYPE(BOOL));
+      } else {
+        SEMANTIC_ERROR(CANNOT_COMPARE);
+      }
       break;
       
     case TOKEN(OP_ADD):
-      if (validArithmeticType(node.GetLeft()->GetType(), true) || validArithmeticType(node.GetRight()->GetType(), true) ||
-          node.GetLeft()->GetType() == TYPE(STRING) || node.GetLeft()->GetType() == TYPE(ARRAY)) {
+      if ((validArithmeticType(node.GetLeft()->GetType(), true) && validArithmeticType(node.GetRight()->GetType(), true)) ||
+          (node.GetLeft()->GetType() == TYPE(STRING) && node.GetRight()->GetType() == TYPE(STRING)) ||
+          (node.GetLeft()->GetType() == TYPE(ARRAY) && node.GetRight()->GetType() == TYPE(ARRAY))) {
         node.SetType(getConsensusType(node.GetLeft()->GetType(), node.GetRight()->GetType()));
       } else {
         SEMANTIC_ERROR(UNDEFINED_TYPE_OP, mapToken(node.GetOperator()), mapType(node.GetLeft()->GetType()));
@@ -395,7 +413,7 @@
       
     case TOKEN(OP_SUB):
     case TOKEN(OP_MUL):
-      if (validArithmeticType(node.GetLeft()->GetType(), true) || validArithmeticType(node.GetRight()->GetType(), true)) {
+      if (validArithmeticType(node.GetLeft()->GetType(), true) && validArithmeticType(node.GetRight()->GetType(), true)) {
         node.SetType(getConsensusType(node.GetLeft()->GetType(), node.GetRight()->GetType()));
       } else {
         SEMANTIC_ERROR(UNDEFINED_TYPE_OP, mapToken(node.GetOperator()), mapType(node.GetLeft()->GetType()));
@@ -405,7 +423,7 @@
     
     case TOKEN(OP_DIV):
     case TOKEN(OP_MOD):
-      if (validArithmeticType(node.GetLeft()->GetType()) || validArithmeticType(node.GetRight()->GetType())) {
+      if (validArithmeticType(node.GetLeft()->GetType()) && validArithmeticType(node.GetRight()->GetType())) {
         node.SetType(getConsensusType(node.GetLeft()->GetType(), node.GetRight()->GetType()));
       } else {
         SEMANTIC_ERROR(UNDEFINED_TYPE_OP, mapToken(node.GetOperator()), mapType(node.GetLeft()->GetType()));
@@ -706,10 +724,7 @@
 
 inline bool cSemanticASTVisitor::validBitwiseType(ASType_t type) const {
   switch (type) {
-    case TYPE(ARRAY):
-    case TYPE(MATRIX):
     case TYPE(RUNTIME):
-      // Array and Matrix meta-op, validity must be determined at runtime
     case TYPE(INT):
     case TYPE(CHAR):
       // Char and Int Okay
@@ -800,6 +815,8 @@
         std::cerr << "cannot cast " << type1 << " to " << type2 << ERR_ENDL;
       }
       break;
+    case AS_SEMANTIC_ERR_CANNOT_COMPARE:
+      std::cerr << "cannot compare values" << ERR_ENDL; 
     case AS_SEMANTIC_ERR_FUNCTION_CALL_SIGNATURE_MISMATCH:
       std::cerr << "invalid call signature for '" << VA_ARG_STR << "()'" << ERR_ENDL;
       break;




More information about the Avida-cvs mailing list