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

brysonda at myxo.css.msu.edu brysonda at myxo.css.msu.edu
Mon Mar 10 13:19:34 PDT 2008


Author: brysonda
Date: 2008-03-10 16:19:33 -0400 (Mon, 10 Mar 2008)
New Revision: 2447

Modified:
   development/source/script/cDirectInterpretASTVisitor.cc
   development/source/script/cDirectInterpretASTVisitor.h
   development/source/script/cParser.cc
   development/source/script/cSemanticASTVisitor.cc
Log:
AS:
Fix unary expression parsing.
Add scope initialization pass.

Modified: development/source/script/cDirectInterpretASTVisitor.cc
===================================================================
--- development/source/script/cDirectInterpretASTVisitor.cc	2008-03-10 17:39:47 UTC (rev 2446)
+++ development/source/script/cDirectInterpretASTVisitor.cc	2008-03-10 20:19:33 UTC (rev 2447)
@@ -50,10 +50,40 @@
   , m_has_returned(false), m_obj_assign(false)
 {
   m_call_stack.Resize(m_global_symtbl->GetNumVariables());
-  for (int i = 0; i < m_global_symtbl->GetNumVariables(); i++) m_call_stack[i].as_string = NULL;
+  for (int i = 0; i < m_global_symtbl->GetNumVariables(); i++) {
+    switch (m_global_symtbl->GetVariableType(i)) {
+      case TYPE(ARRAY):       m_call_stack[i].as_array = new cLocalArray; break;
+      case TYPE(BOOL):        m_call_stack[i].as_bool = false; break;
+      case TYPE(CHAR):        m_call_stack[i].as_char = 0; break;
+      case TYPE(INT):         m_call_stack[i].as_int = 0; break;
+      case TYPE(FLOAT):       m_call_stack[i].as_float = 0.0; break;
+      case TYPE(MATRIX):      m_call_stack[i].as_matrix = NULL; break;
+      case TYPE(OBJECT_REF):  m_call_stack[i].as_ref = NULL; break;
+      case TYPE(STRING):      m_call_stack[i].as_string = NULL; break;
+      default: break;
+    }
+  }
 }
 
+cDirectInterpretASTVisitor::~cDirectInterpretASTVisitor()
+{
+  for (int i = 0; i < m_global_symtbl->GetNumVariables(); i++) {
+    switch (m_global_symtbl->GetVariableType(i)) {
+      case TYPE(ARRAY):       m_call_stack[i].as_array->RemoveReference(); break;
+      case TYPE(BOOL):        break;
+      case TYPE(CHAR):        break;
+      case TYPE(INT):         break;
+      case TYPE(FLOAT):       break;
+      case TYPE(MATRIX):      break; // @TODO - cleanup scope
+      case TYPE(OBJECT_REF):  delete m_call_stack[i].as_ref; break;
+      case TYPE(STRING):      delete m_call_stack[i].as_string; break;
+      default: break;
+    }
+  }
+  
+}
 
+
 int cDirectInterpretASTVisitor::Interpret(cASTNode* node)
 {
   node->Accept(*this);
@@ -712,10 +742,21 @@
   cSymbolTable* func_symtbl = func_src_symtbl->GetFunctionSymbolTable(fun_id);
   int sp = m_sp + prev_symtbl->GetNumVariables();
   m_call_stack.Resize(m_call_stack.GetSize() + func_symtbl->GetNumVariables());
-  for (int i = 0; i < func_symtbl->GetNumVariables(); i++) m_call_stack[sp + i].as_string = NULL;
+  for (int i = 0; i < func_symtbl->GetNumVariables(); i++) {
+    switch (func_symtbl->GetVariableType(i)) {
+      case TYPE(ARRAY):       m_call_stack[sp + i].as_array = new cLocalArray; break;
+      case TYPE(BOOL):        m_call_stack[sp + i].as_bool = false; break;
+      case TYPE(CHAR):        m_call_stack[sp + i].as_char = 0; break;
+      case TYPE(INT):         m_call_stack[sp + i].as_int = 0; break;
+      case TYPE(FLOAT):       m_call_stack[sp + i].as_float = 0.0; break;
+      case TYPE(MATRIX):      m_call_stack[sp + i].as_matrix = NULL; break;
+      case TYPE(OBJECT_REF):  m_call_stack[sp + i].as_ref = NULL; break;
+      case TYPE(STRING):      m_call_stack[sp + i].as_string = NULL; break;
+      default: break;
+    }
+  }
   
   // Process the arguments to the function
-  tSmartArray<int> str_var_idxs;
   tListIterator<cASTVariableDefinition> sit = func_src_symtbl->GetFunctionSignature(fun_id)->Iterator();
   tListIterator<cASTNode> cit = node.GetArguments()->Iterator();
   cASTVariableDefinition* arg_def = NULL;
@@ -737,7 +778,6 @@
       case TYPE(STRING):
         {
           m_call_stack[sp + var_id].as_string = asString(m_rtype, m_rvalue, node);
-          str_var_idxs.Push(var_id);
         }
         break;
         
@@ -769,8 +809,20 @@
   }
   m_rtype = node.GetType();
 
-  // Clean up string variables in the current scope
-  for (int i = 0; i < str_var_idxs.GetSize(); i++) delete m_call_stack[m_sp + str_var_idxs[i]].as_string;
+  // Clean up variables in the current scope
+  for (int i = 0; i < func_symtbl->GetNumVariables(); i++) {
+    switch (func_symtbl->GetVariableType(i)) {
+      case TYPE(ARRAY):       m_call_stack[sp + i].as_array->RemoveReference(); break;
+      case TYPE(BOOL):        break;
+      case TYPE(CHAR):        break;
+      case TYPE(INT):         break;
+      case TYPE(FLOAT):       break;
+      case TYPE(MATRIX):      break; // @TODO - cleanup scope
+      case TYPE(OBJECT_REF):  delete m_call_stack[sp + i].as_ref; break;
+      case TYPE(STRING):      delete m_call_stack[sp + i].as_string; break;
+      default: break;
+    }
+  }
   
   // Restore previous scope
   m_has_returned = false;

Modified: development/source/script/cDirectInterpretASTVisitor.h
===================================================================
--- development/source/script/cDirectInterpretASTVisitor.h	2008-03-10 17:39:47 UTC (rev 2446)
+++ development/source/script/cDirectInterpretASTVisitor.h	2008-03-10 20:19:33 UTC (rev 2447)
@@ -72,6 +72,7 @@
   
 public:
   cDirectInterpretASTVisitor(cSymbolTable* global_symtbl);
+  ~cDirectInterpretASTVisitor();
   
   int Interpret(cASTNode* node);
   

Modified: development/source/script/cParser.cc
===================================================================
--- development/source/script/cParser.cc	2008-03-10 17:39:47 UTC (rev 2446)
+++ development/source/script/cParser.cc	2008-03-10 20:19:33 UTC (rev 2447)
@@ -192,8 +192,8 @@
 #endif
 
 #if DEBUG_AS_PARSER
-# define PARSE_DEBUG(x) /*{ std::cerr << x << std::endl; }*/
-# define PARSE_TRACE(x) /*{ std::cerr << "trace: " << x << std::endl; }*/
+# define PARSE_DEBUG(x) { std::cerr << x << std::endl; }
+# define PARSE_TRACE(x) { std::cerr << "trace: " << x << std::endl; }
 #else
 # define PARSE_DEBUG(x)
 # define PARSE_TRACE(x)
@@ -635,13 +635,12 @@
     case TOKEN(OP_SUB):
       ASToken_t op = currentToken();
       nextToken(); // consume operation
-      cASTNode* r = parseExpression();
+      cASTNode* r = parseExprP6();
       if (!r) {
         PARSE_ERROR(NULL_EXPR);
         return NULL;
       }
       expr.Set(new cASTExpressionUnary(FILEPOS, op, r));
-      nextToken();
       return expr.Release();
       
     default:

Modified: development/source/script/cSemanticASTVisitor.cc
===================================================================
--- development/source/script/cSemanticASTVisitor.cc	2008-03-10 17:39:47 UTC (rev 2446)
+++ development/source/script/cSemanticASTVisitor.cc	2008-03-10 20:19:33 UTC (rev 2447)
@@ -487,6 +487,7 @@
         case TYPE(CHAR):
         case TYPE(FLOAT):
         case TYPE(INT):
+        case TYPE(RUNTIME):
           // Char, Float and Int Okay
           
           node.SetType(node.GetExpression()->GetType());




More information about the Avida-cvs mailing list