[Avida-SVN] r2387 - development/source/script
brysonda at myxo.css.msu.edu
brysonda at myxo.css.msu.edu
Wed Feb 27 18:28:37 PST 2008
Author: brysonda
Date: 2008-02-27 21:28:36 -0500 (Wed, 27 Feb 2008)
New Revision: 2387
Modified:
development/source/script/AvidaScript.cc
development/source/script/AvidaScript.h
development/source/script/cSemanticASTVisitor.cc
development/source/script/cSemanticASTVisitor.h
Log:
AS binary expression semantics.
Modified: development/source/script/AvidaScript.cc
===================================================================
--- development/source/script/AvidaScript.cc 2008-02-28 01:50:36 UTC (rev 2386)
+++ development/source/script/AvidaScript.cc 2008-02-28 02:28:36 UTC (rev 2387)
@@ -62,8 +62,9 @@
case AS_TYPE_INT: return "int";
case AS_TYPE_MATRIX: return "matrix";
case AS_TYPE_STRING: return "string";
+ case AS_TYPE_OBJECT_REF: return "object";
+ case AS_TYPE_RUNTIME: return "runtime";
case AS_TYPE_VOID: return "void";
- case AS_TYPE_OBJECT_REF: return "object";
case AS_TYPE_INVALID:
default:
Modified: development/source/script/AvidaScript.h
===================================================================
--- development/source/script/AvidaScript.h 2008-02-28 01:50:36 UTC (rev 2386)
+++ development/source/script/AvidaScript.h 2008-02-28 02:28:36 UTC (rev 2387)
@@ -134,8 +134,11 @@
AS_TYPE_OBJECT_REF,
AS_TYPE_MATRIX,
AS_TYPE_STRING,
+
+ AS_TYPE_RUNTIME,
+
AS_TYPE_VOID,
-
+
AS_TYPE_INVALID
} ASType_t;
Modified: development/source/script/cSemanticASTVisitor.cc
===================================================================
--- development/source/script/cSemanticASTVisitor.cc 2008-02-28 01:50:36 UTC (rev 2386)
+++ development/source/script/cSemanticASTVisitor.cc 2008-02-28 02:28:36 UTC (rev 2387)
@@ -39,16 +39,19 @@
#define TYPE(x) AS_TYPE_ ## x
namespace AvidaScript {
- static const bool valid_cast[8][8] = {
- // ARRAY, BOOL , CHAR , FLOAT, INT , @OBJ , MATRX, STRNG
- {true , true , false, false, false, false, false, true }, // TYPE(ARRAY)
- {true , true , true , true , true , false, true , true }, // TYPE(BOOL)
- {true , true , true , true , true , false, true , true }, // TYPE(CHAR)
- {true , true , false, true , true , false, true , true }, // TYPE(FLOAT)
- {true , true , true , true , true , false, true , true }, // TYPE(INT)
- {true , true , false, false, false, true , false, true }, // TYPE(OBJECT_REF)
- {true , true , false, false, false, false, true , true }, // TYPE(MATRIX)
- {true , true , false, true , true , false, false, true } // TYPE(STRNG)
+ 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)
+ {true , true , true , true , true , false, true , true , true , false, false}, // TYPE(BOOL)
+ {true , true , true , true , true , false, true , true , true , false, false}, // TYPE(CHAR)
+ {true , true , false, true , true , false, true , true , true , false, false}, // TYPE(FLOAT)
+ {true , true , true , true , true , false, true , true , true , false, false}, // TYPE(INT)
+ {true , 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)
};
}
@@ -149,11 +152,20 @@
case TOKEN(DOT):
break;
case TOKEN(IDX_OPEN):
+ checkCast(node.GetLeft()->GetType(), TYPE(ARRAY));
+ checkCast(node.GetRight()->GetType(), TYPE(INT));
+ node.SetType(TYPE(RUNTIME));
break;
case TOKEN(ARR_RANGE):
+ checkCast(node.GetLeft()->GetType(), TYPE(INT));
+ checkCast(node.GetRight()->GetType(), TYPE(INT));
+ node.SetType(TYPE(ARRAY));
break;
case TOKEN(ARR_EXPAN):
+ checkCast(node.GetRight()->GetType(), TYPE(INT));
+ node.SetType(TYPE(ARRAY));
break;
+
case TOKEN(OP_BIT_AND):
case TOKEN(OP_BIT_OR):
{
@@ -167,12 +179,10 @@
SEMANTIC_ERROR(UNDEFINED_TYPE_OP, mapToken(node.GetOperator()), mapType(node.GetRight()->GetType()));
}
- if (valid_types) {
- // @TODO - get consensus type
- // Set node return type
- }
+ if (valid_types) node.SetType(getConsensusType(node.GetLeft()->GetType(), node.GetRight()->GetType()));
}
break;
+
case TOKEN(OP_LOGIC_AND):
case TOKEN(OP_LOGIC_OR):
case TOKEN(OP_EQ):
@@ -185,17 +195,45 @@
checkCast(node.GetRight()->GetType(), TYPE(BOOL));
node.SetType(TYPE(BOOL));
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)) {
+ node.SetType(getConsensusType(node.GetLeft()->GetType(), node.GetRight()->GetType()));
+ } else {
+ SEMANTIC_ERROR(UNDEFINED_TYPE_OP, mapToken(node.GetOperator()), mapType(node.GetLeft()->GetType()));
+ SEMANTIC_ERROR(UNDEFINED_TYPE_OP, mapToken(node.GetOperator()), mapType(node.GetRight()->GetType()));
+ }
+ break;
+
case TOKEN(OP_SUB):
case TOKEN(OP_MUL):
+ 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()));
+ SEMANTIC_ERROR(UNDEFINED_TYPE_OP, mapToken(node.GetOperator()), mapType(node.GetRight()->GetType()));
+ }
+ break;
+
case TOKEN(OP_DIV):
case TOKEN(OP_MOD):
+ 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()));
+ SEMANTIC_ERROR(UNDEFINED_TYPE_OP, mapToken(node.GetOperator()), mapType(node.GetRight()->GetType()));
+ }
break;
default:
SEMANTIC_ERROR(INTERNAL);
break;
}
+
+ if (node.GetType() == TYPE(INVALID) && m_success == true) {
+ SEMANTIC_ERROR(INTERNAL);
+ }
}
@@ -268,11 +306,103 @@
{
}
+ASType_t cSemanticASTVisitor::getConsensusType(ASType_t left, ASType_t right)
+{
+ switch (left) {
+ case TYPE(ARRAY):
+ return TYPE(ARRAY);
+ case TYPE(BOOL):
+ switch (right) {
+ case TYPE(ARRAY):
+ case TYPE(BOOL):
+ case TYPE(CHAR):
+ case TYPE(FLOAT):
+ case TYPE(INT):
+ case TYPE(MATRIX):
+ case TYPE(OBJECT_REF):
+ case TYPE(STRING):
+ return TYPE(BOOL);
+ case TYPE(RUNTIME):
+ return TYPE(RUNTIME);
+ default: break;
+ }
+ break;
+ case TYPE(CHAR):
+ switch (right) {
+ case TYPE(ARRAY): return TYPE(ARRAY);
+ case TYPE(BOOL): return TYPE(CHAR);
+ case TYPE(CHAR): return TYPE(CHAR);
+ case TYPE(FLOAT): return TYPE(FLOAT);
+ case TYPE(INT): return TYPE(INT);
+ case TYPE(MATRIX): return TYPE(MATRIX);
+ case TYPE(STRING): return TYPE(STRING);
+ case TYPE(RUNTIME): return TYPE(RUNTIME);
+ default: break;
+ }
+ break;
+ case TYPE(FLOAT):
+ switch (right) {
+ case TYPE(ARRAY): return TYPE(ARRAY);
+ case TYPE(BOOL): return TYPE(FLOAT);
+ case TYPE(CHAR): return TYPE(FLOAT);
+ case TYPE(FLOAT): return TYPE(FLOAT);
+ case TYPE(INT): return TYPE(FLOAT);
+ case TYPE(MATRIX): return TYPE(MATRIX);
+ case TYPE(STRING): return TYPE(FLOAT);
+ case TYPE(RUNTIME): return TYPE(RUNTIME);
+ default: break;
+ }
+ break;
+ case TYPE(INT):
+ switch (right) {
+ case TYPE(ARRAY): return TYPE(ARRAY);
+ case TYPE(BOOL): return TYPE(INT);
+ case TYPE(CHAR): return TYPE(INT);
+ case TYPE(FLOAT): return TYPE(FLOAT);
+ case TYPE(INT): return TYPE(INT);
+ case TYPE(MATRIX): return TYPE(MATRIX);
+ case TYPE(STRING): return TYPE(INT);
+ case TYPE(RUNTIME): return TYPE(RUNTIME);
+ default: break;
+ }
+ break;
+ case TYPE(MATRIX):
+ return TYPE(MATRIX);
+ case TYPE(STRING):
+ return TYPE(STRING);
+
+ case TYPE(RUNTIME):
+ return TYPE(RUNTIME);
+
+ default: break;
+ }
+
+ return TYPE(INVALID);
+}
+
+inline bool cSemanticASTVisitor::validArithmeticType(ASType_t type, bool allow_matrix) const {
+ switch (type) {
+ case TYPE(MATRIX):
+ return allow_matrix;
+
+ case TYPE(RUNTIME):
+ case TYPE(INT):
+ case TYPE(CHAR):
+ case TYPE(FLOAT):
+ return true;
+
+ default:
+ return false;
+ }
+}
+
+
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):
Modified: development/source/script/cSemanticASTVisitor.h
===================================================================
--- development/source/script/cSemanticASTVisitor.h 2008-02-28 01:50:36 UTC (rev 2386)
+++ development/source/script/cSemanticASTVisitor.h 2008-02-28 02:28:36 UTC (rev 2387)
@@ -90,7 +90,8 @@
void visitUnpackTarget(cASTUnpackTarget&);
private:
-
+ ASType_t getConsensusType(ASType_t t1, ASType_t t2);
+ inline bool validArithmeticType(ASType_t type, bool allow_matrix = false) const;
inline bool validBitwiseType(ASType_t type) const;
void reportError(bool fail, ASSemanticError_t err, const cASFilePosition& fp, const int line, ...);
};
More information about the Avida-cvs
mailing list