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

brysonda at myxo.css.msu.edu brysonda at myxo.css.msu.edu
Tue Mar 11 19:49:50 PDT 2008


Author: brysonda
Date: 2008-03-11 22:49:50 -0400 (Tue, 11 Mar 2008)
New Revision: 2453

Modified:
   development/source/script/ASTree.cc
   development/source/script/ASTree.h
   development/source/script/AvidaScript.cc
   development/source/script/AvidaScript.h
   development/source/script/cASTVisitor.h
   development/source/script/cDirectInterpretASTVisitor.cc
   development/source/script/cDirectInterpretASTVisitor.h
   development/source/script/cDumpASTVisitor.cc
   development/source/script/cDumpASTVisitor.h
   development/source/script/cLexer.l
   development/source/script/cParser.cc
   development/source/script/cSemanticASTVisitor.cc
   development/source/script/cSemanticASTVisitor.h
Log:
AS:
Add support for a variety of builtin functions (explicit casting, array/str length, and resize)
Adjust string literals to exclude the token's quotes from the actual value.

Modified: development/source/script/ASTree.cc
===================================================================
--- development/source/script/ASTree.cc	2008-03-11 19:33:46 UTC (rev 2452)
+++ development/source/script/ASTree.cc	2008-03-12 02:49:50 UTC (rev 2453)
@@ -46,6 +46,7 @@
 void cASTExpressionBinary::Accept(cASTVisitor& visitor) { visitor.VisitExpressionBinary(*this); }
 void cASTExpressionUnary::Accept(cASTVisitor& visitor) { visitor.VisitExpressionUnary(*this); }
 
+void cASTBuiltInCall::Accept(cASTVisitor& visitor) { visitor.VisitBuiltInCall(*this); }
 void cASTFunctionCall::Accept(cASTVisitor& visitor) { visitor.VisitFunctionCall(*this); }
 void cASTLiteral::Accept(cASTVisitor& visitor) { visitor.VisitLiteral(*this); }
 void cASTLiteralArray::Accept(cASTVisitor& visitor) { visitor.VisitLiteralArray(*this); }
@@ -67,3 +68,28 @@
   delete m_args;
   delete m_code;
 }
+
+
+cASTBuiltInCall::cASTBuiltInCall(const cASFilePosition& fp, const cString& name)
+  : cASTNode(fp), m_args(NULL), m_type(AS_TYPE_INVALID), m_builtin(AS_BUILTIN_UNKNOWN), m_vr(NULL)
+{
+  if (name == "asbool") m_builtin = AS_BUILTIN_CAST_BOOL;
+  else if (name == "aschar") m_builtin = AS_BUILTIN_CAST_CHAR;
+  else if (name == "asint") m_builtin = AS_BUILTIN_CAST_INT;
+  else if (name == "asfloat") m_builtin = AS_BUILTIN_CAST_FLOAT;
+  else if (name == "asstring") m_builtin = AS_BUILTIN_CAST_STRING;
+  else if (name == "len") m_builtin = AS_BUILTIN_LEN;
+  else if (name == "resize") m_builtin = AS_BUILTIN_RESIZE;
+}
+
+cASTBuiltInCall::~cASTBuiltInCall()
+{
+  delete m_args;
+  delete m_vr;
+}
+
+void cASTBuiltInCall::SetVariableReference(cASTVariableReference* vr)
+{
+  delete m_vr;
+  m_vr = vr;
+}

Modified: development/source/script/ASTree.h
===================================================================
--- development/source/script/ASTree.h	2008-03-11 19:33:46 UTC (rev 2452)
+++ development/source/script/ASTree.h	2008-03-12 02:49:50 UTC (rev 2453)
@@ -111,6 +111,7 @@
 class cASTExpressionBinary;
 class cASTExpressionUnary;
 
+class cASTBuiltInCall;
 class cASTFunctionCall;
 class cASTLiteral;
 class cASTLiteralArray;
@@ -449,6 +450,35 @@
 
 // --------  Expression Value Nodes  --------
 
+class cASTBuiltInCall : public cASTNode
+{
+private:
+  cASTArgumentList* m_args;
+  ASType_t m_type;
+  ASBuiltIn_t m_builtin;
+  cASTVariableReference* m_vr;
+  
+public:
+  cASTBuiltInCall(const cASFilePosition& fp, const cString& name);
+  ~cASTBuiltInCall();
+  
+  ASBuiltIn_t GetBuiltIn() const { return m_builtin; }
+  
+  void SetArguments(cASTArgumentList* args) { delete m_args; m_args = args; }
+  cASTArgumentList* GetArguments() { return m_args; }
+  
+  ASType_t GetType() const { return m_type; }
+  inline void SetType(ASType_t type) { m_type = type; }
+  
+  cASTVariableReference* GetVariableReference() { return m_vr; }
+  void SetVariableReference(cASTVariableReference* vr);
+  
+  bool HasArguments() const { return (m_args); }
+  
+  void Accept(cASTVisitor& visitor);
+};
+
+
 class cASTFunctionCall : public cASTNode
 {
 private:

Modified: development/source/script/AvidaScript.cc
===================================================================
--- development/source/script/AvidaScript.cc	2008-03-11 19:33:46 UTC (rev 2452)
+++ development/source/script/AvidaScript.cc	2008-03-12 02:49:50 UTC (rev 2453)
@@ -25,6 +25,20 @@
 #include "AvidaScript.h"
 
 
+const char* AvidaScript::mapBuiltIn(ASBuiltIn_t builtin)
+{
+  switch (builtin) {
+    case AS_BUILTIN_CAST_BOOL:    return "asbool";
+    case AS_BUILTIN_CAST_CHAR:    return "aschar";
+    case AS_BUILTIN_CAST_INT:     return "asint";
+    case AS_BUILTIN_CAST_FLOAT:   return "asfloat";
+    case AS_BUILTIN_CAST_STRING:  return "asstring";
+    case AS_BUILTIN_LEN:          return "len";
+    case AS_BUILTIN_RESIZE:       return "resize";
+    default:                      return "?";
+  }
+}
+
 const char* AvidaScript::mapToken(ASToken_t token)
 {
   switch (token) {

Modified: development/source/script/AvidaScript.h
===================================================================
--- development/source/script/AvidaScript.h	2008-03-11 19:33:46 UTC (rev 2452)
+++ development/source/script/AvidaScript.h	2008-03-12 02:49:50 UTC (rev 2453)
@@ -87,15 +87,18 @@
   
   AS_TOKEN_CMD_RETURN, // 48
   
-  AS_TOKEN_ID, // 49
+  AS_TOKEN_BUILTIN_CALL, // 49
+  AS_TOKEN_BUILTIN_METHOD,
   
-  AS_TOKEN_FLOAT, // 50
+  AS_TOKEN_ID, // 51
+  
+  AS_TOKEN_FLOAT, // 52
   AS_TOKEN_INT,
   AS_TOKEN_STRING,
   AS_TOKEN_CHAR,
   AS_TOKEN_BOOL,
   
-  AS_TOKEN_UNKNOWN, // 54
+  AS_TOKEN_UNKNOWN, // 56
   AS_TOKEN_INVALID
 } ASToken_t;
 
@@ -121,6 +124,7 @@
   
   AS_SEMANTIC_ERR_ARGUMENT_DEFAULT_REQUIRED,
   AS_SEMANTIC_ERR_ARGUMENT_MISSING_REQUIRED,
+  AS_SEMANTIC_ERR_BUILTIN_CALL_SIGNATURE_MISMATCH,
   AS_SEMANTIC_ERR_CANNOT_CAST,
   AS_SEMANTIC_ERR_CANNOT_COMPARE,
   AS_SEMANTIC_ERR_FUNCTION_CALL_SIGNATURE_MISMATCH,
@@ -157,9 +161,21 @@
   AS_DIRECT_INTERPRET_ERR_UNKNOWN
 } ASDirectInterpretError_t;
 
+typedef enum eASBuiltInFunction {
+  AS_BUILTIN_CAST_BOOL,
+  AS_BUILTIN_CAST_CHAR,
+  AS_BUILTIN_CAST_INT,
+  AS_BUILTIN_CAST_FLOAT,
+  AS_BUILTIN_CAST_STRING,
+  AS_BUILTIN_LEN,
+  AS_BUILTIN_RESIZE,
+  
+  AS_BUILTIN_UNKNOWN
+} ASBuiltIn_t;
+
 enum eASExitCodes {
   AS_EXIT_OK = 0,
-  AS_EXIT_FILE_NOT_FOUND = 100,
+  AS_EXIT_FILE_NOT_FOUND = 200,
   AS_EXIT_FAIL_PARSE,
   AS_EXIT_FAIL_SEMANTIC,
   AS_EXIT_FAIL_INTERPRET,
@@ -186,7 +202,8 @@
 
 
 namespace AvidaScript {
-  const char* mapToken(ASToken_t type);
+  const char* mapBuiltIn(ASBuiltIn_t builtin);  
+  const char* mapToken(ASToken_t token);
   const char* mapType(ASType_t type);
 };
 

Modified: development/source/script/cASTVisitor.h
===================================================================
--- development/source/script/cASTVisitor.h	2008-03-11 19:33:46 UTC (rev 2452)
+++ development/source/script/cASTVisitor.h	2008-03-12 02:49:50 UTC (rev 2453)
@@ -53,6 +53,7 @@
   virtual void VisitExpressionBinary(cASTExpressionBinary&) = 0;
   virtual void VisitExpressionUnary(cASTExpressionUnary&) = 0;
 
+  virtual void VisitBuiltInCall(cASTBuiltInCall&) = 0;
   virtual void VisitFunctionCall(cASTFunctionCall&) = 0;
   virtual void VisitLiteral(cASTLiteral&) = 0;
   virtual void VisitLiteralArray(cASTLiteralArray&) = 0;

Modified: development/source/script/cDirectInterpretASTVisitor.cc
===================================================================
--- development/source/script/cDirectInterpretASTVisitor.cc	2008-03-11 19:33:46 UTC (rev 2452)
+++ development/source/script/cDirectInterpretASTVisitor.cc	2008-03-12 02:49:50 UTC (rev 2453)
@@ -729,6 +729,82 @@
 }
 
 
+void cDirectInterpretASTVisitor::VisitBuiltInCall(cASTBuiltInCall& node)
+{
+  cASTArgumentList* args = node.GetArguments();
+  
+  switch (node.GetBuiltIn()) {
+    case AS_BUILTIN_CAST_BOOL:
+      args->Iterator().Next()->Accept(*this);
+      m_rvalue.as_bool = asBool(m_rtype, m_rvalue, node);
+      m_rtype = TYPE(BOOL);
+      break;
+
+    case AS_BUILTIN_CAST_CHAR:
+      args->Iterator().Next()->Accept(*this);
+      m_rvalue.as_char = asChar(m_rtype, m_rvalue, node);
+      m_rtype = TYPE(CHAR);
+      break;
+      
+    case AS_BUILTIN_CAST_INT:
+      args->Iterator().Next()->Accept(*this);
+      m_rvalue.as_int = asInt(m_rtype, m_rvalue, node);
+      m_rtype = TYPE(INT);
+      break;
+      
+    case AS_BUILTIN_CAST_FLOAT:
+      args->Iterator().Next()->Accept(*this);
+      m_rvalue.as_float = asFloat(m_rtype, m_rvalue, node);
+      m_rtype = TYPE(FLOAT);
+      break;
+      
+    case AS_BUILTIN_CAST_STRING:
+      args->Iterator().Next()->Accept(*this);
+      m_rvalue.as_string = asString(m_rtype, m_rvalue, node);
+      m_rtype = TYPE(STRING);
+      break;
+      
+    case AS_BUILTIN_LEN:
+      args->Iterator().Next()->Accept(*this);
+      if (m_rtype == TYPE(STRING)) {
+        int sz = m_rvalue.as_string->GetSize();
+        delete m_rvalue.as_string;
+        m_rvalue.as_int = sz;
+      } else {
+        cLocalArray* arr = asArray(m_rtype, m_rvalue, node);
+        m_rvalue.as_int = arr->GetSize();
+        arr->RemoveReference();
+      }
+      m_rtype = TYPE(INT);
+      break;
+      
+    case AS_BUILTIN_RESIZE:
+      cASTVariableReference* vr = node.GetVariableReference();
+      if (vr->GetType() == TYPE(ARRAY)) {
+        int var_idx = (vr->IsVarGlobal() ? 0 : m_sp) + vr->GetVarID();
+        
+        args->Iterator().Next()->Accept(*this);
+        int sz = asInt(m_rtype, m_rvalue, node);
+        
+        cLocalArray* arr = m_call_stack[var_idx].as_array;
+        if (arr->IsShared()) {
+          arr = new cLocalArray(arr);
+          m_call_stack[var_idx].as_array->RemoveReference();
+          m_call_stack[var_idx].as_array = arr;         
+        }
+        m_call_stack[var_idx].as_array->Resize(sz);
+      } else {
+        // @TODO - resize matrix
+      }
+      break;
+      
+    default:
+      INTERPRET_ERROR(INTERNAL);
+      break;
+  }
+}
+
+
 void cDirectInterpretASTVisitor::VisitFunctionCall(cASTFunctionCall& node)
 {
   // Save previous scope information

Modified: development/source/script/cDirectInterpretASTVisitor.h
===================================================================
--- development/source/script/cDirectInterpretASTVisitor.h	2008-03-11 19:33:46 UTC (rev 2452)
+++ development/source/script/cDirectInterpretASTVisitor.h	2008-03-12 02:49:50 UTC (rev 2453)
@@ -94,6 +94,7 @@
   void VisitExpressionBinary(cASTExpressionBinary&);
   void VisitExpressionUnary(cASTExpressionUnary&);
   
+  void VisitBuiltInCall(cASTBuiltInCall&);
   void VisitFunctionCall(cASTFunctionCall&);
   void VisitLiteral(cASTLiteral&);
   void VisitLiteralArray(cASTLiteralArray&);

Modified: development/source/script/cDumpASTVisitor.cc
===================================================================
--- development/source/script/cDumpASTVisitor.cc	2008-03-11 19:33:46 UTC (rev 2452)
+++ development/source/script/cDumpASTVisitor.cc	2008-03-12 02:49:50 UTC (rev 2453)
@@ -310,6 +310,33 @@
 }
 
 
+void cDumpASTVisitor::VisitBuiltInCall(cASTBuiltInCall& node)
+{
+  indent();
+  cout << "builtin:" << endl;
+  m_depth++;
+  
+  indent();
+  cout << "method:" << endl;
+  
+  m_depth++;
+  indent();
+  cout << mapBuiltIn(node.GetBuiltIn()) << endl;
+  m_depth--;
+  
+  if (node.HasArguments()) {
+    indent();
+    cout << "with:" << endl;
+    
+    m_depth++;
+    node.GetArguments()->Accept(*this);
+    m_depth--;
+  }
+  
+  m_depth--;
+}
+
+
 void cDumpASTVisitor::VisitFunctionCall(cASTFunctionCall& node)
 {
   indent();

Modified: development/source/script/cDumpASTVisitor.h
===================================================================
--- development/source/script/cDumpASTVisitor.h	2008-03-11 19:33:46 UTC (rev 2452)
+++ development/source/script/cDumpASTVisitor.h	2008-03-12 02:49:50 UTC (rev 2453)
@@ -54,6 +54,7 @@
   void VisitExpressionBinary(cASTExpressionBinary&);
   void VisitExpressionUnary(cASTExpressionUnary&);
   
+  void VisitBuiltInCall(cASTBuiltInCall&);
   void VisitFunctionCall(cASTFunctionCall&);
   void VisitLiteral(cASTLiteral&);
   void VisitLiteralArray(cASTLiteralArray&);

Modified: development/source/script/cLexer.l
===================================================================
--- development/source/script/cLexer.l	2008-03-11 19:33:46 UTC (rev 2452)
+++ development/source/script/cLexer.l	2008-03-12 02:49:50 UTC (rev 2453)
@@ -101,11 +101,21 @@
 foreach     return AS_TOKEN_CMD_FOREACH;
 function    return AS_TOKEN_CMD_FUNCTION;
 
+asbool      return AS_TOKEN_BUILTIN_CALL;
+aschar      return AS_TOKEN_BUILTIN_CALL;
+asint       return AS_TOKEN_BUILTIN_CALL;
+asfloat     return AS_TOKEN_BUILTIN_CALL;
+asstring    return AS_TOKEN_BUILTIN_CALL;
+len         return AS_TOKEN_BUILTIN_CALL;
+resize      return AS_TOKEN_BUILTIN_METHOD;
+
 return      return AS_TOKEN_CMD_RETURN;
 
 true        return AS_TOKEN_BOOL;
 false       return AS_TOKEN_BOOL;
 
+
+
 ([a-zA-Z]|_+[a-zA-Z])[a-zA-Z0-9_]*  return AS_TOKEN_ID;      // Identifiers
   
 [0-9]*\.[0-9]+([eE][-+]?[0-9]+)?    return AS_TOKEN_FLOAT;   // Literal Values

Modified: development/source/script/cParser.cc
===================================================================
--- development/source/script/cParser.cc	2008-03-11 19:33:46 UTC (rev 2452)
+++ development/source/script/cParser.cc	2008-03-12 02:49:50 UTC (rev 2453)
@@ -599,7 +599,7 @@
       expr.Set(new cASTLiteral(FILEPOS, AS_TYPE_BOOL, currentText()));
       break;
     case TOKEN(STRING):
-      expr.Set(new cASTLiteral(FILEPOS, AS_TYPE_STRING, currentText()));
+      expr.Set(new cASTLiteral(FILEPOS, AS_TYPE_STRING, currentText().Substring(1, currentText().GetSize() - 2)));
       break;
     case TOKEN(ID):
       if (peekToken() == TOKEN(PREC_OPEN)) {
@@ -612,6 +612,17 @@
         expr = new cASTVariableReference(FILEPOS, currentText());
       }
       break;
+    case TOKEN(BUILTIN_CALL):
+      if (peekToken() == TOKEN(PREC_OPEN)) {
+        cASTBuiltInCall* bi = new cASTBuiltInCall(FILEPOS, currentText());
+        expr.Set(bi);
+        nextToken(); // consume builtin methon name token
+        if (nextToken() != TOKEN(PREC_CLOSE)) bi->SetArguments(parseArgumentList());        
+        if (currentToken() != TOKEN(PREC_CLOSE)) PARSE_UNEXPECT();
+      } else {
+        PARSE_UNEXPECT();
+      }
+      break;
     case TOKEN(PREC_OPEN):
       nextToken(); // consume '('
       expr.Set(parseExpression());
@@ -900,6 +911,27 @@
       case TOKEN(ID):
         node.Set(parseIDStatement());
         break;
+      case TOKEN(BUILTIN_METHOD):
+        if (peekToken() == TOKEN(PREC_OPEN)) {
+          cASTBuiltInCall* bi = new cASTBuiltInCall(FILEPOS, currentText());
+          nextToken(); // consume builtin method name token
+          if (nextToken() != TOKEN(PREC_CLOSE) && currentToken() == TOKEN(ID)) {
+            bi->SetVariableReference(new cASTVariableReference(FILEPOS, currentText()));
+            if (nextToken() == TOKEN(COMMA)) {
+              nextToken(); // consume ','
+              bi->SetArguments(parseArgumentList());
+            }
+          }
+          if (currentToken() != TOKEN(PREC_CLOSE)) PARSE_UNEXPECT();
+          nextToken(); // consume ')'
+          
+          if (currentToken() == TOKEN(DOT) || currentToken() == TOKEN(IDX_OPEN)) {
+            node.Set(parseCallExpression(bi, true));
+          } else {
+            node.Set(bi);
+          }
+        }
+        break;
       case TOKEN(REF):
         node.Set(parseRefStatement());
         break;

Modified: development/source/script/cSemanticASTVisitor.cc
===================================================================
--- development/source/script/cSemanticASTVisitor.cc	2008-03-11 19:33:46 UTC (rev 2452)
+++ development/source/script/cSemanticASTVisitor.cc	2008-03-12 02:49:50 UTC (rev 2453)
@@ -509,7 +509,114 @@
   }
 }
 
+void cSemanticASTVisitor::VisitBuiltInCall(cASTBuiltInCall& node)
+{
+#define ERR_BUILTIN_MISMATCH SEMANTIC_ERROR(BUILTIN_CALL_SIGNATURE_MISMATCH, mapBuiltIn(node.GetBuiltIn()))
+  cASTArgumentList* args = node.GetArguments();
+  
+  switch (node.GetBuiltIn()) {
+    case AS_BUILTIN_CAST_BOOL:
+      if (!args || args->GetSize() != 1) ERR_BUILTIN_MISMATCH;
+      else {
+        cASTNode* argn = args->Iterator().Next();
+        argn->Accept(*this);
+        checkCast(argn->GetType(), TYPE(BOOL));
+        node.SetType(TYPE(BOOL));
+      }
+      break;
 
+    case AS_BUILTIN_CAST_CHAR:
+      if (!args || args->GetSize() != 1) ERR_BUILTIN_MISMATCH;
+      else {
+        cASTNode* argn = args->Iterator().Next();
+        argn->Accept(*this);
+        checkCast(argn->GetType(), TYPE(CHAR));
+        node.SetType(TYPE(CHAR));
+      }
+      break;
+      
+    case AS_BUILTIN_CAST_INT:
+      if (!args || args->GetSize() != 1) ERR_BUILTIN_MISMATCH;
+      else {
+        cASTNode* argn = args->Iterator().Next();
+        argn->Accept(*this);
+        checkCast(argn->GetType(), TYPE(INT));
+        node.SetType(TYPE(INT));
+      }
+      break;
+      
+    case AS_BUILTIN_CAST_FLOAT:
+      if (!args || args->GetSize() != 1) ERR_BUILTIN_MISMATCH;
+      else {
+        cASTNode* argn = args->Iterator().Next();
+        argn->Accept(*this);
+        checkCast(argn->GetType(), TYPE(FLOAT));
+        node.SetType(TYPE(FLOAT));
+      }
+      break;
+      
+    case AS_BUILTIN_CAST_STRING:
+      if (!args || args->GetSize() != 1) ERR_BUILTIN_MISMATCH;
+      else {
+        cASTNode* argn = args->Iterator().Next();
+        argn->Accept(*this);
+        checkCast(argn->GetType(), TYPE(STRING));
+        node.SetType(TYPE(STRING));
+      }
+      break;
+      
+    case AS_BUILTIN_LEN:
+      if (!args || args->GetSize() != 1) ERR_BUILTIN_MISMATCH;
+      else {
+        cASTNode* argn = args->Iterator().Next();
+        argn->Accept(*this);
+        checkCast(argn->GetType(), TYPE(ARRAY));
+        node.SetType(TYPE(INT));
+      }
+      break;
+      
+    case AS_BUILTIN_RESIZE:
+      if (!node.GetVariableReference() || !args) ERR_BUILTIN_MISMATCH;
+      else {
+        node.GetVariableReference()->Accept(*this);
+        
+        if (node.GetVariableReference()->GetType() == TYPE(ARRAY)) {
+          if (args->GetSize() == 1) {
+            cASTNode* argn = args->Iterator().Next();
+            argn->Accept(*this);
+            checkCast(argn->GetType(), TYPE(INT));
+          } else {
+            ERR_BUILTIN_MISMATCH;
+          }
+        } else if (node.GetVariableReference()->GetType() == TYPE(MATRIX)) {
+          if (args->GetSize() == 2) {
+            tListIterator<cASTNode> it = args->Iterator();
+            cASTNode* argn = it.Next();
+            argn->Accept(*this);
+            checkCast(argn->GetType(), TYPE(INT));
+            argn = it.Next();
+            argn->Accept(*this);
+            checkCast(argn->GetType(), TYPE(INT));
+          } else {
+            ERR_BUILTIN_MISMATCH;
+          }          
+        } else {
+          ERR_BUILTIN_MISMATCH;
+        }
+
+        node.SetType(TYPE(VOID));
+      }
+      break;
+      
+    default:
+      SEMANTIC_ERROR(INTERNAL);
+      break;
+  }
+
+#undef ERR_BUILTIN_MISMATCH
+}
+
+
 void cSemanticASTVisitor::VisitFunctionCall(cASTFunctionCall& node)
 {
   if (m_fun_def_arg) {
@@ -839,6 +946,9 @@
     case AS_SEMANTIC_ERR_ARGUMENT_MISSING_REQUIRED:
       std::cerr << "required argument " << VA_ARG_STR << " not found" << ERR_ENDL;
       break;
+    case AS_SEMANTIC_ERR_BUILTIN_CALL_SIGNATURE_MISMATCH:
+      std::cerr << "invalid invocation of builtin method '" << VA_ARG_STR << "()'" << ERR_ENDL;
+      break;
     case AS_SEMANTIC_ERR_CANNOT_CAST:
       {
         const char* type1 = VA_ARG_STR;

Modified: development/source/script/cSemanticASTVisitor.h
===================================================================
--- development/source/script/cSemanticASTVisitor.h	2008-03-11 19:33:46 UTC (rev 2452)
+++ development/source/script/cSemanticASTVisitor.h	2008-03-12 02:49:50 UTC (rev 2453)
@@ -96,6 +96,7 @@
   void VisitExpressionBinary(cASTExpressionBinary&);
   void VisitExpressionUnary(cASTExpressionUnary&);
   
+  void VisitBuiltInCall(cASTBuiltInCall&);
   void VisitFunctionCall(cASTFunctionCall&);
   void VisitLiteral(cASTLiteral&);
   void VisitLiteralArray(cASTLiteralArray&);




More information about the Avida-cvs mailing list