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

brysonda at myxo.css.msu.edu brysonda at myxo.css.msu.edu
Wed Jul 18 14:55:48 PDT 2007


Author: brysonda
Date: 2007-07-18 17:55:48 -0400 (Wed, 18 Jul 2007)
New Revision: 1820

Modified:
   development/source/script/ASTree.h
   development/source/script/cASTDumpVisitor.cc
   development/source/script/cParser.cc
Log:
AS: IfBlock nodes.   Fix loose block handling.

Modified: development/source/script/ASTree.h
===================================================================
--- development/source/script/ASTree.h	2007-07-18 19:11:05 UTC (rev 1819)
+++ development/source/script/ASTree.h	2007-07-18 21:55:48 UTC (rev 1820)
@@ -141,10 +141,21 @@
 class cASTIfBlock : public cASTNode
 {
 private:
+  cASTNode* m_expr;
+  cASTNode* m_code;
+  cASTNode* m_else;
   
 public:
-  cASTIfBlock() { ; }
+  cASTIfBlock(cASTNode* expr, cASTNode* code) : m_expr(expr), m_code(code), m_else(NULL) { ; }
+  ~cASTIfBlock() { delete m_expr; delete m_code; delete m_else; }
   
+  inline cASTNode* GetCondition() { return m_expr; }
+  inline cASTNode* GetCode() { return m_code; }
+  inline void SetElseCode(cASTNode* code) { m_else = code; }
+  inline cASTNode* GetElseCode() { return m_else; }
+  
+  inline bool HasElse() const { return (m_else); }
+  
   void Accept(cASTVisitor& visitor);
 };
 
@@ -157,6 +168,7 @@
   
 public:
   cASTWhileBlock(cASTNode* expr, cASTNode* code) : m_expr(expr), m_code(code) { ; }
+  ~cASTWhileBlock() { delete m_expr; delete m_code; }
   
   inline cASTNode* GetCondition() { return m_expr; }
   inline cASTNode* GetCode() { return m_code; }

Modified: development/source/script/cASTDumpVisitor.cc
===================================================================
--- development/source/script/cASTDumpVisitor.cc	2007-07-18 19:11:05 UTC (rev 1819)
+++ development/source/script/cASTDumpVisitor.cc	2007-07-18 21:55:48 UTC (rev 1820)
@@ -132,7 +132,35 @@
 
 void cASTDumpVisitor::visitIfBlock(cASTIfBlock& node)
 {
+  indent();
+  cout << "if:" << endl;
   
+  m_depth++;
+  indent();
+  cout << "condition:" << endl;
+  
+  m_depth++;
+  node.GetCondition()->Accept(*this);
+  m_depth--;
+  
+  indent();
+  cout << "do:" << endl;
+  
+  m_depth++;
+  node.GetCode()->Accept(*this);
+  m_depth--;
+  
+  if (node.HasElse()) {
+    indent();
+    cout << "else:" << endl;
+    
+    m_depth++;
+    node.GetElseCode()->Accept(*this);
+    m_depth--;
+  }
+  
+  m_depth--;
+  
 }
 
 

Modified: development/source/script/cParser.cc
===================================================================
--- development/source/script/cParser.cc	2007-07-18 19:11:05 UTC (rev 1819)
+++ development/source/script/cParser.cc	2007-07-18 21:55:48 UTC (rev 1820)
@@ -712,6 +712,7 @@
   bool loose = false;
   parseCodeBlock(loose);
   if (!loose && currentToken() != TOKEN(CMD_ENDFOREACH)) PARSE_UNEXPECT();
+  if (!loose) nextToken();
   
   return fs;
 }
@@ -727,8 +728,8 @@
     PARSE_UNEXPECT();
     return fd;
   }
+  if (!loose) nextToken();
 
-  nextToken();
   return fd;
 }
 
@@ -818,32 +819,39 @@
 cASTNode* cParser::parseIfStatement()
 {
   PARSE_TRACE("parseIfStatement");
-  cASTNode* is = NULL;
   
   if (nextToken() != TOKEN(PREC_OPEN)) {
     PARSE_UNEXPECT();
-    return is;
+    return NULL;
   }
   
   nextToken();
-  parseExpression();
+  tAutoRelease<cASTNode> cond(parseExpression());
   
   if (currentToken() != TOKEN(PREC_CLOSE)) {
     PARSE_UNEXPECT();
-    return is;
+    return NULL;
   }
+  nextToken();
   
   bool loose = false;
-  parseCodeBlock(loose);
+  cASTIfBlock* is = new cASTIfBlock(cond.Release(), parseCodeBlock(loose));
+
   if (currentToken() == TOKEN(CMD_ELSE)) {
-    parseCodeBlock(loose);
+    nextToken(); // consume 'else'
+    loose = false;
+    tAutoRelease<cASTNode> code(parseCodeBlock(loose));
     if (!loose && currentToken() != TOKEN(CMD_ENDIF)) {
       PARSE_UNEXPECT();
       return is;
     }
+    if (!loose) nextToken();
+    is->SetElseCode(code.Release());
   } else if (!loose && currentToken() != TOKEN(CMD_ENDIF)) {
     PARSE_UNEXPECT();
     return is;
+  } else if (!loose) {
+    nextToken(); // consume 'endif'
   }
   
   return is;
@@ -871,6 +879,7 @@
   if (currentToken() != TOKEN(ARR_CLOSE)) {
     PARSE_UNEXPECT();
   }
+  nextToken();
   return sl;
 }
 
@@ -1070,7 +1079,7 @@
     PARSE_UNEXPECT();
     return NULL;
   }
-  nextToken();
+  if (!loose) nextToken();
   
   return new cASTWhileBlock(cond.Release(), code.Release());
 }




More information about the Avida-cvs mailing list