[Avida-SVN] r2012 - development/source/script
brysonda at myxo.css.msu.edu
brysonda at myxo.css.msu.edu
Mon Aug 27 07:35:24 PDT 2007
Author: brysonda
Date: 2007-08-27 10:35:24 -0400 (Mon, 27 Aug 2007)
New Revision: 2012
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/cParser.cc
development/source/script/cParser.h
Log:
AS: Variable definition lists.
Modified: development/source/script/ASTree.cc
===================================================================
--- development/source/script/ASTree.cc 2007-08-27 13:41:15 UTC (rev 2011)
+++ development/source/script/ASTree.cc 2007-08-27 14:35:24 UTC (rev 2012)
@@ -38,6 +38,7 @@
void cASTFunctionDefinition::Accept(cASTVisitor& visitor) { visitor.visitFunctionDefinition(*this); }
void cASTVariableDefinition::Accept(cASTVisitor& visitor) { visitor.visitVariableDefinition(*this); }
+void cASTVariableDefinitionList::Accept(cASTVisitor& visitor) { visitor.visitVariableDefinitionList(*this); }
void cASTExpressionBinary::Accept(cASTVisitor& visitor) { visitor.visitExpressionBinary(*this); }
void cASTExpressionUnary::Accept(cASTVisitor& visitor) { visitor.visitExpressionUnary(*this); }
Modified: development/source/script/ASTree.h
===================================================================
--- development/source/script/ASTree.h 2007-08-27 13:41:15 UTC (rev 2011)
+++ development/source/script/ASTree.h 2007-08-27 14:35:24 UTC (rev 2012)
@@ -78,6 +78,7 @@
class cASTFunctionDefinition;
class cASTVariableDefinition;
+class cASTVariableDefinitionList;
class cASTExpressionBinary;
class cASTExpressionUnary;
@@ -243,16 +244,16 @@
private:
ASType_t m_type;
cString m_name;
- cASTNode* m_args;
+ cASTVariableDefinitionList* m_args;
cASTNode* m_code;
public:
- cASTFunctionDefinition(ASType_t type, const cString& name, cASTNode* args)
+ cASTFunctionDefinition(ASType_t type, const cString& name, cASTVariableDefinitionList* args)
: m_type(type), m_name(name), m_args(args), m_code(NULL) { ; }
inline ASType_t GetType() { return m_type; }
inline const cString& GetName() { return m_name; }
- inline cASTNode* GetArguments() { return m_args; }
+ inline cASTVariableDefinitionList* GetArguments() { return m_args; }
inline void SetCode(cASTNode* code) { m_code = code; }
inline cASTNode* GetCode() { return m_code; }
@@ -283,8 +284,27 @@
};
+class cASTVariableDefinitionList : public cASTNode
+{
+private:
+ tList<cASTVariableDefinition> m_nodes;
+
+public:
+ cASTVariableDefinitionList() { ; }
+ ~cASTVariableDefinitionList() { ; }
+
+ inline void AddNode(cASTVariableDefinition* n) { m_nodes.PushRear(n); }
+ inline tListIterator<cASTVariableDefinition> Iterator() { return tListIterator<cASTVariableDefinition>(m_nodes); }
+
+ inline int GetSize() const { return m_nodes.GetSize(); }
+
+ void Accept(cASTVisitor& visitor);
+};
+
+
+
// -------- Expression Operation Nodes --------
class cASTExpressionBinary : public cASTNode
Modified: development/source/script/cASTDumpVisitor.cc
===================================================================
--- development/source/script/cASTDumpVisitor.cc 2007-08-27 13:41:15 UTC (rev 2011)
+++ development/source/script/cASTDumpVisitor.cc 2007-08-27 14:35:24 UTC (rev 2012)
@@ -240,13 +240,24 @@
{
indent();
cout << (node.IsDefinition() ? "":"@") << "function: " << mapType(node.GetType()) << " " << node.GetName() << "(";
+ if (node.GetArguments()->GetSize()) {
+ cout << endl;
+ node.GetArguments()->Accept(*this);
+ indent();
+ }
+ cout << ")" << endl;
- cout << ")" << endl;
+ indent();
+ cout << "{" << endl;
+
if (node.IsDefinition()) {
m_depth++;
node.GetCode()->Accept(*this);
m_depth--;
}
+
+ indent();
+ cout << "}" << endl;
}
@@ -268,7 +279,19 @@
}
+void cASTDumpVisitor::visitVariableDefinitionList(cASTVariableDefinitionList& node)
+{
+ m_depth++;
+
+ tListIterator<cASTVariableDefinition> it = node.Iterator();
+ cASTNode* val = NULL;
+ while ((val = it.Next())) val->Accept(*this);
+
+ m_depth--;
+}
+
+
void cASTDumpVisitor::visitExpressionBinary(cASTExpressionBinary& node)
{
m_depth++;
Modified: development/source/script/cASTDumpVisitor.h
===================================================================
--- development/source/script/cASTDumpVisitor.h 2007-08-27 13:41:15 UTC (rev 2011)
+++ development/source/script/cASTDumpVisitor.h 2007-08-27 14:35:24 UTC (rev 2012)
@@ -49,6 +49,7 @@
void visitFunctionDefinition(cASTFunctionDefinition&);
void visitVariableDefinition(cASTVariableDefinition&);
+ void visitVariableDefinitionList(cASTVariableDefinitionList&);
void visitExpressionBinary(cASTExpressionBinary&);
void visitExpressionUnary(cASTExpressionUnary&);
Modified: development/source/script/cASTVisitor.h
===================================================================
--- development/source/script/cASTVisitor.h 2007-08-27 13:41:15 UTC (rev 2011)
+++ development/source/script/cASTVisitor.h 2007-08-27 14:35:24 UTC (rev 2012)
@@ -48,6 +48,7 @@
virtual void visitFunctionDefinition(cASTFunctionDefinition&) = 0;
virtual void visitVariableDefinition(cASTVariableDefinition&) = 0;
+ virtual void visitVariableDefinitionList(cASTVariableDefinitionList&) = 0;
virtual void visitExpressionBinary(cASTExpressionBinary&) = 0;
virtual void visitExpressionUnary(cASTExpressionUnary&) = 0;
Modified: development/source/script/cParser.cc
===================================================================
--- development/source/script/cParser.cc 2007-08-27 13:41:15 UTC (rev 2011)
+++ development/source/script/cParser.cc 2007-08-27 14:35:24 UTC (rev 2012)
@@ -667,14 +667,15 @@
cASTNode* cParser::parseFunctionDefine()
{
PARSE_TRACE("parseFunctionDefine");
- cASTFunctionDefinition* fd = parseFunctionHeader(false);
+ cASTFunctionDefinition* fd = parseFunctionHeader();
- fd->SetCode(parseCodeBlock());
+ // If the returned function definition is valid, parse the body
+ if (fd) fd->SetCode(parseCodeBlock());
return fd;
}
-cASTFunctionDefinition* cParser::parseFunctionHeader(bool declare)
+cASTFunctionDefinition* cParser::parseFunctionHeader()
{
PARSE_TRACE("parseFunctionHeader");
@@ -688,46 +689,26 @@
case TOKEN(TYPE_STRING): type = AS_TYPE_STRING; break;
case TOKEN(TYPE_VOID): type = AS_TYPE_VOID; break;
case TOKEN(ID):
- if (peekToken() != TOKEN(REF)) {
- nextToken();
- PARSE_UNEXPECT();
- return NULL;
- }
+ if (nextToken() != TOKEN(REF)) PARSE_UNEXPECT();
type = AS_TYPE_OBJECT_REF;
break;
default:
PARSE_UNEXPECT();
- return NULL;
}
if (nextToken() != TOKEN(ID)) {
PARSE_UNEXPECT();
- return NULL;
}
cString name(currentText());
- if (nextToken() != TOKEN(PREC_OPEN)) {
- PARSE_UNEXPECT();
- return NULL;
- }
+ if (nextToken() != TOKEN(PREC_OPEN)) PARSE_UNEXPECT();
- tAutoRelease<cASTNode> args;
- if (nextToken() != TOKEN(PREC_CLOSE)) {
- if (declare) {
- args = parseVarDeclareList();
- } else {
- args = parseArgumentList();
- }
- }
+ tAutoRelease<cASTVariableDefinitionList> args;
+ if (nextToken() != TOKEN(PREC_CLOSE)) args.Set(parseVariableDefinitionList());
+ if (currentToken() != TOKEN(PREC_CLOSE)) PARSE_UNEXPECT();
+ nextToken(); // consume ')'
- if (currentToken() != TOKEN(PREC_CLOSE)) {
- PARSE_UNEXPECT();
- return NULL;
- }
-
- nextToken();
-
return new cASTFunctionDefinition(type, name, args.Release());
}
@@ -747,7 +728,7 @@
return parseCallExpression(target, true);
break;
case TOKEN(REF):
- return parseVarDeclare();
+ return parseVariableDefinition();
break;
default:
@@ -871,7 +852,7 @@
case TOKEN(TYPE_INT):
case TOKEN(TYPE_MATRIX):
case TOKEN(TYPE_STRING):
- node.Set(parseVarDeclare());
+ node.Set(parseVariableDefinition());
break;
default:
@@ -897,9 +878,9 @@
}
-cASTNode* cParser::parseVarDeclare()
+cASTVariableDefinition* cParser::parseVariableDefinition()
{
- PARSE_TRACE("parseVarDeclare");
+ PARSE_TRACE("parseVariableDefinition");
ASType_t vtype = AS_TYPE_INVALID;
switch (currentToken()) {
@@ -942,18 +923,23 @@
return vd.Release();
}
-cASTNode* cParser::parseVarDeclareList()
+cASTVariableDefinitionList* cParser::parseVariableDefinitionList()
{
- PARSE_TRACE("parseVarDeclareList");
- cASTNode* vl = NULL;
+ PARSE_TRACE("parseVariableDefinitionList");
+ tAutoRelease<cASTVariableDefinitionList> vl(new cASTVariableDefinitionList());
- // @todo - var decleare list
- parseVarDeclare();
+ cASTVariableDefinition* vd = parseVariableDefinition();
+ if (!vd) return NULL;
+
+ (*vl).AddNode(vd);
while (currentToken() == TOKEN(COMMA)) {
- parseVarDeclare();
+ nextToken(); // consume ','
+ vd = parseVariableDefinition();
+ if (!vd) return NULL;
+ (*vl).AddNode(vd);
}
- return vl;
+ return vl.Release();
}
cASTNode* cParser::parseWhileStatement()
Modified: development/source/script/cParser.h
===================================================================
--- development/source/script/cParser.h 2007-08-27 13:41:15 UTC (rev 2011)
+++ development/source/script/cParser.h 2007-08-27 14:35:24 UTC (rev 2012)
@@ -105,7 +105,7 @@
cASTNode* parseExprP6_Index(cASTNode* l);
cASTNode* parseForeachStatement();
cASTNode* parseFunctionDefine();
- cASTFunctionDefinition* parseFunctionHeader(bool declare = true);
+ cASTFunctionDefinition* parseFunctionHeader();
cASTNode* parseIDStatement();
cASTNode* parseIfStatement();
cASTNode* parseIndexExpression();
@@ -113,8 +113,8 @@
cASTNode* parseRefStatement();
cASTNode* parseReturnStatement();
cASTNode* parseStatementList();
- cASTNode* parseVarDeclare();
- cASTNode* parseVarDeclareList();
+ cASTVariableDefinition* parseVariableDefinition();
+ cASTVariableDefinitionList* parseVariableDefinitionList();
cASTNode* parseWhileStatement();
void reportError(ASParseError_t err, const int line);
More information about the Avida-cvs
mailing list