[Avida-SVN] r1820 - development/source/script
brysonda at myxo.css.msu.edu
brysonda at myxo.css.msu.edu
Wed Jul 18 14:55:48 PDT 2007
Author: brysonda
Date: 2007-07-18 17:55:48 -0400 (Wed, 18 Jul 2007)
New Revision: 1820
Modified:
development/source/script/ASTree.h
development/source/script/cASTDumpVisitor.cc
development/source/script/cParser.cc
Log:
AS: IfBlock nodes. Fix loose block handling.
Modified: development/source/script/ASTree.h
===================================================================
--- development/source/script/ASTree.h 2007-07-18 19:11:05 UTC (rev 1819)
+++ development/source/script/ASTree.h 2007-07-18 21:55:48 UTC (rev 1820)
@@ -141,10 +141,21 @@
class cASTIfBlock : public cASTNode
{
private:
+ cASTNode* m_expr;
+ cASTNode* m_code;
+ cASTNode* m_else;
public:
- cASTIfBlock() { ; }
+ cASTIfBlock(cASTNode* expr, cASTNode* code) : m_expr(expr), m_code(code), m_else(NULL) { ; }
+ ~cASTIfBlock() { delete m_expr; delete m_code; delete m_else; }
+ inline cASTNode* GetCondition() { return m_expr; }
+ inline cASTNode* GetCode() { return m_code; }
+ inline void SetElseCode(cASTNode* code) { m_else = code; }
+ inline cASTNode* GetElseCode() { return m_else; }
+
+ inline bool HasElse() const { return (m_else); }
+
void Accept(cASTVisitor& visitor);
};
@@ -157,6 +168,7 @@
public:
cASTWhileBlock(cASTNode* expr, cASTNode* code) : m_expr(expr), m_code(code) { ; }
+ ~cASTWhileBlock() { delete m_expr; delete m_code; }
inline cASTNode* GetCondition() { return m_expr; }
inline cASTNode* GetCode() { return m_code; }
Modified: development/source/script/cASTDumpVisitor.cc
===================================================================
--- development/source/script/cASTDumpVisitor.cc 2007-07-18 19:11:05 UTC (rev 1819)
+++ development/source/script/cASTDumpVisitor.cc 2007-07-18 21:55:48 UTC (rev 1820)
@@ -132,7 +132,35 @@
void cASTDumpVisitor::visitIfBlock(cASTIfBlock& node)
{
+ indent();
+ cout << "if:" << endl;
+ m_depth++;
+ indent();
+ cout << "condition:" << endl;
+
+ m_depth++;
+ node.GetCondition()->Accept(*this);
+ m_depth--;
+
+ indent();
+ cout << "do:" << endl;
+
+ m_depth++;
+ node.GetCode()->Accept(*this);
+ m_depth--;
+
+ if (node.HasElse()) {
+ indent();
+ cout << "else:" << endl;
+
+ m_depth++;
+ node.GetElseCode()->Accept(*this);
+ m_depth--;
+ }
+
+ m_depth--;
+
}
Modified: development/source/script/cParser.cc
===================================================================
--- development/source/script/cParser.cc 2007-07-18 19:11:05 UTC (rev 1819)
+++ development/source/script/cParser.cc 2007-07-18 21:55:48 UTC (rev 1820)
@@ -712,6 +712,7 @@
bool loose = false;
parseCodeBlock(loose);
if (!loose && currentToken() != TOKEN(CMD_ENDFOREACH)) PARSE_UNEXPECT();
+ if (!loose) nextToken();
return fs;
}
@@ -727,8 +728,8 @@
PARSE_UNEXPECT();
return fd;
}
+ if (!loose) nextToken();
- nextToken();
return fd;
}
@@ -818,32 +819,39 @@
cASTNode* cParser::parseIfStatement()
{
PARSE_TRACE("parseIfStatement");
- cASTNode* is = NULL;
if (nextToken() != TOKEN(PREC_OPEN)) {
PARSE_UNEXPECT();
- return is;
+ return NULL;
}
nextToken();
- parseExpression();
+ tAutoRelease<cASTNode> cond(parseExpression());
if (currentToken() != TOKEN(PREC_CLOSE)) {
PARSE_UNEXPECT();
- return is;
+ return NULL;
}
+ nextToken();
bool loose = false;
- parseCodeBlock(loose);
+ cASTIfBlock* is = new cASTIfBlock(cond.Release(), parseCodeBlock(loose));
+
if (currentToken() == TOKEN(CMD_ELSE)) {
- parseCodeBlock(loose);
+ nextToken(); // consume 'else'
+ loose = false;
+ tAutoRelease<cASTNode> code(parseCodeBlock(loose));
if (!loose && currentToken() != TOKEN(CMD_ENDIF)) {
PARSE_UNEXPECT();
return is;
}
+ if (!loose) nextToken();
+ is->SetElseCode(code.Release());
} else if (!loose && currentToken() != TOKEN(CMD_ENDIF)) {
PARSE_UNEXPECT();
return is;
+ } else if (!loose) {
+ nextToken(); // consume 'endif'
}
return is;
@@ -871,6 +879,7 @@
if (currentToken() != TOKEN(ARR_CLOSE)) {
PARSE_UNEXPECT();
}
+ nextToken();
return sl;
}
@@ -1070,7 +1079,7 @@
PARSE_UNEXPECT();
return NULL;
}
- nextToken();
+ if (!loose) nextToken();
return new cASTWhileBlock(cond.Release(), code.Release());
}
More information about the Avida-cvs
mailing list