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

brysonda at myxo.css.msu.edu brysonda at myxo.css.msu.edu
Thu Jun 28 11:54:06 PDT 2007


Author: brysonda
Date: 2007-06-28 14:54:06 -0400 (Thu, 28 Jun 2007)
New Revision: 1724

Modified:
   development/source/script/AvidaScript.h
   development/source/script/cLexer.l
   development/source/script/cParser.cc
   development/source/script/cParser.h
Log:
More cParser grammar updates.  Initial parsing method stub. 

Modified: development/source/script/AvidaScript.h
===================================================================
--- development/source/script/AvidaScript.h	2007-06-28 18:28:03 UTC (rev 1723)
+++ development/source/script/AvidaScript.h	2007-06-28 18:54:06 UTC (rev 1724)
@@ -65,7 +65,10 @@
   ARR_CLOSE,
   ARR_RANGE,
   ARR_EXPAN,
+  ARR_WILD,
   
+  MAT_MODIFY,
+  
   TYPE_ARRAY,
   TYPE_CHAR,
   TYPE_FLOAT,

Modified: development/source/script/cLexer.l
===================================================================
--- development/source/script/cLexer.l	2007-06-28 18:28:03 UTC (rev 1723)
+++ development/source/script/cLexer.l	2007-06-28 18:54:06 UTC (rev 1724)
@@ -80,7 +80,10 @@
 \}          return ARR_CLOSE;
 :           return ARR_RANGE;
 \^          return ARR_EXPAN;
+\.\.        return ARR_WILD;
 
+\?          return MAT_MODIFY;    // Matrix Modifier
+
 array       return TYPE_ARRAY;    // Built-in Types
 char        return TYPE_CHAR;
 float       return TYPE_FLOAT;

Modified: development/source/script/cParser.cc
===================================================================
--- development/source/script/cParser.cc	2007-06-28 18:28:03 UTC (rev 1723)
+++ development/source/script/cParser.cc	2007-06-28 18:54:06 UTC (rev 1724)
@@ -38,7 +38,6 @@
                |
  
  statement: assign_expr lineterm
-          | expr lineterm
           | var_declare lineterm
           | loose_block
           | if_block lineterm
@@ -46,88 +45,109 @@
           | foreach_block lineterm
           | declare_function lineterm
           | define_function lineterm
+          | call_expr lineterm
           | return_stmt lineterm
           | lineterm
   
  lineterm: SUPRESS | ENDL
  
- type_any: TYPE_ARRAY | TYPE_CHAR | TYPE_FLOAT | TYPE_INT | TYPE_MATRIX | TYPE_STRING | TYPE_VOID
+ type_def: TYPE_ARRAY | TYPE_CHAR | TYPE_FLOAT | TYPE_INT | TYPE_MATRIX | TYPE_STRING | REF ID
+ type_any: type_def | TYPE_VOID
  
  assign_expr: assign_dest ASSIGN expr
-            | assign_dest ASSIGN array_inline
  
- array_inline: ARR_OPEN argument_list ARR_CLOSE
- 
  assign_dest: ID
             | REF ARR_OPEN id_list ARR_CLOSE
 
  id_list: ID id_list_1
  
  id_list_1: COMMA ID id_list_1
+          | COMMA ID ARR_WILD
+          | COMMA ARR_WILD
           |
  
  
  expr: p0_expr 
  
- p0_expr: p1_expr p0_expr_1
+ p0_expr: p1_expr p6_expr_1
  
- p0_expr_1: OP_LOGIC_AND p1_expr p0_expr_1
-          | OP_LOGIC_OR p1_expr p0_expr_1
+ p0_expr_1: ARR_RANGE p1_expr p0_expr_1
+          | ARR_EXPAN p1_expr p0_expr_1
           |
-
+ 
  p1_expr: p2_expr p1_expr_1
  
- p1_expr_1: OP_BIT_AND p2_expr p1_expr_1
-          | OP_BIT_OR p2_expr p1_expr_1
+ p1_expr_1: OP_LOGIC_AND p2_expr p1_expr_1
+          | OP_LOGIC_OR p2_expr p1_expr_1
           |
 
- 
  p2_expr: p3_expr p2_expr_1
  
- p2_expr_1: OP_EQ p3_expr p2_expr_1
-          | OP_LE p3_expr p2_expr_1
-          | OP_GE p3_expr p2_expr_1
-          | OP_LT p3_expr p2_expr_1
-          | OP_GT p3_expr p2_expr_1
-          | OP_NEQ p3_expr p2_expr_1
+ p2_expr_1: OP_BIT_AND p3_expr p2_expr_1
+          | OP_BIT_OR p3_expr p2_expr_1
           |
+
  
- 
  p3_expr: p4_expr p3_expr_1
  
- p3_expr_1: OP_ADD p4_expr p3_expr_1
-          | OP_SUB p4_expr p3_expr_1
+ p3_expr_1: OP_EQ p4_expr p3_expr_1
+          | OP_LE p4_expr p3_expr_1
+          | OP_GE p4_expr p3_expr_1
+          | OP_LT p4_expr p3_expr_1
+          | OP_GT p4_expr p3_expr_1
+          | OP_NEQ p4_expr p4_expr_1
           |
+ 
+ 
+ p4_expr: p5_expr p4_expr_1
+ 
+ p4_expr_1: OP_ADD p5_expr p4_expr_1
+          | OP_SUB p5_expr p4_expr_1
+          |
 
  
- p4_expr: p5_expr prec_4_expr_1
+ p5_expr: p6_expr p5_expr_1
  
- p4_expr_1: OP_MUL p5_expr p4_expr_1
-          | OP_DIV p5_expr p4_expr_1
-          | OP_MOD p5_expr p4_expr_1
+ p5_expr_1: OP_MUL p6_expr p5_expr_1
+          | OP_DIV p6_expr p5_expr_1
+          | OP_MOD p6_expr p5_expr_1
           |
  
- 
- p5_expr: value p5_expr_1
+ p6_expr: value p6_expr_1
         | OP_BIT_NOT expr
         | OP_LOGIC_NOT expr
         | OP_SUB expr
  
- p5_expr_1: DOT ID id_expr
+ p6_expr_1: DOT ID id_expr p6_expr_1
           |
- 
- 
+  
  value: FLOAT
       | INT
       | STRING
       | CHAR
       | ID id_expr
       | PREC_OPEN expr PREC_CLOSE
+      | 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
         |
  
+
+ call_expr: call_trgt PREC_OPEN argument_list PREC_CLOSE
+          
+ call_trgt: ID call_value
+
+ call_value: DOT ID call_value
+           | PREC_OPEN call_trgt PREC_CLOSE call_sub_idx DOT ID call_value
+           | IDX_OPEN expr IDX_CLOSE call_sub_idx DOT ID call_value
+           | 
+ 
+ call_sub_idx: IDX_OPEN expr IDX_CLOSE call_sub_idx
+             |
+ 
+ 
  argument_list: argument_list_1
               |
  
@@ -145,13 +165,14 @@
             | 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_any 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
-              | CMD_FOREACH type_any ID PREC_OPEN expr PREC_CLOSE loose_block
+              | CMD_FOREACH type_def ID PREC_OPEN expr PREC_CLOSE loose_block
 
- var_declare: type_any ID
-            | type_any ID ASSIGN expr
-            | type_any ID ASSIGN array_inline
+ var_declare: type_def ID
+            | type_def ID ASSIGN expr
+            | type_def ID PREC_OPEN expr PREC_CLOSE
+            | type_def ID PREC_OPEN argument_list PREC_CLOSE
  
  var_declare_list: var_declare_list_1
                  |
@@ -166,26 +187,78 @@
                 | CMD_FUNCTION type_any ID PREC_OPEN var_declare_list PREC_CLOSE loose_block
  
  return_stmt: CMD_RETURN expr
- 
+
  */
 
 bool cParser::Parse(cFile& input)
 {
   m_lexer = new cLexer(input.GetFileStream());
-  
-  int tok = m_lexer->yylex();
-  while (tok) {
-    std::cout << "Token(" << tok << "): '" << m_lexer->YYText() << "'" << endl;
-    tok = m_lexer->yylex();
-  }
-  
+  parseStatementList();
   delete m_lexer;
   
   return m_success;
 }
 
-
 void cParser::Accept(cASTVisitor& visitor)
 {
   
 }
+
+
+cASTNode* cParser::parseStatementList()
+{
+  cASTNode* sl = NULL;
+  
+  while (nextToken()) {
+    switch (currentToken()) {
+      case ARR_OPEN:
+        parseLooseBlock();
+        break;
+      case CMD_IF:
+        
+        break;
+      case CMD_FOREACH:
+        
+        break;
+      case CMD_FUNCTION:
+        
+        break;
+      case CMD_RETURN:
+
+        break;
+      case CMD_WHILE:
+        
+        break;
+      case ENDL:
+        break;
+      case ID:
+        
+        break;
+      case REF:
+        
+        break;
+      case SUPRESS:
+        break;
+      case TYPE_ARRAY:
+      case TYPE_CHAR:
+      case TYPE_FLOAT:
+      case TYPE_INT:
+      case TYPE_MATRIX:
+      case TYPE_STRING:
+        
+        break;
+      
+      default:
+        return sl;
+    }
+  }
+  
+  if (!currentToken()) m_eof = true;
+  return sl;
+}
+
+cASTNode* cParser::parseLooseBlock()
+{
+  return NULL;
+}
+

Modified: development/source/script/cParser.h
===================================================================
--- development/source/script/cParser.h	2007-06-28 18:28:03 UTC (rev 1723)
+++ development/source/script/cParser.h	2007-06-28 18:54:06 UTC (rev 1724)
@@ -52,17 +52,36 @@
   cASLibrary* m_library;
   cLexer* m_lexer;
   cASTNode* m_tree;
-  
+
+  bool m_eof;
   bool m_success;
   
+  int m_cur_tok;
+  
   cParser();
   
 public:
-  cParser(cASLibrary* library) : m_library(library), m_success(true) { ; }
+  cParser(cASLibrary* library) : m_library(library), m_eof(false), m_success(true), m_cur_tok(0) { ; }
   
   bool Parse(cFile& input);
   
   void Accept(cASTVisitor& visitor);
+  
+  
+private:
+  inline int currentToken() { return m_cur_tok; }
+  inline int nextToken();
+  
+  cASTNode* parseStatementList();
+  cASTNode* parseLooseBlock();
 };
 
+
+inline int cParser::nextToken()
+{
+  m_cur_tok = m_lexer->yylex();
+  return m_cur_tok;
+}
+
+
 #endif




More information about the Avida-cvs mailing list