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

brysonda at myxo.css.msu.edu brysonda at myxo.css.msu.edu
Fri Aug 24 12:50:46 PDT 2007


Author: brysonda
Date: 2007-08-24 15:50:46 -0400 (Fri, 24 Aug 2007)
New Revision: 2005

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/cLexer.l
   development/source/script/cParser.cc
Log:
AS: Argument lists and literal arrays/matrices.

Modified: development/source/script/ASTree.cc
===================================================================
--- development/source/script/ASTree.cc	2007-08-24 19:37:40 UTC (rev 2004)
+++ development/source/script/ASTree.cc	2007-08-24 19:50:46 UTC (rev 2005)
@@ -42,6 +42,7 @@
 void cASTExpressionBinary::Accept(cASTVisitor& visitor) { visitor.visitExpressionBinary(*this); }
 void cASTExpressionUnary::Accept(cASTVisitor& visitor) { visitor.visitExpressionUnary(*this); }
 
+void cASTArgumentList::Accept(cASTVisitor& visitor) { visitor.visitArgumentList(*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); }

Modified: development/source/script/ASTree.h
===================================================================
--- development/source/script/ASTree.h	2007-08-24 19:37:40 UTC (rev 2004)
+++ development/source/script/ASTree.h	2007-08-24 19:50:46 UTC (rev 2005)
@@ -82,6 +82,7 @@
 class cASTExpressionBinary;
 class cASTExpressionUnary;
 
+class cASTArgumentList;
 class cASTFunctionCall;
 class cASTLiteral;
 class cASTLiteralArray;
@@ -328,6 +329,22 @@
 
 // --------  Expression Value Nodes  --------
 
+class cASTArgumentList : public cASTNode
+{
+private:
+  tList<cASTNode> m_nodes;
+  
+public:
+  cASTArgumentList() { ; }
+  ~cASTArgumentList() { ; }
+  
+  inline void AddNode(cASTNode* n) { m_nodes.PushRear(n); }
+  inline tListIterator<cASTNode> Iterator() { return tListIterator<cASTNode>(m_nodes); }
+  
+  void Accept(cASTVisitor& visitor);
+};
+
+
 class cASTFunctionCall : public cASTNode
 {
 private:
@@ -367,16 +384,15 @@
 class cASTLiteralArray : public cASTNode
 {
 private:
-  ASType_t m_type;
   cASTNode* m_value;
+  bool m_is_matrix;
   
 public:
-  cASTLiteralArray(ASType_t t, cASTNode* v) : m_type(t), m_value(v) { ; }
-  ~cASTLiteralArray() { delete m_value; }
+  cASTLiteralArray(cASTNode* v, bool is_mat) : m_value(v), m_is_matrix(is_mat) { ; }
+  ~cASTLiteralArray() { delete m_value; }  
   
-  
-  inline ASType_t GetType() { return m_type; }
   inline cASTNode* GetValue() { return m_value; }
+  inline bool IsMatrix() const { return m_is_matrix; }
   
   void Accept(cASTVisitor& visitor);
 };

Modified: development/source/script/cASTDumpVisitor.cc
===================================================================
--- development/source/script/cASTDumpVisitor.cc	2007-08-24 19:37:40 UTC (rev 2004)
+++ development/source/script/cASTDumpVisitor.cc	2007-08-24 19:50:46 UTC (rev 2005)
@@ -297,6 +297,16 @@
 }
 
 
+void cASTDumpVisitor::visitArgumentList(cASTArgumentList& node)
+{
+  m_depth++;
+  
+  tListIterator<cASTNode> it = node.Iterator();
+  cASTNode* val = NULL;
+  while ((val = it.Next())) val->Accept(*this);
+  
+  m_depth--;
+}
 
 void cASTDumpVisitor::visitFunctionCall(cASTFunctionCall& node)
 {
@@ -333,7 +343,16 @@
 
 void cASTDumpVisitor::visitLiteralArray(cASTLiteralArray& node)
 {
-
+  indent();
+  if (node.IsMatrix()) cout << "$";
+  cout << "{" << endl;
+  m_depth++;
+  
+  node.GetValue()->Accept(*this);
+  
+  m_depth--;
+  indent();
+  cout << "}" << endl;
 }
 
 

Modified: development/source/script/cASTDumpVisitor.h
===================================================================
--- development/source/script/cASTDumpVisitor.h	2007-08-24 19:37:40 UTC (rev 2004)
+++ development/source/script/cASTDumpVisitor.h	2007-08-24 19:50:46 UTC (rev 2005)
@@ -53,6 +53,7 @@
   void visitExpressionBinary(cASTExpressionBinary&);
   void visitExpressionUnary(cASTExpressionUnary&);
   
+  void visitArgumentList(cASTArgumentList&);
   void visitFunctionCall(cASTFunctionCall&);
   void visitLiteral(cASTLiteral&);
   void visitLiteralArray(cASTLiteralArray&);

Modified: development/source/script/cASTVisitor.h
===================================================================
--- development/source/script/cASTVisitor.h	2007-08-24 19:37:40 UTC (rev 2004)
+++ development/source/script/cASTVisitor.h	2007-08-24 19:50:46 UTC (rev 2005)
@@ -52,6 +52,7 @@
   virtual void visitExpressionBinary(cASTExpressionBinary&) = 0;
   virtual void visitExpressionUnary(cASTExpressionUnary&) = 0;
 
+  virtual void visitArgumentList(cASTArgumentList&) = 0;
   virtual void visitFunctionCall(cASTFunctionCall&) = 0;
   virtual void visitLiteral(cASTLiteral&) = 0;
   virtual void visitLiteralArray(cASTLiteralArray&) = 0;

Modified: development/source/script/cLexer.l
===================================================================
--- development/source/script/cLexer.l	2007-08-24 19:37:40 UTC (rev 2004)
+++ development/source/script/cLexer.l	2007-08-24 19:50:46 UTC (rev 2005)
@@ -83,7 +83,7 @@
 \^          return AS_TOKEN_ARR_EXPAN;
 \.\.        return AS_TOKEN_ARR_WILD;
 
-\?          return AS_TOKEN_MAT_MODIFY;    // Matrix Modifier
+\$          return AS_TOKEN_MAT_MODIFY;    // Matrix Modifier
 
 array       return AS_TOKEN_TYPE_ARRAY;    // Built-in Types
 char        return AS_TOKEN_TYPE_CHAR;

Modified: development/source/script/cParser.cc
===================================================================
--- development/source/script/cParser.cc	2007-08-24 19:37:40 UTC (rev 2004)
+++ development/source/script/cParser.cc	2007-08-24 19:50:46 UTC (rev 2005)
@@ -214,7 +214,7 @@
   
   m_tree = parseStatementList();
 
-  if (!m_eof) PARSE_ERROR(UNEXPECTED_TOKEN);
+  if (!m_eof && m_success) PARSE_ERROR(UNEXPECTED_TOKEN);
   if (!m_tree) PARSE_ERROR(EMPTY);
 
   delete m_lexer;
@@ -293,11 +293,12 @@
 cASTNode* cParser::parseArgumentList()
 {
   PARSE_TRACE("parseArgumentList");
-  cASTNode* al = NULL;
-  // @todo - argument list
-  parseExpression();
+  cASTArgumentList* al = new cASTArgumentList();
+
+  al->AddNode(parseExpression());
   while (currentToken() == TOKEN(COMMA)) {
-    parseExpression();
+    nextToken(); // consume ','
+    al->AddNode(parseExpression());
   }
   
   return al;
@@ -544,6 +545,8 @@
   PARSE_TRACE("parseExprP6");
   tAutoRelease<cASTNode> expr;
   
+  bool is_matrix = false;
+  
   switch (currentToken()) {
     case TOKEN(FLOAT):
       expr.Set(new cASTLiteral(AS_TYPE_FLOAT, currentText()));
@@ -577,10 +580,11 @@
       break;
     case TOKEN(MAT_MODIFY):
       if (nextToken() != TOKEN(ARR_OPEN)) PARSE_UNEXPECT();
+      is_matrix = true;
     case TOKEN(ARR_OPEN):
-      if (nextToken() != TOKEN(ARR_CLOSE)) parseArgumentList();
+      if (nextToken() != TOKEN(ARR_CLOSE)) expr.Set(parseArgumentList());
       if (currentToken() != TOKEN(ARR_CLOSE)) PARSE_UNEXPECT();
-      // @todo - return literal array
+      expr.Set(new cASTLiteralArray(expr.Release(), is_matrix));
       break;
       
     case TOKEN(OP_BIT_NOT):
@@ -597,7 +601,7 @@
       return expr.Release();
       
     default:
-      break;
+      return NULL;
   }
 
   nextToken();
@@ -829,49 +833,40 @@
 }
 
 
-#define CHECK_LINETERM() { if (!checkLineTerm(sl)) return sl; }
 cASTNode* cParser::parseStatementList()
 {
   PARSE_TRACE("parseStatementList");
-  cASTStatementList* sl = new cASTStatementList();
+  tAutoRelease<cASTStatementList> sl(new cASTStatementList());
   
-  cASTNode* node = NULL;
+  tAutoRelease<cASTNode> node;
 
   while (nextToken()) {
     switch (currentToken()) {
       case TOKEN(ARR_OPEN):
-        node = parseLooseBlock();
-        CHECK_LINETERM();
+        node.Set(parseLooseBlock());
         break;
       case TOKEN(CMD_IF):
-        node = parseIfStatement();
-        CHECK_LINETERM();
+        node.Set(parseIfStatement());
         break;
       case TOKEN(CMD_FOREACH):
-        node = parseForeachStatement();
-        CHECK_LINETERM();
+        node.Set(parseForeachStatement());
         break;
       case TOKEN(CMD_FUNCTION):
-        node = parseFunctionDefine();
-        CHECK_LINETERM();
+        node.Set(parseFunctionDefine());
         break;
       case TOKEN(CMD_RETURN):
-        node = parseReturnStatement();
-        CHECK_LINETERM();
+        node.Set(parseReturnStatement());
         break;
       case TOKEN(CMD_WHILE):
-        node = parseWhileStatement();
-        CHECK_LINETERM();
+        node.Set(parseWhileStatement());
         break;
       case TOKEN(ENDL):
         continue;
       case TOKEN(ID):
-        node = parseIDStatement();
-        CHECK_LINETERM();
+        node.Set(parseIDStatement());
         break;
       case TOKEN(REF):
-        node = parseRefStatement();
-        CHECK_LINETERM();
+        node.Set(parseRefStatement());
         break;
       case TOKEN(SUPPRESS):
         continue;
@@ -881,26 +876,30 @@
       case TOKEN(TYPE_INT):
       case TOKEN(TYPE_MATRIX):
       case TOKEN(TYPE_STRING):
-        node = parseVarDeclare();
-        CHECK_LINETERM();
+        node.Set(parseVarDeclare());
         break;
         
       default:
-        return sl;
+        return sl.Release();
     }
     
-    if (node == NULL) {
+    if (node.IsNull()) {
       // Some error has occured, so terminate early
       if (m_success) PARSE_ERROR(INTERNAL); // Should not receive a null response without an error flag
-      break;
     }
-    sl->AddNode(node);
+    
+    if (currentToken() == TOKEN(SUPPRESS)) {
+      // @todo - mark output as suppressed
+    } else if (currentToken() != TOKEN(ENDL)) {
+      PARSE_ERROR(UNTERMINATED_EXPR);
+    }
+
+    (*sl).AddNode(node.Release());
   }
   
   if (!currentToken()) m_eof = true;
-  return sl;
+  return sl.Release();
 }
-#undef CHECK_LINETERM()
 
 
 cASTNode* cParser::parseVarDeclare()
@@ -980,21 +979,6 @@
 }
 
 
-bool cParser::checkLineTerm(cASTNode* node)
-{
-  PARSE_TRACE("checkLineTerm");
-  if (currentToken() == TOKEN(SUPPRESS)) {
-    // @todo - mark output as suppressed
-    return true;
-  } else if (currentToken() == TOKEN(ENDL)) {
-    return true;
-  }
-  
-  PARSE_ERROR(UNTERMINATED_EXPR);
-  return false;
-}
-
-
 void cParser::reportError(ASParseError_t err, const int line)
 {
 #define ERR_ENDL "  (cParser.cc:" << line << ")" << std::endl




More information about the Avida-cvs mailing list