[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