[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