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

brysonda at myxo.css.msu.edu brysonda at myxo.css.msu.edu
Tue Jul 17 10:56:48 PDT 2007


Author: brysonda
Date: 2007-07-17 13:56:48 -0400 (Tue, 17 Jul 2007)
New Revision: 1814

Modified:
   development/source/script/ASTree.h
   development/source/script/cASTDumpVisitor.cc
   development/source/script/cParser.cc
   development/source/script/cParser.h
Log:
AS: Function-Definition and -Declaration nodes.

Modified: development/source/script/ASTree.h
===================================================================
--- development/source/script/ASTree.h	2007-07-17 16:30:18 UTC (rev 1813)
+++ development/source/script/ASTree.h	2007-07-17 17:56:48 UTC (rev 1814)
@@ -167,10 +167,24 @@
 class cASTFunctionDefinition : public cASTNode
 {
 private:
+  ASType_t m_type;
+  cString m_name;
+  cASTNode* m_args;
+  cASTNode* m_code;
   
 public:
-  cASTFunctionDefinition() { ; }
+  cASTFunctionDefinition(ASType_t type, const cString& name, cASTNode* 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 void SetCode(cASTNode* code) { m_code = code; }
+  inline cASTNode* GetCode() { return m_code; }
+  
+  inline bool IsDefinition() { return (m_code); }
+  
   void Accept(cASTVisitor& visitor);
 };
 
@@ -292,7 +306,7 @@
   cString m_name;
   
 public:
-  cASTVariableReference(const char* name) : m_name(name) { ; }
+  cASTVariableReference(const cString& name) : m_name(name) { ; }
   
   inline const cString& GetName() { return m_name; }
   

Modified: development/source/script/cASTDumpVisitor.cc
===================================================================
--- development/source/script/cASTDumpVisitor.cc	2007-07-17 16:30:18 UTC (rev 1813)
+++ development/source/script/cASTDumpVisitor.cc	2007-07-17 17:56:48 UTC (rev 1814)
@@ -144,7 +144,15 @@
 
 void cASTDumpVisitor::visitFunctionDefinition(cASTFunctionDefinition& node)
 {
+  indent();
+  cout << (node.IsDefinition() ? "":"@") << "function: " << mapType(node.GetType()) << " " << node.GetName() << "(";
   
+  cout << ")" << endl;
+  if (node.IsDefinition()) {
+    m_depth++;
+    node.GetCode()->Accept(*this);
+    m_depth--;
+  }
 }
 
 

Modified: development/source/script/cParser.cc
===================================================================
--- development/source/script/cParser.cc	2007-07-17 16:30:18 UTC (rev 1813)
+++ development/source/script/cParser.cc	2007-07-17 17:56:48 UTC (rev 1814)
@@ -219,7 +219,7 @@
   m_tree = parseStatementList();
 
   if (!m_eof) PARSE_UNEXPECT();
-  //if (!m_tree) PARSE_ERROR(EMPTY); @todo - statement list doesn't actually return anything yet
+  if (!m_tree) PARSE_ERROR(EMPTY);
 
   delete m_lexer;
   m_lexer = NULL;
@@ -377,7 +377,6 @@
   PARSE_TRACE("parseCodeBlock");
   cASTNode* cb = NULL;
 
-  nextToken();
   if (currentToken() == TOKEN(ARR_OPEN)) {
     loose = true;
     cb = parseLooseBlock();
@@ -717,69 +716,74 @@
 cASTNode* cParser::parseFunctionDefine()
 {
   PARSE_TRACE("parseFunctionDefine");
-  cASTNode* fd = parseFunctionHeader(false);
+  cASTFunctionDefinition* fd = parseFunctionHeader(false);
   
   bool loose = false;
-  parseCodeBlock(loose);
+  fd->SetCode(parseCodeBlock(loose));
   if (!loose && currentToken() != TOKEN(CMD_ENDFUNCTION)) {
     PARSE_UNEXPECT();
     return fd;
   }
-  
+
+  nextToken();
   return fd;
 }
 
-cASTNode* cParser::parseFunctionHeader(bool declare)
+cASTFunctionDefinition* cParser::parseFunctionHeader(bool declare)
 {
   PARSE_TRACE("parseFunctionHeader");
-  cASTNode* fd = NULL;
   
+  ASType_t type = AS_TYPE_INVALID;
   switch (nextToken()) {
-    case TOKEN(TYPE_ARRAY):
-    case TOKEN(TYPE_CHAR):
-    case TOKEN(TYPE_FLOAT):
-    case TOKEN(TYPE_INT):
-    case TOKEN(TYPE_MATRIX):
-    case TOKEN(TYPE_STRING):
-    case TOKEN(TYPE_VOID):
-      break;
+    case TOKEN(TYPE_ARRAY):  type = AS_TYPE_ARRAY;  break;
+    case TOKEN(TYPE_CHAR):   type = AS_TYPE_CHAR;   break;
+    case TOKEN(TYPE_FLOAT):  type = AS_TYPE_FLOAT;  break;
+    case TOKEN(TYPE_INT):    type = AS_TYPE_INT;    break;
+    case TOKEN(TYPE_MATRIX): type = AS_TYPE_MATRIX; break;
+    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 fd;
+        return NULL;
       }
+      type = AS_TYPE_OBJECT_REF;
       break;
       
     default:
       PARSE_UNEXPECT();
-      return fd;
+      return NULL;
   }
   
   if (nextToken() != TOKEN(ID)) {
     PARSE_UNEXPECT();
-    return fd;
+    return NULL;
   }
+  cString name(currentText());
   
   if (nextToken() != TOKEN(PREC_OPEN)) {
     PARSE_UNEXPECT();
-    return fd;
+    return NULL;
   }
   
+  cASTNode* args = NULL;
   if (nextToken() != TOKEN(PREC_CLOSE)) {
     if (declare) {
-      parseVarDeclareList();
+      args = parseVarDeclareList();
     } else {
-      parseArgumentList();
+      args = parseArgumentList();
     }
   }
   
   if (currentToken() != TOKEN(PREC_CLOSE)) {
     PARSE_UNEXPECT();
-    return fd;    
+    return NULL;    
   }
   
-  return fd;
+  nextToken();
+  
+  return new cASTFunctionDefinition(type, name, args);
 }
 
 cASTNode* cParser::parseIDStatement()
@@ -874,10 +878,10 @@
 
   switch (nextToken()) {
     case TOKEN(ARR_OPEN):
-      parseArrayUnpack();
+      rs = parseArrayUnpack();
       break;
     case TOKEN(CMD_FUNCTION):
-      parseFunctionHeader();
+      rs = parseFunctionHeader();
       break;
     default:
       PARSE_UNEXPECT();
@@ -1085,6 +1089,8 @@
 
 void cParser::reportError(ASParseError_t err, const int line)
 {
+#define ERR_ENDL "  (cParser.cc:" << line << ")" << std::endl
+  
   m_success = false;
 
   std::cerr << m_filename << ":";
@@ -1097,21 +1103,21 @@
 
   switch (err) {
     case AS_PARSE_ERR_UNEXPECTED_TOKEN:
-      std::cerr << "unexpected token '" << currentText() << "'." << std::endl;
+      std::cerr << "unexpected token '" << currentText() << "'" << ERR_ENDL;
       break;
     case AS_PARSE_ERR_UNTERMINATED_EXPR:
-      std::cerr << "unterminated expression." << std::endl;
+      std::cerr << "unterminated expression" << ERR_ENDL;
       break;
     case AS_PARSE_ERR_NULL_EXPR:
-      std::cerr << "expected expression, found '" << currentText() << "'." << std::endl;
+      std::cerr << "expected expression, found '" << currentText() << "'" << ERR_ENDL;
     case AS_PARSE_ERR_EOF:
       if (!m_err_eof) {
-        std::cerr << "unexpected end of file" << std::endl;
+        std::cerr << "unexpected end of file" << ERR_ENDL;
         m_err_eof = true;
       }
       break;
     case AS_PARSE_ERR_EMPTY:
-      std::cerr << "empty script, no valid statements found" << std::endl;
+      std::cerr << "empty script, no valid statements found" << ERR_ENDL;
       break;
     case AS_PARSE_ERR_INTERNAL:
       std::cerr << "internal parser error at cParser.cc:" << line << std::endl;
@@ -1119,6 +1125,8 @@
     default:
       std::cerr << "parse error" << std::endl;
   }
+
+#undef ERR_ENDL
 }
 
 #undef PARSE_DEBUG()

Modified: development/source/script/cParser.h
===================================================================
--- development/source/script/cParser.h	2007-07-17 16:30:18 UTC (rev 1813)
+++ development/source/script/cParser.h	2007-07-17 17:56:48 UTC (rev 1814)
@@ -105,7 +105,7 @@
   cASTNode* parseExprP6_Index(cASTNode* l);
   cASTNode* parseForeachStatement();
   cASTNode* parseFunctionDefine();
-  cASTNode* parseFunctionHeader(bool declare = true);
+  cASTFunctionDefinition* parseFunctionHeader(bool declare = true);
   cASTNode* parseIDStatement();
   cASTNode* parseIfStatement();
   cASTNode* parseIndexExpression();




More information about the Avida-cvs mailing list