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

brysonda at myxo.css.msu.edu brysonda at myxo.css.msu.edu
Mon Aug 27 07:35:24 PDT 2007


Author: brysonda
Date: 2007-08-27 10:35:24 -0400 (Mon, 27 Aug 2007)
New Revision: 2012

Modified:
   development/source/script/ASTree.cc
   development/source/script/ASTree.h
   development/source/script/cASTDumpVisitor.cc
   development/source/script/cASTDumpVisitor.h
   development/source/script/cASTVisitor.h
   development/source/script/cParser.cc
   development/source/script/cParser.h
Log:
AS: Variable definition lists.

Modified: development/source/script/ASTree.cc
===================================================================
--- development/source/script/ASTree.cc	2007-08-27 13:41:15 UTC (rev 2011)
+++ development/source/script/ASTree.cc	2007-08-27 14:35:24 UTC (rev 2012)
@@ -38,6 +38,7 @@
 
 void cASTFunctionDefinition::Accept(cASTVisitor& visitor) { visitor.visitFunctionDefinition(*this); }
 void cASTVariableDefinition::Accept(cASTVisitor& visitor) { visitor.visitVariableDefinition(*this); }
+void cASTVariableDefinitionList::Accept(cASTVisitor& visitor) { visitor.visitVariableDefinitionList(*this); }
 
 void cASTExpressionBinary::Accept(cASTVisitor& visitor) { visitor.visitExpressionBinary(*this); }
 void cASTExpressionUnary::Accept(cASTVisitor& visitor) { visitor.visitExpressionUnary(*this); }

Modified: development/source/script/ASTree.h
===================================================================
--- development/source/script/ASTree.h	2007-08-27 13:41:15 UTC (rev 2011)
+++ development/source/script/ASTree.h	2007-08-27 14:35:24 UTC (rev 2012)
@@ -78,6 +78,7 @@
 
 class cASTFunctionDefinition;
 class cASTVariableDefinition;
+class cASTVariableDefinitionList;
 
 class cASTExpressionBinary;
 class cASTExpressionUnary;
@@ -243,16 +244,16 @@
 private:
   ASType_t m_type;
   cString m_name;
-  cASTNode* m_args;
+  cASTVariableDefinitionList* m_args;
   cASTNode* m_code;
   
 public:
-  cASTFunctionDefinition(ASType_t type, const cString& name, cASTNode* args)
+  cASTFunctionDefinition(ASType_t type, const cString& name, cASTVariableDefinitionList* args)
     : m_type(type), m_name(name), m_args(args), m_code(NULL) { ; }
   
   inline ASType_t GetType() { return m_type; }
   inline const cString& GetName() { return m_name; }
-  inline cASTNode* GetArguments() { return m_args; }
+  inline cASTVariableDefinitionList* GetArguments() { return m_args; }
   
   inline void SetCode(cASTNode* code) { m_code = code; }
   inline cASTNode* GetCode() { return m_code; }
@@ -283,8 +284,27 @@
 };
 
 
+class cASTVariableDefinitionList : public cASTNode
+{
+private:
+  tList<cASTVariableDefinition> m_nodes;
+  
+public:
+  cASTVariableDefinitionList() { ; }
+  ~cASTVariableDefinitionList() { ; }
+  
+  inline void AddNode(cASTVariableDefinition* n) { m_nodes.PushRear(n); }
+  inline tListIterator<cASTVariableDefinition> Iterator() { return tListIterator<cASTVariableDefinition>(m_nodes); }
+  
+  inline int GetSize() const { return m_nodes.GetSize(); }
+  
+  void Accept(cASTVisitor& visitor);
+};
 
 
+
+
+
 // --------  Expression Operation Nodes  --------
 
 class cASTExpressionBinary : public cASTNode

Modified: development/source/script/cASTDumpVisitor.cc
===================================================================
--- development/source/script/cASTDumpVisitor.cc	2007-08-27 13:41:15 UTC (rev 2011)
+++ development/source/script/cASTDumpVisitor.cc	2007-08-27 14:35:24 UTC (rev 2012)
@@ -240,13 +240,24 @@
 {
   indent();
   cout << (node.IsDefinition() ? "":"@") << "function: " << mapType(node.GetType()) << " " << node.GetName() << "(";
+  if (node.GetArguments()->GetSize()) { 
+    cout << endl;
+    node.GetArguments()->Accept(*this);
+    indent();
+  }
+  cout << ")" << endl;
   
-  cout << ")" << endl;
+  indent();
+  cout << "{" << endl;
+  
   if (node.IsDefinition()) {
     m_depth++;
     node.GetCode()->Accept(*this);
     m_depth--;
   }
+
+  indent();
+  cout << "}" << endl;
 }
 
 
@@ -268,7 +279,19 @@
 }
 
 
+void cASTDumpVisitor::visitVariableDefinitionList(cASTVariableDefinitionList& node)
+{
+  m_depth++;
+  
+  tListIterator<cASTVariableDefinition> it = node.Iterator();
+  cASTNode* val = NULL;
+  while ((val = it.Next())) val->Accept(*this);
+  
+  m_depth--;
+}
 
+
+
 void cASTDumpVisitor::visitExpressionBinary(cASTExpressionBinary& node)
 {
   m_depth++;

Modified: development/source/script/cASTDumpVisitor.h
===================================================================
--- development/source/script/cASTDumpVisitor.h	2007-08-27 13:41:15 UTC (rev 2011)
+++ development/source/script/cASTDumpVisitor.h	2007-08-27 14:35:24 UTC (rev 2012)
@@ -49,6 +49,7 @@
   
   void visitFunctionDefinition(cASTFunctionDefinition&);
   void visitVariableDefinition(cASTVariableDefinition&);
+  void visitVariableDefinitionList(cASTVariableDefinitionList&);
   
   void visitExpressionBinary(cASTExpressionBinary&);
   void visitExpressionUnary(cASTExpressionUnary&);

Modified: development/source/script/cASTVisitor.h
===================================================================
--- development/source/script/cASTVisitor.h	2007-08-27 13:41:15 UTC (rev 2011)
+++ development/source/script/cASTVisitor.h	2007-08-27 14:35:24 UTC (rev 2012)
@@ -48,6 +48,7 @@
   
   virtual void visitFunctionDefinition(cASTFunctionDefinition&) = 0;
   virtual void visitVariableDefinition(cASTVariableDefinition&) = 0;
+  virtual void visitVariableDefinitionList(cASTVariableDefinitionList&) = 0;
 
   virtual void visitExpressionBinary(cASTExpressionBinary&) = 0;
   virtual void visitExpressionUnary(cASTExpressionUnary&) = 0;

Modified: development/source/script/cParser.cc
===================================================================
--- development/source/script/cParser.cc	2007-08-27 13:41:15 UTC (rev 2011)
+++ development/source/script/cParser.cc	2007-08-27 14:35:24 UTC (rev 2012)
@@ -667,14 +667,15 @@
 cASTNode* cParser::parseFunctionDefine()
 {
   PARSE_TRACE("parseFunctionDefine");
-  cASTFunctionDefinition* fd = parseFunctionHeader(false);
+  cASTFunctionDefinition* fd = parseFunctionHeader();
   
-  fd->SetCode(parseCodeBlock());
+  // If the returned function definition is valid, parse the body
+  if (fd) fd->SetCode(parseCodeBlock());
 
   return fd;
 }
 
-cASTFunctionDefinition* cParser::parseFunctionHeader(bool declare)
+cASTFunctionDefinition* cParser::parseFunctionHeader()
 {
   PARSE_TRACE("parseFunctionHeader");
   
@@ -688,46 +689,26 @@
     case TOKEN(TYPE_STRING): type = AS_TYPE_STRING; break;
     case TOKEN(TYPE_VOID):   type = AS_TYPE_VOID;   break;
     case TOKEN(ID):
-      if (peekToken() != TOKEN(REF)) {
-        nextToken();
-        PARSE_UNEXPECT();
-        return NULL;
-      }
+      if (nextToken() != TOKEN(REF)) PARSE_UNEXPECT();
       type = AS_TYPE_OBJECT_REF;
       break;
       
     default:
       PARSE_UNEXPECT();
-      return NULL;
   }
   
   if (nextToken() != TOKEN(ID)) {
     PARSE_UNEXPECT();
-    return NULL;
   }
   cString name(currentText());
   
-  if (nextToken() != TOKEN(PREC_OPEN)) {
-    PARSE_UNEXPECT();
-    return NULL;
-  }
+  if (nextToken() != TOKEN(PREC_OPEN)) PARSE_UNEXPECT();
   
-  tAutoRelease<cASTNode> args;
-  if (nextToken() != TOKEN(PREC_CLOSE)) {
-    if (declare) {
-      args = parseVarDeclareList();
-    } else {
-      args = parseArgumentList();
-    }
-  }
+  tAutoRelease<cASTVariableDefinitionList> args;
+  if (nextToken() != TOKEN(PREC_CLOSE)) args.Set(parseVariableDefinitionList());
+  if (currentToken() != TOKEN(PREC_CLOSE)) PARSE_UNEXPECT();
+  nextToken(); // consume ')'
   
-  if (currentToken() != TOKEN(PREC_CLOSE)) {
-    PARSE_UNEXPECT();
-    return NULL;    
-  }
-  
-  nextToken();
-  
   return new cASTFunctionDefinition(type, name, args.Release());
 }
 
@@ -747,7 +728,7 @@
       return parseCallExpression(target, true);
       break;
     case TOKEN(REF):
-      return parseVarDeclare();
+      return parseVariableDefinition();
       break;
       
     default:
@@ -871,7 +852,7 @@
       case TOKEN(TYPE_INT):
       case TOKEN(TYPE_MATRIX):
       case TOKEN(TYPE_STRING):
-        node.Set(parseVarDeclare());
+        node.Set(parseVariableDefinition());
         break;
         
       default:
@@ -897,9 +878,9 @@
 }
 
 
-cASTNode* cParser::parseVarDeclare()
+cASTVariableDefinition* cParser::parseVariableDefinition()
 {
-  PARSE_TRACE("parseVarDeclare");
+  PARSE_TRACE("parseVariableDefinition");
   
   ASType_t vtype = AS_TYPE_INVALID;
   switch (currentToken()) {
@@ -942,18 +923,23 @@
   return vd.Release();
 }
 
-cASTNode* cParser::parseVarDeclareList()
+cASTVariableDefinitionList* cParser::parseVariableDefinitionList()
 {
-  PARSE_TRACE("parseVarDeclareList");
-  cASTNode* vl = NULL;
+  PARSE_TRACE("parseVariableDefinitionList");
+  tAutoRelease<cASTVariableDefinitionList> vl(new cASTVariableDefinitionList());
  
-  // @todo - var decleare list
-  parseVarDeclare();
+  cASTVariableDefinition* vd = parseVariableDefinition();
+  if (!vd) return NULL;
+  
+  (*vl).AddNode(vd);
   while (currentToken() == TOKEN(COMMA)) {
-    parseVarDeclare();
+    nextToken(); // consume ','
+    vd = parseVariableDefinition();
+    if (!vd) return NULL;
+    (*vl).AddNode(vd);
   }
   
-  return vl;
+  return vl.Release();
 }
 
 cASTNode* cParser::parseWhileStatement()

Modified: development/source/script/cParser.h
===================================================================
--- development/source/script/cParser.h	2007-08-27 13:41:15 UTC (rev 2011)
+++ development/source/script/cParser.h	2007-08-27 14:35:24 UTC (rev 2012)
@@ -105,7 +105,7 @@
   cASTNode* parseExprP6_Index(cASTNode* l);
   cASTNode* parseForeachStatement();
   cASTNode* parseFunctionDefine();
-  cASTFunctionDefinition* parseFunctionHeader(bool declare = true);
+  cASTFunctionDefinition* parseFunctionHeader();
   cASTNode* parseIDStatement();
   cASTNode* parseIfStatement();
   cASTNode* parseIndexExpression();
@@ -113,8 +113,8 @@
   cASTNode* parseRefStatement();
   cASTNode* parseReturnStatement();
   cASTNode* parseStatementList();
-  cASTNode* parseVarDeclare();
-  cASTNode* parseVarDeclareList();
+  cASTVariableDefinition* parseVariableDefinition();
+  cASTVariableDefinitionList* parseVariableDefinitionList();
   cASTNode* parseWhileStatement();
   
   void reportError(ASParseError_t err, const int line);




More information about the Avida-cvs mailing list