[Avida-SVN] r1984 - in development: Avida.xcodeproj source/script source/tools

brysonda at myxo.css.msu.edu brysonda at myxo.css.msu.edu
Wed Aug 22 12:23:37 PDT 2007


Author: brysonda
Date: 2007-08-22 15:23:37 -0400 (Wed, 22 Aug 2007)
New Revision: 1984

Modified:
   development/Avida.xcodeproj/project.pbxproj
   development/source/script/ASTree.h
   development/source/script/AvidaScript.h
   development/source/script/cASTDumpVisitor.cc
   development/source/script/cLexer.l
   development/source/script/cParser.cc
   development/source/script/cParser.h
   development/source/tools/tAutoRelease.h
   development/source/tools/tList.h
Log:
AS: Remove END... block forms.  Add elseif.

Modified: development/Avida.xcodeproj/project.pbxproj
===================================================================
--- development/Avida.xcodeproj/project.pbxproj	2007-08-22 15:27:42 UTC (rev 1983)
+++ development/Avida.xcodeproj/project.pbxproj	2007-08-22 19:23:37 UTC (rev 1984)
@@ -210,23 +210,6 @@
 		};
 /* End PBXBuildRule section */
 
-/* Begin PBXBuildStyle section */
-		B5029AA90C6B83D600D10480 /* Development */ = {
-			isa = PBXBuildStyle;
-			buildSettings = {
-				COPY_PHASE_STRIP = NO;
-			};
-			name = Development;
-		};
-		B5029AAA0C6B83D600D10480 /* Deployment */ = {
-			isa = PBXBuildStyle;
-			buildSettings = {
-				COPY_PHASE_STRIP = YES;
-			};
-			name = Deployment;
-		};
-/* End PBXBuildStyle section */
-
 /* Begin PBXContainerItemProxy section */
 		56F555DA0C3B36FC00E2E929 /* PBXContainerItemProxy */ = {
 			isa = PBXContainerItemProxy;
@@ -1782,12 +1765,6 @@
 		DCC30C4D0762532C008F7A48 /* Project object */ = {
 			isa = PBXProject;
 			buildConfigurationList = 702442D70859E0B00059BD9B /* Build configuration list for PBXProject "Avida" */;
-			buildSettings = {
-			};
-			buildStyles = (
-				B5029AA90C6B83D600D10480 /* Development */,
-				B5029AAA0C6B83D600D10480 /* Deployment */,
-			);
 			hasScannedForEncodings = 0;
 			mainGroup = DCC30C490762532C008F7A48;
 			productRefGroup = DCC3164E07626CF3008F7A48 /* Products */;

Modified: development/source/script/ASTree.h
===================================================================
--- development/source/script/ASTree.h	2007-08-22 15:27:42 UTC (rev 1983)
+++ development/source/script/ASTree.h	2007-08-22 19:23:37 UTC (rev 1984)
@@ -168,20 +168,48 @@
 
 class cASTIfBlock : public cASTNode
 {
+public:
+  class cElseIf
+  {
+    friend class cASTIfBlock;
+  private:
+    cASTNode* m_expr;
+    cASTNode* m_code;
+    
+    cElseIf(cASTNode* expr, cASTNode* code) : m_expr(expr), m_code(code) { ; }
+    
+  public:
+      cASTNode* GetCondition() { return m_expr; }
+    cASTNode* GetCode() { return m_code; }
+  };
+  
 private:
   cASTNode* m_expr;
   cASTNode* m_code;
   cASTNode* m_else;
   
+  tList<cElseIf> m_elifs;
+  
 public:
   cASTIfBlock(cASTNode* expr, cASTNode* code) : m_expr(expr), m_code(code), m_else(NULL) { ; }
-  ~cASTIfBlock() { delete m_expr; delete m_code; delete m_else; }
+  ~cASTIfBlock()
+  {
+    delete m_expr;
+    delete m_code;
+    delete m_else;
+    cElseIf* elif = NULL;
+    while ((elif = m_elifs.Pop())) delete elif;
+  }
+
   
   inline cASTNode* GetCondition() { return m_expr; }
   inline cASTNode* GetCode() { return m_code; }
+  inline void AddElseIf(cASTNode* expr, cASTNode* code) { m_elifs.PushRear(new cElseIf(expr, code)); }
+  inline tListIterator<cElseIf> ElseIfIterator() { return tListIterator<cElseIf>(m_elifs); }
   inline void SetElseCode(cASTNode* code) { m_else = code; }
   inline cASTNode* GetElseCode() { return m_else; }
   
+  inline bool HasElseIfs() const { return (m_elifs.GetSize()); }
   inline bool HasElse() const { return (m_else); }
   
   void Accept(cASTVisitor& visitor);

Modified: development/source/script/AvidaScript.h
===================================================================
--- development/source/script/AvidaScript.h	2007-08-22 15:27:42 UTC (rev 1983)
+++ development/source/script/AvidaScript.h	2007-08-22 19:23:37 UTC (rev 1984)
@@ -79,27 +79,21 @@
   
   AS_TOKEN_CMD_IF, // 41
   AS_TOKEN_CMD_ELSE,
-  AS_TOKEN_CMD_ENDIF,
+  AS_TOKEN_CMD_ELSEIF,
+  AS_TOKEN_CMD_WHILE,
+  AS_TOKEN_CMD_FOREACH,
+  AS_TOKEN_CMD_FUNCTION,
   
-  AS_TOKEN_CMD_WHILE, // 44
-  AS_TOKEN_CMD_ENDWHILE,
+  AS_TOKEN_CMD_RETURN, // 47
   
-  AS_TOKEN_CMD_FOREACH, // 46
-  AS_TOKEN_CMD_ENDFOREACH,
+  AS_TOKEN_ID, // 48
   
-  AS_TOKEN_CMD_FUNCTION, // 48
-  AS_TOKEN_CMD_ENDFUNCTION,
-  
-  AS_TOKEN_CMD_RETURN, // 50
-  
-  AS_TOKEN_ID, // 51
-  
-  AS_TOKEN_FLOAT, // 52
+  AS_TOKEN_FLOAT, // 49
   AS_TOKEN_INT,
   AS_TOKEN_STRING,
   AS_TOKEN_CHAR,
   
-  AS_TOKEN_UNKNOWN, // 56
+  AS_TOKEN_UNKNOWN, // 53
   AS_TOKEN_INVALID
 } ASToken_t;
 

Modified: development/source/script/cASTDumpVisitor.cc
===================================================================
--- development/source/script/cASTDumpVisitor.cc	2007-08-22 15:27:42 UTC (rev 1983)
+++ development/source/script/cASTDumpVisitor.cc	2007-08-22 19:23:37 UTC (rev 1984)
@@ -114,7 +114,7 @@
 
 void cASTDumpVisitor::visitStatementList(cASTStatementList& node)
 {
-  tListIterator<cASTNode> it(node.Iterator());
+  tListIterator<cASTNode> it = node.Iterator();
   
   cASTNode* stmt = NULL;
   while ((stmt = it.Next())) {
@@ -169,6 +169,32 @@
   node.GetCode()->Accept(*this);
   m_depth--;
   
+  if (node.HasElseIfs()) {
+    tListIterator<cASTIfBlock::cElseIf> it = node.ElseIfIterator();
+    cASTIfBlock::cElseIf* elif = NULL;
+    while ((elif = it.Next())) {
+      indent();
+      cout << "elseif:" << endl;
+
+      m_depth++;
+      indent();
+      cout << "condition:" << endl;
+      
+      m_depth++;
+      elif->GetCondition()->Accept(*this);
+      m_depth--;
+      
+      indent();
+      cout << "do:" << endl;
+      
+      m_depth++;
+      elif->GetCode()->Accept(*this);
+      m_depth--;
+      
+      m_depth--;
+    }
+  }
+  
   if (node.HasElse()) {
     indent();
     cout << "else:" << endl;

Modified: development/source/script/cLexer.l
===================================================================
--- development/source/script/cLexer.l	2007-08-22 15:27:42 UTC (rev 1983)
+++ development/source/script/cLexer.l	2007-08-22 19:23:37 UTC (rev 1984)
@@ -93,19 +93,13 @@
 string      return AS_TOKEN_TYPE_STRING;
 void        return AS_TOKEN_TYPE_VOID;
 
-if          return AS_TOKEN_CMD_IF;        // If Blocks
+if          return AS_TOKEN_CMD_IF;        // Blocks
 else        return AS_TOKEN_CMD_ELSE;
-endif       return AS_TOKEN_CMD_ENDIF;
+elseif      return AS_TOKEN_CMD_ELSEIF;
+while       return AS_TOKEN_CMD_WHILE;
+foreach     return AS_TOKEN_CMD_FOREACH;
+function    return AS_TOKEN_CMD_FUNCTION;
 
-while       return AS_TOKEN_CMD_WHILE;     // While Blocks
-endwhile    return AS_TOKEN_CMD_ENDWHILE;
-
-foreach     return AS_TOKEN_CMD_FOREACH;   // Foreach Blocks
-endforeach  return AS_TOKEN_CMD_ENDFOREACH;
-
-function    return AS_TOKEN_CMD_FUNCTION;  // Function Blocks
-endfunction return AS_TOKEN_CMD_ENDFUNCTION;
-
 return      return AS_TOKEN_CMD_RETURN;
 
 ([a-zA-Z]|_+[a-zA-Z])[a-zA-Z0-9_]*  return AS_TOKEN_ID;      // Identifiers

Modified: development/source/script/cParser.cc
===================================================================
--- development/source/script/cParser.cc	2007-08-22 15:27:42 UTC (rev 1983)
+++ development/source/script/cParser.cc	2007-08-22 19:23:37 UTC (rev 1984)
@@ -159,16 +159,12 @@
 
  loose_block: ARR_OPEN statement_list ARR_CLOSE
  
- if_block: CMD_IF PREC_OPEN expr PREC_CLOSE lineterm statement_list CMD_ENDIF
-         | CMD_IF PREC_OPEN expr PREC_CLOSE lineterm statement_list CMD_ELSE lineterm statement_list CMD_ENDIF
-         | CMD_IF PREC_OPEN expr PREC_CLOSE loose_block CMD_ENDIF
-         | CMD_IF PREC_OPEN expr PREC_CLOSE loose_block CMD_ELSE loose_block CMD_ENDIF
+ if_block: CMD_IF PREC_OPEN expr PREC_CLOSE loose_block
+         | CMD_IF PREC_OPEN expr PREC_CLOSE loose_block CMD_ELSE loose_block
  
- while_block: CMD_WHILE PREC_OPEN expr PREC_CLOSE lineterm statement_list CMD_ENDWHILE
-            | CMD_WHILE PREC_OPEN expr PREC_CLOSE loose_block
+ while_block: CMD_WHILE PREC_OPEN expr PREC_CLOSE loose_block
  
- foreach_block: CMD_FOREACH type_def ID PREC_OPEN expr PREC_CLOSE lineterm statement_list CMD_ENDFOREACH
-              | CMD_FOREACH type_def ID PREC_OPEN expr PREC_CLOSE loose_block
+ foreach_block: CMD_FOREACH type_def ID PREC_OPEN expr PREC_CLOSE loose_block
 
  var_declare: type_def ID
             | type_def ID ASSIGN expr
@@ -183,8 +179,7 @@
                    | 
  
  declare_function: REF CMD_FUNCTION type_any ID PREC_OPEN var_declare_list PREC_CLOSE
- define_function: CMD_FUNCTION type_any ID PREC_OPEN var_declare_list PREC_CLOSE lineterm statement_list CMD_ENDFUNCTION
-                | CMD_FUNCTION type_any ID PREC_OPEN var_declare_list PREC_CLOSE loose_block
+ define_function: CMD_FUNCTION type_any ID PREC_OPEN var_declare_list PREC_CLOSE loose_block
  
  return_stmt: CMD_RETURN expr
 
@@ -375,19 +370,18 @@
   return ce;
 }
 
-cASTNode* cParser::parseCodeBlock(bool& loose)
+cASTNode* cParser::parseCodeBlock()
 {
   PARSE_TRACE("parseCodeBlock");
   cASTNode* cb = NULL;
 
+  // Swallow all newlines and suppress tokens
+  while (currentToken() == TOKEN(ENDL) || currentToken() == TOKEN(SUPPRESS)) nextToken();
+  
   if (currentToken() == TOKEN(ARR_OPEN)) {
-    loose = true;
     cb = parseLooseBlock();
-  } else if (currentToken() == TOKEN(SUPPRESS) || currentToken() == TOKEN(ENDL)) {
-    cb = parseStatementList();
   } else {
     PARSE_UNEXPECT();
-    return cb;
   }
   
   return cb;  
@@ -719,12 +713,9 @@
   }
   nextToken(); // consume ')'
   
-  bool loose = false;
-  tAutoRelease<cASTNode> code(parseCodeBlock(loose));
-  if (!loose && currentToken() != TOKEN(CMD_ENDFOREACH)) PARSE_UNEXPECT();
-  if (!loose) nextToken(); // consume 'endforeach'
+  cASTNode* code = parseCodeBlock();
   
-  return new cASTForeachBlock(var.Release(), expr.Release(), code.Release());
+  return new cASTForeachBlock(var.Release(), expr.Release(), code);
 }
 
 cASTNode* cParser::parseFunctionDefine()
@@ -732,13 +723,7 @@
   PARSE_TRACE("parseFunctionDefine");
   cASTFunctionDefinition* fd = parseFunctionHeader(false);
   
-  bool loose = false;
-  fd->SetCode(parseCodeBlock(loose));
-  if (!loose && currentToken() != TOKEN(CMD_ENDFUNCTION)) {
-    PARSE_UNEXPECT();
-    return fd;
-  }
-  if (!loose) nextToken();
+  fd->SetCode(parseCodeBlock());
 
   return fd;
 }
@@ -844,27 +829,36 @@
   }
   nextToken();
   
-  bool loose = false;
-  cASTIfBlock* is = new cASTIfBlock(cond.Release(), parseCodeBlock(loose));
+  tAutoRelease<cASTIfBlock> is(new cASTIfBlock(cond.Release(), parseCodeBlock()));
 
-  if (currentToken() == TOKEN(CMD_ELSE)) {
-    nextToken(); // consume 'else'
-    loose = false;
-    tAutoRelease<cASTNode> code(parseCodeBlock(loose));
-    if (!loose && currentToken() != TOKEN(CMD_ENDIF)) {
+  while (currentToken() == TOKEN(CMD_ELSEIF)) {
+    
+    if (nextToken() != TOKEN(PREC_OPEN)) {
       PARSE_UNEXPECT();
-      return is;
+      return NULL;
     }
-    if (!loose) nextToken();
-    is->SetElseCode(code.Release());
-  } else if (!loose && currentToken() != TOKEN(CMD_ENDIF)) {
-    PARSE_UNEXPECT();
-    return is;
-  } else if (!loose) {
-    nextToken(); // consume 'endif'
+    
+    nextToken(); // consume '('
+    tAutoRelease<cASTNode> elifcond(parseExpression());
+    
+    if (currentToken() != TOKEN(PREC_CLOSE)) {
+      PARSE_UNEXPECT();
+      return NULL;
+    }
+    nextToken(); // consume ')'
+    
+    cASTNode* elifcode = parseCodeBlock();
+    
+    (*is).AddElseIf(elifcond.Release(), elifcode);
   }
   
-  return is;
+  if (currentToken() == TOKEN(CMD_ELSE)) {
+    nextToken(); // consume 'else'
+    cASTNode* code = parseCodeBlock();
+    (*is).SetElseCode(code);
+  }
+  
+  return is.Release();
 }
 
 cASTNode* cParser::parseIndexExpression()
@@ -1083,15 +1077,9 @@
   }
   nextToken();
   
-  bool loose = false;
-  tAutoRelease<cASTNode> code(parseCodeBlock(loose));
-  if (!loose && currentToken() != TOKEN(CMD_ENDWHILE)) {
-    PARSE_UNEXPECT();
-    return NULL;
-  }
-  if (!loose) nextToken();
+  cASTNode* code = parseCodeBlock();
   
-  return new cASTWhileBlock(cond.Release(), code.Release());
+  return new cASTWhileBlock(cond.Release(), code);
 }
 
 

Modified: development/source/script/cParser.h
===================================================================
--- development/source/script/cParser.h	2007-08-22 15:27:42 UTC (rev 1983)
+++ development/source/script/cParser.h	2007-08-22 19:23:37 UTC (rev 1984)
@@ -83,7 +83,7 @@
   
   
 private:
-  inline ASToken_t currentToken() { return m_cur_tok; }
+  inline ASToken_t currentToken() const { return m_cur_tok; }
   ASToken_t nextToken();
   ASToken_t peekToken();
   
@@ -93,7 +93,7 @@
   cASTNode* parseArrayUnpack();
   cASTNode* parseAssignment();
   cASTNode* parseCallExpression();
-  cASTNode* parseCodeBlock(bool& loose);
+  cASTNode* parseCodeBlock();
   cASTNode* parseExpression();
   cASTNode* parseExprP0();
   cASTNode* parseExprP1();

Modified: development/source/tools/tAutoRelease.h
===================================================================
--- development/source/tools/tAutoRelease.h	2007-08-22 15:27:42 UTC (rev 1983)
+++ development/source/tools/tAutoRelease.h	2007-08-22 19:23:37 UTC (rev 1984)
@@ -43,6 +43,9 @@
   inline void Set(T* value) { delete m_value; m_value = value; }
   inline tAutoRelease<T>& operator=(T* value) { delete m_value; m_value = value; return *this; }
   
+  //! Access the contents
+  inline T& operator*() { return *m_value; }
+  
   //! Take control of the contents
   inline T* Release() { T* value = m_value; m_value = NULL; return value; }
 };

Modified: development/source/tools/tList.h
===================================================================
--- development/source/tools/tList.h	2007-08-22 15:27:42 UTC (rev 1983)
+++ development/source/tools/tList.h	2007-08-22 19:23:37 UTC (rev 1984)
@@ -92,9 +92,9 @@
   const tList<T> & GetConstList() { return list; }
   const tListNode<T> * GetConstNode() { return node; }
 public:
-    explicit tListIterator(tList<T> & _list);
-  explicit tListIterator(tList<T> & _list, tListNode<T> * start_node);
-  explicit tListIterator(tListIterator<T>& _tli);
+  explicit tListIterator(tList<T>& _list);
+  explicit tListIterator(tList<T>& _list, tListNode<T>* start_node);
+  tListIterator(const tListIterator<T>& _tli);
   ~tListIterator();
   
   void Set(tListNode<T> * in_node) { node = in_node; }
@@ -562,7 +562,7 @@
   list.AddIterator(this);
 }
 
-template <class T> tListIterator<T>::tListIterator(tListIterator<T>& _tli)
+template <class T> tListIterator<T>::tListIterator(const tListIterator<T>& _tli)
 : tBaseIterator<T>(), list(_tli.list), node(_tli.node)
 {
 	list.AddIterator(this);




More information about the Avida-cvs mailing list