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

brysonda at myxo.css.msu.edu brysonda at myxo.css.msu.edu
Sun Jul 1 12:35:36 PDT 2007


Author: brysonda
Date: 2007-07-01 15:35:35 -0400 (Sun, 01 Jul 2007)
New Revision: 1741

Modified:
   development/Avida.xcodeproj/project.pbxproj
   development/source/script/AvidaScript.h
   development/source/script/cLexer.l
   development/source/script/cParser.cc
   development/source/script/cParser.h
Log:
Initial pass at parseStatementList.  Stub in called methods.

Modified: development/Avida.xcodeproj/project.pbxproj
===================================================================
--- development/Avida.xcodeproj/project.pbxproj	2007-07-01 17:04:13 UTC (rev 1740)
+++ development/Avida.xcodeproj/project.pbxproj	2007-07-01 19:35:35 UTC (rev 1741)
@@ -744,7 +744,7 @@
 		70DCAC77097AF730002F8733 /* key_chart */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = text; path = key_chart; sourceTree = "<group>"; };
 		70DCAC78097AF730002F8733 /* viewer.cc */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; path = viewer.cc; sourceTree = "<group>"; };
 		70DCAC9B097AF7C0002F8733 /* primitive.cc */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; path = primitive.cc; sourceTree = "<group>"; };
-		70DCAD1C097AF7CC002F8733 /* avida-s */ = {isa = PBXFileReference; includeInIndex = 0; lastKnownFileType = "compiled.mach-o.executable"; path = "avida-s"; sourceTree = BUILT_PRODUCTS_DIR; };
+		70DCAD1C097AF7CC002F8733 /* avida-s */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.executable"; includeInIndex = 0; path = "avida-s"; sourceTree = BUILT_PRODUCTS_DIR; };
 		70DCAD1F097AF81A002F8733 /* AvidaScript.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = AvidaScript.h; sourceTree = "<group>"; };
 		70DCAD20097AF81A002F8733 /* cLexer.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = cLexer.h; sourceTree = "<group>"; };
 		70DCAD21097AF81A002F8733 /* cLexer.l */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.lex; path = cLexer.l; sourceTree = "<group>"; };

Modified: development/source/script/AvidaScript.h
===================================================================
--- development/source/script/AvidaScript.h	2007-07-01 17:04:13 UTC (rev 1740)
+++ development/source/script/AvidaScript.h	2007-07-01 19:35:35 UTC (rev 1741)
@@ -26,7 +26,7 @@
 #define AvidaScript_h
 
 enum eASTokens {
-  SUPRESS = 1,
+  SUPPRESS = 1,
   ENDL,
   COMMA,
   
@@ -102,4 +102,11 @@
   ERR
 };
 
+typedef enum eASParseErrors {
+  UNEXPECTED_TOKEN,
+  UNTERMINATED_EXPR,
+  INTERNAL,
+  UNKNOWN
+} ASParseError_t;
+
 #endif

Modified: development/source/script/cLexer.l
===================================================================
--- development/source/script/cLexer.l	2007-07-01 17:04:13 UTC (rev 1740)
+++ development/source/script/cLexer.l	2007-07-01 19:35:35 UTC (rev 1741)
@@ -41,7 +41,7 @@
 [ \t]+      /* ignore whitespace */
 
 
-;           return SUPRESS;       // End-of-line
+;           return SUPPRESS;       // End-of-line
 \n          return ENDL;
 ,           return COMMA;
 

Modified: development/source/script/cParser.cc
===================================================================
--- development/source/script/cParser.cc	2007-07-01 17:04:13 UTC (rev 1740)
+++ development/source/script/cParser.cc	2007-07-01 19:35:35 UTC (rev 1741)
@@ -49,7 +49,7 @@
           | return_stmt lineterm
           | lineterm
   
- lineterm: SUPRESS | ENDL
+ lineterm: SUPPRESS | ENDL
  
  type_def: TYPE_ARRAY | TYPE_CHAR | TYPE_FLOAT | TYPE_INT | TYPE_MATRIX | TYPE_STRING | REF ID
  type_any: type_def | TYPE_VOID
@@ -140,7 +140,7 @@
  call_trgt: ID call_value
 
  call_value: DOT ID call_value
-           | PREC_OPEN call_trgt PREC_CLOSE call_sub_idx DOT ID call_value
+           | PREC_OPEN argument_list PREC_CLOSE call_sub_idx DOT ID call_value
            | IDX_OPEN expr IDX_CLOSE call_sub_idx DOT ID call_value
            | 
  
@@ -190,6 +190,8 @@
 
  */
 
+#define PARSE_ERROR(x) reportError(x, __LINE__);
+
 bool cParser::Parse(cFile& input)
 {
   m_lexer = new cLexer(input.GetFileStream());
@@ -204,40 +206,111 @@
   
 }
 
+cASTNode* cParser::parseArrayUnpack()
+{
+  return NULL;
+}
 
+cASTNode* cParser::parseForeachStatement()
+{
+  return NULL;
+}
+
+cASTNode* cParser::parseFunctionDeclare()
+{
+  return NULL;
+}
+
+cASTNode* cParser::parseFunctionDefine()
+{
+  return NULL;
+}
+
+cASTNode* cParser::parseIfStatement()
+{
+  return NULL;
+}
+
+cASTNode* cParser::parseIDStatement()
+{
+  return NULL;
+}
+
+cASTNode* cParser::parseLooseBlock()
+{
+  cASTNode* sl = parseStatementList();
+  if (currentToken() != ARR_CLOSE) {
+    PARSE_ERROR(UNEXPECTED_TOKEN);
+  }
+  return sl;
+}
+
+cASTNode* cParser::parseRefStatement()
+{
+  cASTNode* rs = NULL;
+  
+  switch (nextToken()) {
+    case ARR_OPEN:
+      parseArrayUnpack();
+      break;
+    case ID:
+      parseVarDeclare();
+      break;
+    case CMD_FUNCTION:
+      parseFunctionDeclare();
+      break;
+    default:
+      PARSE_ERROR(UNEXPECTED_TOKEN);
+  }
+  
+  return rs;
+}
+
+cASTNode* cParser::parseReturnStatement()
+{
+  return NULL;
+}
+
 cASTNode* cParser::parseStatementList()
 {
   cASTNode* sl = NULL;
-  
+
+#define CHECK_LINETERM() { if (!checkLineTerm(sl)) return sl; }
   while (nextToken()) {
     switch (currentToken()) {
       case ARR_OPEN:
         parseLooseBlock();
+        CHECK_LINETERM();
         break;
       case CMD_IF:
-        
+        parseIfStatement();
+        CHECK_LINETERM();
         break;
       case CMD_FOREACH:
-        
+        parseForeachStatement();
+        CHECK_LINETERM();
         break;
       case CMD_FUNCTION:
-        
+        parseFunctionDefine();
+        CHECK_LINETERM();
         break;
       case CMD_RETURN:
-
+        parseReturnStatement();
+        CHECK_LINETERM();
         break;
       case CMD_WHILE:
-        
+        parseWhileStatement();
+        CHECK_LINETERM();
         break;
       case ENDL:
         break;
       case ID:
-        
+        parseIDStatement();
         break;
       case REF:
-        
+        parseRefStatement();
         break;
-      case SUPRESS:
+      case SUPPRESS:
         break;
       case TYPE_ARRAY:
       case TYPE_CHAR:
@@ -245,20 +318,62 @@
       case TYPE_INT:
       case TYPE_MATRIX:
       case TYPE_STRING:
+        parseVarDeclare();
+        CHECK_LINETERM();
+        break;
         
-        break;
-      
       default:
         return sl;
     }
   }
+#undef CHECK_LINETERM()
   
   if (!currentToken()) m_eof = true;
   return sl;
 }
 
-cASTNode* cParser::parseLooseBlock()
+cASTNode* cParser::parseVarDeclare()
 {
   return NULL;
 }
 
+cASTNode* cParser::parseWhileStatement()
+{
+  return NULL;
+}
+
+
+bool cParser::checkLineTerm(cASTNode* node)
+{
+  if (currentToken() == SUPPRESS) {
+    // @todo - mark output as suppressed
+    return true;
+  } else if (currentToken() == ENDL) {
+    return true;
+  }
+  
+  PARSE_ERROR(UNTERMINATED_EXPR);
+  return false;
+}
+
+
+void cParser::reportError(ASParseError_t err, const int line)
+{
+  m_success = false;
+
+  std::cerr << "error: ";
+
+  switch (err) {
+    case UNEXPECTED_TOKEN:
+      std::cerr << "unexpected token '" << currentToken() << "'." << std::endl;
+      break;
+    case UNTERMINATED_EXPR:
+      std::cerr << "unterminated expression'" << currentToken() << "'." << std::endl;
+      break;      
+    case INTERNAL:
+      std::cerr << "internal parser error at cParser.cc:" << line << std::endl;
+    case UNKNOWN:
+    default:
+      std::cerr << "parse error" << std::endl;
+  }
+}

Modified: development/source/script/cParser.h
===================================================================
--- development/source/script/cParser.h	2007-07-01 17:04:13 UTC (rev 1740)
+++ development/source/script/cParser.h	2007-07-01 19:35:35 UTC (rev 1741)
@@ -27,6 +27,9 @@
 
 #include <iostream>
 
+#ifndef AvidaScript_h
+#include "AvidaScript.h"
+#endif
 #ifndef ASTree_h
 #include "ASTree.h"
 #endif
@@ -72,8 +75,22 @@
   inline int currentToken() { return m_cur_tok; }
   inline int nextToken();
   
+  cASTNode* parseArrayUnpack();
+  cASTNode* parseForeachStatement();
+  cASTNode* parseFunctionDeclare();
+  cASTNode* parseFunctionDefine();
+  cASTNode* parseIDStatement();
+  cASTNode* parseIfStatement();
+  cASTNode* parseLooseBlock();
+  cASTNode* parseRefStatement();
+  cASTNode* parseReturnStatement();
   cASTNode* parseStatementList();
-  cASTNode* parseLooseBlock();
+  cASTNode* parseVarDeclare();
+  cASTNode* parseWhileStatement();
+  
+  bool checkLineTerm(cASTNode* node);
+  
+  void reportError(ASParseError_t err, const int line);
 };
 
 




More information about the Avida-cvs mailing list