[Avida-SVN] r2005 - development/source/script
brysonda at myxo.css.msu.edu
brysonda at myxo.css.msu.edu
Fri Aug 24 12:50:46 PDT 2007
Author: brysonda
Date: 2007-08-24 15:50:46 -0400 (Fri, 24 Aug 2007)
New Revision: 2005
Modified:
development/source/script/ASTree.cc
development/source/script/ASTree.h
development/source/script/cASTDumpVisitor.cc
development/source/script/cASTDumpVisitor.h
development/source/script/cASTVisitor.h
development/source/script/cLexer.l
development/source/script/cParser.cc
Log:
AS: Argument lists and literal arrays/matrices.
Modified: development/source/script/ASTree.cc
===================================================================
--- development/source/script/ASTree.cc 2007-08-24 19:37:40 UTC (rev 2004)
+++ development/source/script/ASTree.cc 2007-08-24 19:50:46 UTC (rev 2005)
@@ -42,6 +42,7 @@
void cASTExpressionBinary::Accept(cASTVisitor& visitor) { visitor.visitExpressionBinary(*this); }
void cASTExpressionUnary::Accept(cASTVisitor& visitor) { visitor.visitExpressionUnary(*this); }
+void cASTArgumentList::Accept(cASTVisitor& visitor) { visitor.visitArgumentList(*this); }
void cASTFunctionCall::Accept(cASTVisitor& visitor) { visitor.visitFunctionCall(*this); }
void cASTLiteral::Accept(cASTVisitor& visitor) { visitor.visitLiteral(*this); }
void cASTLiteralArray::Accept(cASTVisitor& visitor) { visitor.visitLiteralArray(*this); }
Modified: development/source/script/ASTree.h
===================================================================
--- development/source/script/ASTree.h 2007-08-24 19:37:40 UTC (rev 2004)
+++ development/source/script/ASTree.h 2007-08-24 19:50:46 UTC (rev 2005)
@@ -82,6 +82,7 @@
class cASTExpressionBinary;
class cASTExpressionUnary;
+class cASTArgumentList;
class cASTFunctionCall;
class cASTLiteral;
class cASTLiteralArray;
@@ -328,6 +329,22 @@
// -------- Expression Value Nodes --------
+class cASTArgumentList : public cASTNode
+{
+private:
+ tList<cASTNode> m_nodes;
+
+public:
+ cASTArgumentList() { ; }
+ ~cASTArgumentList() { ; }
+
+ inline void AddNode(cASTNode* n) { m_nodes.PushRear(n); }
+ inline tListIterator<cASTNode> Iterator() { return tListIterator<cASTNode>(m_nodes); }
+
+ void Accept(cASTVisitor& visitor);
+};
+
+
class cASTFunctionCall : public cASTNode
{
private:
@@ -367,16 +384,15 @@
class cASTLiteralArray : public cASTNode
{
private:
- ASType_t m_type;
cASTNode* m_value;
+ bool m_is_matrix;
public:
- cASTLiteralArray(ASType_t t, cASTNode* v) : m_type(t), m_value(v) { ; }
- ~cASTLiteralArray() { delete m_value; }
+ cASTLiteralArray(cASTNode* v, bool is_mat) : m_value(v), m_is_matrix(is_mat) { ; }
+ ~cASTLiteralArray() { delete m_value; }
-
- inline ASType_t GetType() { return m_type; }
inline cASTNode* GetValue() { return m_value; }
+ inline bool IsMatrix() const { return m_is_matrix; }
void Accept(cASTVisitor& visitor);
};
Modified: development/source/script/cASTDumpVisitor.cc
===================================================================
--- development/source/script/cASTDumpVisitor.cc 2007-08-24 19:37:40 UTC (rev 2004)
+++ development/source/script/cASTDumpVisitor.cc 2007-08-24 19:50:46 UTC (rev 2005)
@@ -297,6 +297,16 @@
}
+void cASTDumpVisitor::visitArgumentList(cASTArgumentList& node)
+{
+ m_depth++;
+
+ tListIterator<cASTNode> it = node.Iterator();
+ cASTNode* val = NULL;
+ while ((val = it.Next())) val->Accept(*this);
+
+ m_depth--;
+}
void cASTDumpVisitor::visitFunctionCall(cASTFunctionCall& node)
{
@@ -333,7 +343,16 @@
void cASTDumpVisitor::visitLiteralArray(cASTLiteralArray& node)
{
-
+ indent();
+ if (node.IsMatrix()) cout << "$";
+ cout << "{" << endl;
+ m_depth++;
+
+ node.GetValue()->Accept(*this);
+
+ m_depth--;
+ indent();
+ cout << "}" << endl;
}
Modified: development/source/script/cASTDumpVisitor.h
===================================================================
--- development/source/script/cASTDumpVisitor.h 2007-08-24 19:37:40 UTC (rev 2004)
+++ development/source/script/cASTDumpVisitor.h 2007-08-24 19:50:46 UTC (rev 2005)
@@ -53,6 +53,7 @@
void visitExpressionBinary(cASTExpressionBinary&);
void visitExpressionUnary(cASTExpressionUnary&);
+ void visitArgumentList(cASTArgumentList&);
void visitFunctionCall(cASTFunctionCall&);
void visitLiteral(cASTLiteral&);
void visitLiteralArray(cASTLiteralArray&);
Modified: development/source/script/cASTVisitor.h
===================================================================
--- development/source/script/cASTVisitor.h 2007-08-24 19:37:40 UTC (rev 2004)
+++ development/source/script/cASTVisitor.h 2007-08-24 19:50:46 UTC (rev 2005)
@@ -52,6 +52,7 @@
virtual void visitExpressionBinary(cASTExpressionBinary&) = 0;
virtual void visitExpressionUnary(cASTExpressionUnary&) = 0;
+ virtual void visitArgumentList(cASTArgumentList&) = 0;
virtual void visitFunctionCall(cASTFunctionCall&) = 0;
virtual void visitLiteral(cASTLiteral&) = 0;
virtual void visitLiteralArray(cASTLiteralArray&) = 0;
Modified: development/source/script/cLexer.l
===================================================================
--- development/source/script/cLexer.l 2007-08-24 19:37:40 UTC (rev 2004)
+++ development/source/script/cLexer.l 2007-08-24 19:50:46 UTC (rev 2005)
@@ -83,7 +83,7 @@
\^ return AS_TOKEN_ARR_EXPAN;
\.\. return AS_TOKEN_ARR_WILD;
-\? return AS_TOKEN_MAT_MODIFY; // Matrix Modifier
+\$ return AS_TOKEN_MAT_MODIFY; // Matrix Modifier
array return AS_TOKEN_TYPE_ARRAY; // Built-in Types
char return AS_TOKEN_TYPE_CHAR;
Modified: development/source/script/cParser.cc
===================================================================
--- development/source/script/cParser.cc 2007-08-24 19:37:40 UTC (rev 2004)
+++ development/source/script/cParser.cc 2007-08-24 19:50:46 UTC (rev 2005)
@@ -214,7 +214,7 @@
m_tree = parseStatementList();
- if (!m_eof) PARSE_ERROR(UNEXPECTED_TOKEN);
+ if (!m_eof && m_success) PARSE_ERROR(UNEXPECTED_TOKEN);
if (!m_tree) PARSE_ERROR(EMPTY);
delete m_lexer;
@@ -293,11 +293,12 @@
cASTNode* cParser::parseArgumentList()
{
PARSE_TRACE("parseArgumentList");
- cASTNode* al = NULL;
- // @todo - argument list
- parseExpression();
+ cASTArgumentList* al = new cASTArgumentList();
+
+ al->AddNode(parseExpression());
while (currentToken() == TOKEN(COMMA)) {
- parseExpression();
+ nextToken(); // consume ','
+ al->AddNode(parseExpression());
}
return al;
@@ -544,6 +545,8 @@
PARSE_TRACE("parseExprP6");
tAutoRelease<cASTNode> expr;
+ bool is_matrix = false;
+
switch (currentToken()) {
case TOKEN(FLOAT):
expr.Set(new cASTLiteral(AS_TYPE_FLOAT, currentText()));
@@ -577,10 +580,11 @@
break;
case TOKEN(MAT_MODIFY):
if (nextToken() != TOKEN(ARR_OPEN)) PARSE_UNEXPECT();
+ is_matrix = true;
case TOKEN(ARR_OPEN):
- if (nextToken() != TOKEN(ARR_CLOSE)) parseArgumentList();
+ if (nextToken() != TOKEN(ARR_CLOSE)) expr.Set(parseArgumentList());
if (currentToken() != TOKEN(ARR_CLOSE)) PARSE_UNEXPECT();
- // @todo - return literal array
+ expr.Set(new cASTLiteralArray(expr.Release(), is_matrix));
break;
case TOKEN(OP_BIT_NOT):
@@ -597,7 +601,7 @@
return expr.Release();
default:
- break;
+ return NULL;
}
nextToken();
@@ -829,49 +833,40 @@
}
-#define CHECK_LINETERM() { if (!checkLineTerm(sl)) return sl; }
cASTNode* cParser::parseStatementList()
{
PARSE_TRACE("parseStatementList");
- cASTStatementList* sl = new cASTStatementList();
+ tAutoRelease<cASTStatementList> sl(new cASTStatementList());
- cASTNode* node = NULL;
+ tAutoRelease<cASTNode> node;
while (nextToken()) {
switch (currentToken()) {
case TOKEN(ARR_OPEN):
- node = parseLooseBlock();
- CHECK_LINETERM();
+ node.Set(parseLooseBlock());
break;
case TOKEN(CMD_IF):
- node = parseIfStatement();
- CHECK_LINETERM();
+ node.Set(parseIfStatement());
break;
case TOKEN(CMD_FOREACH):
- node = parseForeachStatement();
- CHECK_LINETERM();
+ node.Set(parseForeachStatement());
break;
case TOKEN(CMD_FUNCTION):
- node = parseFunctionDefine();
- CHECK_LINETERM();
+ node.Set(parseFunctionDefine());
break;
case TOKEN(CMD_RETURN):
- node = parseReturnStatement();
- CHECK_LINETERM();
+ node.Set(parseReturnStatement());
break;
case TOKEN(CMD_WHILE):
- node = parseWhileStatement();
- CHECK_LINETERM();
+ node.Set(parseWhileStatement());
break;
case TOKEN(ENDL):
continue;
case TOKEN(ID):
- node = parseIDStatement();
- CHECK_LINETERM();
+ node.Set(parseIDStatement());
break;
case TOKEN(REF):
- node = parseRefStatement();
- CHECK_LINETERM();
+ node.Set(parseRefStatement());
break;
case TOKEN(SUPPRESS):
continue;
@@ -881,26 +876,30 @@
case TOKEN(TYPE_INT):
case TOKEN(TYPE_MATRIX):
case TOKEN(TYPE_STRING):
- node = parseVarDeclare();
- CHECK_LINETERM();
+ node.Set(parseVarDeclare());
break;
default:
- return sl;
+ return sl.Release();
}
- if (node == NULL) {
+ if (node.IsNull()) {
// Some error has occured, so terminate early
if (m_success) PARSE_ERROR(INTERNAL); // Should not receive a null response without an error flag
- break;
}
- sl->AddNode(node);
+
+ if (currentToken() == TOKEN(SUPPRESS)) {
+ // @todo - mark output as suppressed
+ } else if (currentToken() != TOKEN(ENDL)) {
+ PARSE_ERROR(UNTERMINATED_EXPR);
+ }
+
+ (*sl).AddNode(node.Release());
}
if (!currentToken()) m_eof = true;
- return sl;
+ return sl.Release();
}
-#undef CHECK_LINETERM()
cASTNode* cParser::parseVarDeclare()
@@ -980,21 +979,6 @@
}
-bool cParser::checkLineTerm(cASTNode* node)
-{
- PARSE_TRACE("checkLineTerm");
- if (currentToken() == TOKEN(SUPPRESS)) {
- // @todo - mark output as suppressed
- return true;
- } else if (currentToken() == TOKEN(ENDL)) {
- return true;
- }
-
- PARSE_ERROR(UNTERMINATED_EXPR);
- return false;
-}
-
-
void cParser::reportError(ASParseError_t err, const int line)
{
#define ERR_ENDL " (cParser.cc:" << line << ")" << std::endl
More information about the Avida-cvs
mailing list