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

brysonda at myxo.css.msu.edu brysonda at myxo.css.msu.edu
Sun Jul 1 17:55:51 PDT 2007


Author: brysonda
Date: 2007-07-01 20:55:51 -0400 (Sun, 01 Jul 2007)
New Revision: 1742

Modified:
   development/source/script/AvidaScript.h
   development/source/script/cLexer.l
   development/source/script/cParser.cc
   development/source/script/cParser.h
Log:
First pass at ArrayUnpack, Assignment, Foreach, IDStatement, ReturnStatement.

Modified: development/source/script/AvidaScript.h
===================================================================
--- development/source/script/AvidaScript.h	2007-07-01 19:35:35 UTC (rev 1741)
+++ development/source/script/AvidaScript.h	2007-07-02 00:55:51 UTC (rev 1742)
@@ -99,14 +99,15 @@
   STRING,
   CHAR,
   
-  ERR
+  UNKNOWN
 };
 
 typedef enum eASParseErrors {
-  UNEXPECTED_TOKEN,
-  UNTERMINATED_EXPR,
-  INTERNAL,
-  UNKNOWN
+  AS_PARSE_ERR_UNEXPECTED_TOKEN,
+  AS_PARSE_ERR_UNTERMINATED_EXPR,
+  AS_PARSE_ERR_EOF,
+  AS_PARSE_ERR_INTERNAL,
+  AS_PARSE_ERR_UNKNOWN
 } ASParseError_t;
 
 #endif

Modified: development/source/script/cLexer.l
===================================================================
--- development/source/script/cLexer.l	2007-07-01 19:35:35 UTC (rev 1741)
+++ development/source/script/cLexer.l	2007-07-02 00:55:51 UTC (rev 1742)
@@ -115,7 +115,7 @@
 \"([^"\\\n]|\\\"|\\\\|\\.)*\"       return STRING;
 \'([^'\\\n]|\\\'|\\\\)\'            return CHAR;
 
-.           return ERR;           // Unrecognized Tokens
+.           return UNKNOWN;           // Unrecognized Tokens
 
 
 

Modified: development/source/script/cParser.cc
===================================================================
--- development/source/script/cParser.cc	2007-07-01 19:35:35 UTC (rev 1741)
+++ development/source/script/cParser.cc	2007-07-02 00:55:51 UTC (rev 1742)
@@ -51,7 +51,7 @@
   
  lineterm: SUPPRESS | ENDL
  
- type_def: TYPE_ARRAY | TYPE_CHAR | TYPE_FLOAT | TYPE_INT | TYPE_MATRIX | TYPE_STRING | REF ID
+ type_def: TYPE_ARRAY | TYPE_CHAR | TYPE_FLOAT | TYPE_INT | TYPE_MATRIX | TYPE_STRING | ID REF
  type_any: type_def | TYPE_VOID
  
  assign_expr: assign_dest ASSIGN expr
@@ -159,14 +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 lineterm statement_list CMD_ELSE statement_list CMD_ENDIF
  
  while_block: CMD_WHILE PREC_OPEN expr PREC_CLOSE lineterm statement_list CMD_ENDWHILE
             | CMD_WHILE PREC_OPEN expr PREC_CLOSE loose_block
  
- foreach_block: CMD_FOREACH REF ID PREC_OPEN expr PREC_CLOSE lineterm statement_list CMD_ENDFOREACH
-              | CMD_FOREACH type_def ID PREC_OPEN expr PREC_CLOSE lineterm statement_list CMD_ENDFOREACH
-              | CMD_FOREACH REF ID 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
 
  var_declare: type_def ID
@@ -190,7 +188,8 @@
 
  */
 
-#define PARSE_ERROR(x) reportError(x, __LINE__);
+#define PARSE_ERROR(x) reportError(AS_PARSE_ERR_ ## x, __LINE__);
+#define PARSE_UNEXPECT() { if (currentToken()) { PARSE_ERROR(UNEXPECTED_TOKEN); } else { PARSE_ERROR(EOF); } }
 
 bool cParser::Parse(cFile& input)
 {
@@ -208,39 +207,160 @@
 
 cASTNode* cParser::parseArrayUnpack()
 {
+  cASTNode* au = NULL;
+  
+  if (nextToken() != ID) {
+    PARSE_ERROR(UNEXPECTED_TOKEN);
+    return au;
+  }
+  
+  while (nextToken()) {
+    if (currentToken() == COMMA) {
+      nextToken();
+      if (currentToken() == ID) {
+        continue;
+      } else if (currentToken() == ARR_WILD) {
+        break;
+      } else {
+        PARSE_ERROR(UNEXPECTED_TOKEN);
+        break;
+      }
+    } else if (currentToken() == ARR_WILD) {
+      break;
+    } else {
+      PARSE_UNEXPECT();
+      break;      
+    }
+  }
+
+  return au;
+}
+
+cASTNode* cParser::parseAssignment()
+{
+  cASTNode* an = NULL;
+  
+  nextToken();
+  parseExpression();
+  
+  return an;
+}
+
+cASTNode* cParser::parseCallExpression()
+{
+  // @todo
   return NULL;
 }
 
-cASTNode* cParser::parseForeachStatement()
+cASTNode* cParser::parseExpression()
 {
+  // @todo
   return NULL;
 }
 
+cASTNode* cParser::parseForeachStatement()
+{
+  cASTNode* fs = NULL;
+  
+  switch (nextToken()) {
+    case TYPE_ARRAY:
+    case TYPE_CHAR:
+    case TYPE_FLOAT:
+    case TYPE_INT:
+    case TYPE_MATRIX:
+    case TYPE_STRING:
+      break;
+    case ID:
+      if (nextToken() != REF) {
+        PARSE_UNEXPECT();
+        return fs;
+      }
+      break;
+      
+    default:
+      PARSE_UNEXPECT();
+      return fs;
+  }
+  
+  if (nextToken() != PREC_OPEN) {
+    PARSE_UNEXPECT();
+    return fs;
+  }
+  
+  nextToken();
+  parseExpression();
+  
+  if (currentToken() != PREC_CLOSE) {
+    PARSE_UNEXPECT();
+    return fs;
+  }
+  
+  nextToken();
+  if (currentToken() == ARR_OPEN) {
+    parseLooseBlock();
+  } else if (currentToken() == SUPPRESS || currentToken() == ENDL) {
+    parseStatementList();
+    if (currentToken() != CMD_ENDFOREACH) {
+      PARSE_UNEXPECT();
+      return fs;
+    }
+  } else {
+    PARSE_UNEXPECT();
+    return fs;
+  }
+  
+  return fs;
+}
+
 cASTNode* cParser::parseFunctionDeclare()
 {
+  // @todo
   return NULL;
 }
 
 cASTNode* cParser::parseFunctionDefine()
 {
+  // @todo
   return NULL;
 }
 
 cASTNode* cParser::parseIfStatement()
 {
+  // @todo
   return NULL;
 }
 
 cASTNode* cParser::parseIDStatement()
 {
-  return NULL;
+  cASTNode* is = NULL;
+  
+  switch (nextToken()) {
+    case ASSIGN:
+      parseAssignment();
+      break;
+    case DOT:
+    case IDX_OPEN:
+    case PREC_OPEN:
+      parseCallExpression();
+      break;
+    case REF:
+      parseVarDeclare();
+      break;
+      
+    default:
+      PARSE_UNEXPECT();
+      break;
+  }      
+      
+  return is;
 }
 
 cASTNode* cParser::parseLooseBlock()
 {
+  nextToken();
   cASTNode* sl = parseStatementList();
   if (currentToken() != ARR_CLOSE) {
-    PARSE_ERROR(UNEXPECTED_TOKEN);
+    PARSE_UNEXPECT();
   }
   return sl;
 }
@@ -248,19 +368,16 @@
 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);
+      PARSE_UNEXPECT();
   }
   
   return rs;
@@ -268,7 +385,12 @@
 
 cASTNode* cParser::parseReturnStatement()
 {
-  return NULL;
+  cASTNode* rs = NULL;
+  
+  nextToken();
+  parseExpression();
+  
+  return rs;
 }
 
 cASTNode* cParser::parseStatementList()
@@ -306,6 +428,7 @@
         break;
       case ID:
         parseIDStatement();
+        CHECK_LINETERM();
         break;
       case REF:
         parseRefStatement();
@@ -334,11 +457,13 @@
 
 cASTNode* cParser::parseVarDeclare()
 {
+  // @todo
   return NULL;
 }
 
 cASTNode* cParser::parseWhileStatement()
 {
+  // @todo
   return NULL;
 }
 
@@ -364,15 +489,21 @@
   std::cerr << "error: ";
 
   switch (err) {
-    case UNEXPECTED_TOKEN:
+    case AS_PARSE_ERR_UNEXPECTED_TOKEN:
       std::cerr << "unexpected token '" << currentToken() << "'." << std::endl;
       break;
-    case UNTERMINATED_EXPR:
+    case AS_PARSE_ERR_UNTERMINATED_EXPR:
       std::cerr << "unterminated expression'" << currentToken() << "'." << std::endl;
-      break;      
-    case INTERNAL:
+      break;
+    case AS_PARSE_ERR_EOF:
+      if (!m_err_eof) {
+        std::cerr << "unexpected end of file" << std::endl;
+        m_err_eof = true;
+      }
+      break;
+    case AS_PARSE_ERR_INTERNAL:
       std::cerr << "internal parser error at cParser.cc:" << line << std::endl;
-    case UNKNOWN:
+    case AS_PARSE_ERR_UNKNOWN:
     default:
       std::cerr << "parse error" << std::endl;
   }

Modified: development/source/script/cParser.h
===================================================================
--- development/source/script/cParser.h	2007-07-01 19:35:35 UTC (rev 1741)
+++ development/source/script/cParser.h	2007-07-02 00:55:51 UTC (rev 1742)
@@ -61,10 +61,12 @@
   
   int m_cur_tok;
   
+  bool m_err_eof;
+  
   cParser();
   
 public:
-  cParser(cASLibrary* library) : m_library(library), m_eof(false), m_success(true), m_cur_tok(0) { ; }
+  cParser(cASLibrary* library) : m_library(library), m_eof(false), m_success(true), m_cur_tok(0), m_err_eof(false) { ; }
   
   bool Parse(cFile& input);
   
@@ -76,6 +78,9 @@
   inline int nextToken();
   
   cASTNode* parseArrayUnpack();
+  cASTNode* parseAssignment();
+  cASTNode* parseCallExpression();
+  cASTNode* parseExpression();
   cASTNode* parseForeachStatement();
   cASTNode* parseFunctionDeclare();
   cASTNode* parseFunctionDefine();




More information about the Avida-cvs mailing list