[Avida-SVN] r1984 - in development: Avida.xcodeproj source/script source/tools
brysonda at myxo.css.msu.edu
brysonda at myxo.css.msu.edu
Wed Aug 22 12:23:37 PDT 2007
Author: brysonda
Date: 2007-08-22 15:23:37 -0400 (Wed, 22 Aug 2007)
New Revision: 1984
Modified:
development/Avida.xcodeproj/project.pbxproj
development/source/script/ASTree.h
development/source/script/AvidaScript.h
development/source/script/cASTDumpVisitor.cc
development/source/script/cLexer.l
development/source/script/cParser.cc
development/source/script/cParser.h
development/source/tools/tAutoRelease.h
development/source/tools/tList.h
Log:
AS: Remove END... block forms. Add elseif.
Modified: development/Avida.xcodeproj/project.pbxproj
===================================================================
--- development/Avida.xcodeproj/project.pbxproj 2007-08-22 15:27:42 UTC (rev 1983)
+++ development/Avida.xcodeproj/project.pbxproj 2007-08-22 19:23:37 UTC (rev 1984)
@@ -210,23 +210,6 @@
};
/* End PBXBuildRule section */
-/* Begin PBXBuildStyle section */
- B5029AA90C6B83D600D10480 /* Development */ = {
- isa = PBXBuildStyle;
- buildSettings = {
- COPY_PHASE_STRIP = NO;
- };
- name = Development;
- };
- B5029AAA0C6B83D600D10480 /* Deployment */ = {
- isa = PBXBuildStyle;
- buildSettings = {
- COPY_PHASE_STRIP = YES;
- };
- name = Deployment;
- };
-/* End PBXBuildStyle section */
-
/* Begin PBXContainerItemProxy section */
56F555DA0C3B36FC00E2E929 /* PBXContainerItemProxy */ = {
isa = PBXContainerItemProxy;
@@ -1782,12 +1765,6 @@
DCC30C4D0762532C008F7A48 /* Project object */ = {
isa = PBXProject;
buildConfigurationList = 702442D70859E0B00059BD9B /* Build configuration list for PBXProject "Avida" */;
- buildSettings = {
- };
- buildStyles = (
- B5029AA90C6B83D600D10480 /* Development */,
- B5029AAA0C6B83D600D10480 /* Deployment */,
- );
hasScannedForEncodings = 0;
mainGroup = DCC30C490762532C008F7A48;
productRefGroup = DCC3164E07626CF3008F7A48 /* Products */;
Modified: development/source/script/ASTree.h
===================================================================
--- development/source/script/ASTree.h 2007-08-22 15:27:42 UTC (rev 1983)
+++ development/source/script/ASTree.h 2007-08-22 19:23:37 UTC (rev 1984)
@@ -168,20 +168,48 @@
class cASTIfBlock : public cASTNode
{
+public:
+ class cElseIf
+ {
+ friend class cASTIfBlock;
+ private:
+ cASTNode* m_expr;
+ cASTNode* m_code;
+
+ cElseIf(cASTNode* expr, cASTNode* code) : m_expr(expr), m_code(code) { ; }
+
+ public:
+ cASTNode* GetCondition() { return m_expr; }
+ cASTNode* GetCode() { return m_code; }
+ };
+
private:
cASTNode* m_expr;
cASTNode* m_code;
cASTNode* m_else;
+ tList<cElseIf> m_elifs;
+
public:
cASTIfBlock(cASTNode* expr, cASTNode* code) : m_expr(expr), m_code(code), m_else(NULL) { ; }
- ~cASTIfBlock() { delete m_expr; delete m_code; delete m_else; }
+ ~cASTIfBlock()
+ {
+ delete m_expr;
+ delete m_code;
+ delete m_else;
+ cElseIf* elif = NULL;
+ while ((elif = m_elifs.Pop())) delete elif;
+ }
+
inline cASTNode* GetCondition() { return m_expr; }
inline cASTNode* GetCode() { return m_code; }
+ inline void AddElseIf(cASTNode* expr, cASTNode* code) { m_elifs.PushRear(new cElseIf(expr, code)); }
+ inline tListIterator<cElseIf> ElseIfIterator() { return tListIterator<cElseIf>(m_elifs); }
inline void SetElseCode(cASTNode* code) { m_else = code; }
inline cASTNode* GetElseCode() { return m_else; }
+ inline bool HasElseIfs() const { return (m_elifs.GetSize()); }
inline bool HasElse() const { return (m_else); }
void Accept(cASTVisitor& visitor);
Modified: development/source/script/AvidaScript.h
===================================================================
--- development/source/script/AvidaScript.h 2007-08-22 15:27:42 UTC (rev 1983)
+++ development/source/script/AvidaScript.h 2007-08-22 19:23:37 UTC (rev 1984)
@@ -79,27 +79,21 @@
AS_TOKEN_CMD_IF, // 41
AS_TOKEN_CMD_ELSE,
- AS_TOKEN_CMD_ENDIF,
+ AS_TOKEN_CMD_ELSEIF,
+ AS_TOKEN_CMD_WHILE,
+ AS_TOKEN_CMD_FOREACH,
+ AS_TOKEN_CMD_FUNCTION,
- AS_TOKEN_CMD_WHILE, // 44
- AS_TOKEN_CMD_ENDWHILE,
+ AS_TOKEN_CMD_RETURN, // 47
- AS_TOKEN_CMD_FOREACH, // 46
- AS_TOKEN_CMD_ENDFOREACH,
+ AS_TOKEN_ID, // 48
- AS_TOKEN_CMD_FUNCTION, // 48
- AS_TOKEN_CMD_ENDFUNCTION,
-
- AS_TOKEN_CMD_RETURN, // 50
-
- AS_TOKEN_ID, // 51
-
- AS_TOKEN_FLOAT, // 52
+ AS_TOKEN_FLOAT, // 49
AS_TOKEN_INT,
AS_TOKEN_STRING,
AS_TOKEN_CHAR,
- AS_TOKEN_UNKNOWN, // 56
+ AS_TOKEN_UNKNOWN, // 53
AS_TOKEN_INVALID
} ASToken_t;
Modified: development/source/script/cASTDumpVisitor.cc
===================================================================
--- development/source/script/cASTDumpVisitor.cc 2007-08-22 15:27:42 UTC (rev 1983)
+++ development/source/script/cASTDumpVisitor.cc 2007-08-22 19:23:37 UTC (rev 1984)
@@ -114,7 +114,7 @@
void cASTDumpVisitor::visitStatementList(cASTStatementList& node)
{
- tListIterator<cASTNode> it(node.Iterator());
+ tListIterator<cASTNode> it = node.Iterator();
cASTNode* stmt = NULL;
while ((stmt = it.Next())) {
@@ -169,6 +169,32 @@
node.GetCode()->Accept(*this);
m_depth--;
+ if (node.HasElseIfs()) {
+ tListIterator<cASTIfBlock::cElseIf> it = node.ElseIfIterator();
+ cASTIfBlock::cElseIf* elif = NULL;
+ while ((elif = it.Next())) {
+ indent();
+ cout << "elseif:" << endl;
+
+ m_depth++;
+ indent();
+ cout << "condition:" << endl;
+
+ m_depth++;
+ elif->GetCondition()->Accept(*this);
+ m_depth--;
+
+ indent();
+ cout << "do:" << endl;
+
+ m_depth++;
+ elif->GetCode()->Accept(*this);
+ m_depth--;
+
+ m_depth--;
+ }
+ }
+
if (node.HasElse()) {
indent();
cout << "else:" << endl;
Modified: development/source/script/cLexer.l
===================================================================
--- development/source/script/cLexer.l 2007-08-22 15:27:42 UTC (rev 1983)
+++ development/source/script/cLexer.l 2007-08-22 19:23:37 UTC (rev 1984)
@@ -93,19 +93,13 @@
string return AS_TOKEN_TYPE_STRING;
void return AS_TOKEN_TYPE_VOID;
-if return AS_TOKEN_CMD_IF; // If Blocks
+if return AS_TOKEN_CMD_IF; // Blocks
else return AS_TOKEN_CMD_ELSE;
-endif return AS_TOKEN_CMD_ENDIF;
+elseif return AS_TOKEN_CMD_ELSEIF;
+while return AS_TOKEN_CMD_WHILE;
+foreach return AS_TOKEN_CMD_FOREACH;
+function return AS_TOKEN_CMD_FUNCTION;
-while return AS_TOKEN_CMD_WHILE; // While Blocks
-endwhile return AS_TOKEN_CMD_ENDWHILE;
-
-foreach return AS_TOKEN_CMD_FOREACH; // Foreach Blocks
-endforeach return AS_TOKEN_CMD_ENDFOREACH;
-
-function return AS_TOKEN_CMD_FUNCTION; // Function Blocks
-endfunction return AS_TOKEN_CMD_ENDFUNCTION;
-
return return AS_TOKEN_CMD_RETURN;
([a-zA-Z]|_+[a-zA-Z])[a-zA-Z0-9_]* return AS_TOKEN_ID; // Identifiers
Modified: development/source/script/cParser.cc
===================================================================
--- development/source/script/cParser.cc 2007-08-22 15:27:42 UTC (rev 1983)
+++ development/source/script/cParser.cc 2007-08-22 19:23:37 UTC (rev 1984)
@@ -159,16 +159,12 @@
loose_block: ARR_OPEN statement_list ARR_CLOSE
- if_block: CMD_IF PREC_OPEN expr PREC_CLOSE lineterm statement_list CMD_ENDIF
- | CMD_IF PREC_OPEN expr PREC_CLOSE lineterm statement_list CMD_ELSE lineterm statement_list CMD_ENDIF
- | CMD_IF PREC_OPEN expr PREC_CLOSE loose_block CMD_ENDIF
- | CMD_IF PREC_OPEN expr PREC_CLOSE loose_block CMD_ELSE loose_block CMD_ENDIF
+ if_block: CMD_IF PREC_OPEN expr PREC_CLOSE loose_block
+ | CMD_IF PREC_OPEN expr PREC_CLOSE loose_block CMD_ELSE loose_block
- while_block: CMD_WHILE PREC_OPEN expr PREC_CLOSE lineterm statement_list CMD_ENDWHILE
- | CMD_WHILE PREC_OPEN expr PREC_CLOSE loose_block
+ while_block: CMD_WHILE PREC_OPEN expr PREC_CLOSE loose_block
- foreach_block: CMD_FOREACH type_def ID PREC_OPEN expr PREC_CLOSE lineterm statement_list CMD_ENDFOREACH
- | CMD_FOREACH type_def ID PREC_OPEN expr PREC_CLOSE loose_block
+ foreach_block: CMD_FOREACH type_def ID PREC_OPEN expr PREC_CLOSE loose_block
var_declare: type_def ID
| type_def ID ASSIGN expr
@@ -183,8 +179,7 @@
|
declare_function: REF CMD_FUNCTION type_any ID PREC_OPEN var_declare_list PREC_CLOSE
- define_function: CMD_FUNCTION type_any ID PREC_OPEN var_declare_list PREC_CLOSE lineterm statement_list CMD_ENDFUNCTION
- | CMD_FUNCTION type_any ID PREC_OPEN var_declare_list PREC_CLOSE loose_block
+ define_function: CMD_FUNCTION type_any ID PREC_OPEN var_declare_list PREC_CLOSE loose_block
return_stmt: CMD_RETURN expr
@@ -375,19 +370,18 @@
return ce;
}
-cASTNode* cParser::parseCodeBlock(bool& loose)
+cASTNode* cParser::parseCodeBlock()
{
PARSE_TRACE("parseCodeBlock");
cASTNode* cb = NULL;
+ // Swallow all newlines and suppress tokens
+ while (currentToken() == TOKEN(ENDL) || currentToken() == TOKEN(SUPPRESS)) nextToken();
+
if (currentToken() == TOKEN(ARR_OPEN)) {
- loose = true;
cb = parseLooseBlock();
- } else if (currentToken() == TOKEN(SUPPRESS) || currentToken() == TOKEN(ENDL)) {
- cb = parseStatementList();
} else {
PARSE_UNEXPECT();
- return cb;
}
return cb;
@@ -719,12 +713,9 @@
}
nextToken(); // consume ')'
- bool loose = false;
- tAutoRelease<cASTNode> code(parseCodeBlock(loose));
- if (!loose && currentToken() != TOKEN(CMD_ENDFOREACH)) PARSE_UNEXPECT();
- if (!loose) nextToken(); // consume 'endforeach'
+ cASTNode* code = parseCodeBlock();
- return new cASTForeachBlock(var.Release(), expr.Release(), code.Release());
+ return new cASTForeachBlock(var.Release(), expr.Release(), code);
}
cASTNode* cParser::parseFunctionDefine()
@@ -732,13 +723,7 @@
PARSE_TRACE("parseFunctionDefine");
cASTFunctionDefinition* fd = parseFunctionHeader(false);
- bool loose = false;
- fd->SetCode(parseCodeBlock(loose));
- if (!loose && currentToken() != TOKEN(CMD_ENDFUNCTION)) {
- PARSE_UNEXPECT();
- return fd;
- }
- if (!loose) nextToken();
+ fd->SetCode(parseCodeBlock());
return fd;
}
@@ -844,27 +829,36 @@
}
nextToken();
- bool loose = false;
- cASTIfBlock* is = new cASTIfBlock(cond.Release(), parseCodeBlock(loose));
+ tAutoRelease<cASTIfBlock> is(new cASTIfBlock(cond.Release(), parseCodeBlock()));
- if (currentToken() == TOKEN(CMD_ELSE)) {
- nextToken(); // consume 'else'
- loose = false;
- tAutoRelease<cASTNode> code(parseCodeBlock(loose));
- if (!loose && currentToken() != TOKEN(CMD_ENDIF)) {
+ while (currentToken() == TOKEN(CMD_ELSEIF)) {
+
+ if (nextToken() != TOKEN(PREC_OPEN)) {
PARSE_UNEXPECT();
- return is;
+ return NULL;
}
- if (!loose) nextToken();
- is->SetElseCode(code.Release());
- } else if (!loose && currentToken() != TOKEN(CMD_ENDIF)) {
- PARSE_UNEXPECT();
- return is;
- } else if (!loose) {
- nextToken(); // consume 'endif'
+
+ nextToken(); // consume '('
+ tAutoRelease<cASTNode> elifcond(parseExpression());
+
+ if (currentToken() != TOKEN(PREC_CLOSE)) {
+ PARSE_UNEXPECT();
+ return NULL;
+ }
+ nextToken(); // consume ')'
+
+ cASTNode* elifcode = parseCodeBlock();
+
+ (*is).AddElseIf(elifcond.Release(), elifcode);
}
- return is;
+ if (currentToken() == TOKEN(CMD_ELSE)) {
+ nextToken(); // consume 'else'
+ cASTNode* code = parseCodeBlock();
+ (*is).SetElseCode(code);
+ }
+
+ return is.Release();
}
cASTNode* cParser::parseIndexExpression()
@@ -1083,15 +1077,9 @@
}
nextToken();
- bool loose = false;
- tAutoRelease<cASTNode> code(parseCodeBlock(loose));
- if (!loose && currentToken() != TOKEN(CMD_ENDWHILE)) {
- PARSE_UNEXPECT();
- return NULL;
- }
- if (!loose) nextToken();
+ cASTNode* code = parseCodeBlock();
- return new cASTWhileBlock(cond.Release(), code.Release());
+ return new cASTWhileBlock(cond.Release(), code);
}
Modified: development/source/script/cParser.h
===================================================================
--- development/source/script/cParser.h 2007-08-22 15:27:42 UTC (rev 1983)
+++ development/source/script/cParser.h 2007-08-22 19:23:37 UTC (rev 1984)
@@ -83,7 +83,7 @@
private:
- inline ASToken_t currentToken() { return m_cur_tok; }
+ inline ASToken_t currentToken() const { return m_cur_tok; }
ASToken_t nextToken();
ASToken_t peekToken();
@@ -93,7 +93,7 @@
cASTNode* parseArrayUnpack();
cASTNode* parseAssignment();
cASTNode* parseCallExpression();
- cASTNode* parseCodeBlock(bool& loose);
+ cASTNode* parseCodeBlock();
cASTNode* parseExpression();
cASTNode* parseExprP0();
cASTNode* parseExprP1();
Modified: development/source/tools/tAutoRelease.h
===================================================================
--- development/source/tools/tAutoRelease.h 2007-08-22 15:27:42 UTC (rev 1983)
+++ development/source/tools/tAutoRelease.h 2007-08-22 19:23:37 UTC (rev 1984)
@@ -43,6 +43,9 @@
inline void Set(T* value) { delete m_value; m_value = value; }
inline tAutoRelease<T>& operator=(T* value) { delete m_value; m_value = value; return *this; }
+ //! Access the contents
+ inline T& operator*() { return *m_value; }
+
//! Take control of the contents
inline T* Release() { T* value = m_value; m_value = NULL; return value; }
};
Modified: development/source/tools/tList.h
===================================================================
--- development/source/tools/tList.h 2007-08-22 15:27:42 UTC (rev 1983)
+++ development/source/tools/tList.h 2007-08-22 19:23:37 UTC (rev 1984)
@@ -92,9 +92,9 @@
const tList<T> & GetConstList() { return list; }
const tListNode<T> * GetConstNode() { return node; }
public:
- explicit tListIterator(tList<T> & _list);
- explicit tListIterator(tList<T> & _list, tListNode<T> * start_node);
- explicit tListIterator(tListIterator<T>& _tli);
+ explicit tListIterator(tList<T>& _list);
+ explicit tListIterator(tList<T>& _list, tListNode<T>* start_node);
+ tListIterator(const tListIterator<T>& _tli);
~tListIterator();
void Set(tListNode<T> * in_node) { node = in_node; }
@@ -562,7 +562,7 @@
list.AddIterator(this);
}
-template <class T> tListIterator<T>::tListIterator(tListIterator<T>& _tli)
+template <class T> tListIterator<T>::tListIterator(const tListIterator<T>& _tli)
: tBaseIterator<T>(), list(_tli.list), node(_tli.node)
{
list.AddIterator(this);
More information about the Avida-cvs
mailing list