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

brysonda at myxo.css.msu.edu brysonda at myxo.css.msu.edu
Fri Jul 6 11:58:57 PDT 2007


Author: brysonda
Date: 2007-07-06 14:58:57 -0400 (Fri, 06 Jul 2007)
New Revision: 1757

Modified:
   development/source/script/AvidaScript.h
   development/source/script/cParser.cc
   development/source/script/cParser.h
Log:
AS: Expressions.

Modified: development/source/script/AvidaScript.h
===================================================================
--- development/source/script/AvidaScript.h	2007-07-06 17:52:40 UTC (rev 1756)
+++ development/source/script/AvidaScript.h	2007-07-06 18:58:57 UTC (rev 1757)
@@ -106,6 +106,7 @@
 typedef enum eASParseErrors {
   AS_PARSE_ERR_UNEXPECTED_TOKEN,
   AS_PARSE_ERR_UNTERMINATED_EXPR,
+  AS_PARSE_ERR_NULL_EXPR,
   AS_PARSE_ERR_EOF,
   AS_PARSE_ERR_INTERNAL,
   AS_PARSE_ERR_UNKNOWN

Modified: development/source/script/cParser.cc
===================================================================
--- development/source/script/cParser.cc	2007-07-06 17:52:40 UTC (rev 1756)
+++ development/source/script/cParser.cc	2007-07-06 18:58:57 UTC (rev 1757)
@@ -119,6 +119,7 @@
         | OP_SUB expr
  
  p6_expr_1: DOT ID id_expr p6_expr_1
+          | IDX_OPEN expr IDX_CLOSE
           |
   
  value: FLOAT
@@ -130,8 +131,7 @@
       | ARR_OPEN argument_list ARR_CLOSE
       | MAT_MODIFY ARR_OPEN argument_list ARR_CLOSE
  
- id_expr: IDX_OPEN expr IDX_CLOSE
-        | PREC_OPEN argument_list PREC_CLOSE
+ id_expr: PREC_OPEN argument_list PREC_CLOSE
         |
  
 
@@ -189,7 +189,7 @@
 
  */
 
-#define PARSE_ERROR(x) reportError(AS_PARSE_ERR_ ## 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); } }
 
 
@@ -349,11 +349,255 @@
 
 cASTNode* cParser::parseExpression()
 {
+  cASTNode* expr = NULL;
   
-  // @todo
-  return NULL;
+  expr = parseExprP0();
+  if (!expr) {
+    if (currentToken())
+      PARSE_ERROR(NULL_EXPR);
+    else
+      PARSE_ERROR(EOF);
+  }
+  
+  return expr;
 }
 
+cASTNode* cParser::parseExprP0()
+{
+  cASTNode* l = parseExprP1();
+  cASTNode* r = NULL;
+  
+  while(true) {
+    switch (currentToken()) {
+      case ARR_RANGE:
+      case ARR_EXPAN:
+        nextToken();
+        r = parseExprP1();
+        // set l == new expr
+        break;
+        
+      default:
+        return l;
+    }
+  }
+  
+  return l;
+}
+
+cASTNode* cParser::parseExprP1()
+{
+  cASTNode* l = parseExprP2();
+  cASTNode* r = NULL;
+  
+  while(true) {
+    switch (currentToken()) {
+      case OP_LOGIC_AND:
+      case OP_LOGIC_OR:
+        nextToken();
+        r = parseExprP2();
+        // set l == new expr
+        break;
+        
+      default:
+        return l;
+    }
+  }
+  
+  return l;
+}
+
+cASTNode* cParser::parseExprP2()
+{
+  cASTNode* l = parseExprP3();
+  cASTNode* r = NULL;
+  
+  while(true) {
+    switch (currentToken()) {
+      case OP_BIT_AND:
+      case OP_BIT_OR:
+        nextToken();
+        r = parseExprP3();
+        // set l == new expr
+        break;
+        
+      default:
+        return l;
+    }
+  }
+  
+  return l;
+}
+
+cASTNode* cParser::parseExprP3()
+{
+  cASTNode* l = parseExprP4();
+  cASTNode* r = NULL;
+  
+  while(true) {
+    switch (currentToken()) {
+      case OP_EQ:
+      case OP_LE:
+      case OP_GE:
+      case OP_LT:
+      case OP_GT:
+      case OP_NEQ:
+        nextToken();
+        r = parseExprP4();
+        // set l == new expr
+        break;
+        
+      default:
+        return l;
+    }
+  }
+  
+  return l;
+}
+
+cASTNode* cParser::parseExprP4()
+{
+  cASTNode* l = parseExprP5();
+  cASTNode* r = NULL;
+  
+  while(true) {
+    switch (currentToken()) {
+      case OP_ADD:
+      case OP_SUB:
+        nextToken();
+        r = parseExprP5();
+        // set l == new expr
+        break;
+        
+      default:
+        return l;
+    }
+  }
+  
+  return l;
+}
+
+cASTNode* cParser::parseExprP5()
+{
+  cASTNode* l = parseExprP6();
+  cASTNode* r = NULL;
+  
+  while(true) {
+    switch (currentToken()) {
+      case OP_MUL:
+      case OP_DIV:
+      case OP_MOD:
+        nextToken();
+        r = parseExprP6();
+        // set l == new expr
+        break;
+        
+      default:
+        return l;
+    }
+  }
+  
+  return l;
+}
+
+cASTNode* cParser::parseExprP6()
+{
+  cASTNode* expr = NULL;
+  
+  switch (currentToken()) {
+    case FLOAT:
+    case INT:
+    case CHAR:
+      // @todo - expr = ;
+      break;
+    case STRING:
+      // @todo - expr = ;
+      break;
+    case ID:
+      if (peekToken() == PREC_OPEN) {
+        nextToken();
+        nextToken();
+        parseArgumentList();
+        if (currentToken() != PREC_CLOSE) {
+          PARSE_UNEXPECT();
+          return expr;
+        }
+        // @todo - expr = ;
+      } else {
+        // @todo - expr = ;
+      }
+      break;
+    case PREC_OPEN:
+      nextToken();
+      expr = parseExpression();
+      if (currentToken() != PREC_CLOSE) {
+        PARSE_UNEXPECT();
+        return expr;
+      }
+      break;
+    case MAT_MODIFY:
+      if (nextToken() != ARR_OPEN) {
+        PARSE_UNEXPECT();
+        return expr;
+      }
+    case ARR_OPEN:
+      nextToken();
+      parseArgumentList();
+      if (currentToken() != ARR_CLOSE) {
+        PARSE_UNEXPECT();
+        return expr;
+      }
+      break;
+      
+    case OP_BIT_NOT:
+    case OP_LOGIC_NOT:
+    case OP_SUB:
+      expr = parseExpression();
+      nextToken();
+      return expr;
+      
+    default:
+      break;
+  }
+
+  if (expr) expr = parseExprP6_Index(expr);
+  return expr;
+}
+
+cASTNode* cParser::parseExprP6_Index(cASTNode* l)
+{
+  while (currentToken() == DOT || currentToken() == IDX_OPEN) {
+    if (currentToken() == DOT) {
+      if (nextToken() != ID) {
+        PARSE_UNEXPECT();
+        return l;
+      }
+      if (peekToken() == PREC_OPEN) {
+        nextToken();
+        nextToken();
+        parseArgumentList();
+        if (currentToken() != PREC_CLOSE) {
+          PARSE_UNEXPECT();
+          return l;
+        }
+        // @todo
+      } else {
+        // @todo
+      }
+    } else { // IDX_OPEN:
+      nextToken();
+      parseExpression();
+      if (currentToken() != IDX_CLOSE) {
+        PARSE_UNEXPECT();
+        return l;
+      }
+      // @todo
+    }
+  }
+  
+  return l;
+}
+
+
 cASTNode* cParser::parseForeachStatement()
 {
   cASTNode* fs = NULL;
@@ -753,6 +997,8 @@
     case AS_PARSE_ERR_UNTERMINATED_EXPR:
       std::cerr << "unterminated expression'" << currentToken() << "'." << std::endl;
       break;
+    case AS_PARSE_ERR_NULL_EXPR:
+      std::cerr << "expected expression, found '" << currentToken() << "'." << std::endl;
     case AS_PARSE_ERR_EOF:
       if (!m_err_eof) {
         std::cerr << "unexpected end of file" << std::endl;

Modified: development/source/script/cParser.h
===================================================================
--- development/source/script/cParser.h	2007-07-06 17:52:40 UTC (rev 1756)
+++ development/source/script/cParser.h	2007-07-06 18:58:57 UTC (rev 1757)
@@ -88,6 +88,14 @@
   cASTNode* parseCallExpression();
   cASTNode* parseCodeBlock(bool& loose);
   cASTNode* parseExpression();
+  cASTNode* parseExprP0();
+  cASTNode* parseExprP1();
+  cASTNode* parseExprP2();
+  cASTNode* parseExprP3();
+  cASTNode* parseExprP4();
+  cASTNode* parseExprP5();
+  cASTNode* parseExprP6();
+  cASTNode* parseExprP6_Index(cASTNode* l);
   cASTNode* parseForeachStatement();
   cASTNode* parseFunctionDefine();
   cASTNode* parseFunctionHeader(bool declare = true);




More information about the Avida-cvs mailing list