[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