[Avida-SVN] r1814 - development/source/script
brysonda at myxo.css.msu.edu
brysonda at myxo.css.msu.edu
Tue Jul 17 10:56:48 PDT 2007
Author: brysonda
Date: 2007-07-17 13:56:48 -0400 (Tue, 17 Jul 2007)
New Revision: 1814
Modified:
development/source/script/ASTree.h
development/source/script/cASTDumpVisitor.cc
development/source/script/cParser.cc
development/source/script/cParser.h
Log:
AS: Function-Definition and -Declaration nodes.
Modified: development/source/script/ASTree.h
===================================================================
--- development/source/script/ASTree.h 2007-07-17 16:30:18 UTC (rev 1813)
+++ development/source/script/ASTree.h 2007-07-17 17:56:48 UTC (rev 1814)
@@ -167,10 +167,24 @@
class cASTFunctionDefinition : public cASTNode
{
private:
+ ASType_t m_type;
+ cString m_name;
+ cASTNode* m_args;
+ cASTNode* m_code;
public:
- cASTFunctionDefinition() { ; }
+ cASTFunctionDefinition(ASType_t type, const cString& name, cASTNode* 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 void SetCode(cASTNode* code) { m_code = code; }
+ inline cASTNode* GetCode() { return m_code; }
+
+ inline bool IsDefinition() { return (m_code); }
+
void Accept(cASTVisitor& visitor);
};
@@ -292,7 +306,7 @@
cString m_name;
public:
- cASTVariableReference(const char* name) : m_name(name) { ; }
+ cASTVariableReference(const cString& name) : m_name(name) { ; }
inline const cString& GetName() { return m_name; }
Modified: development/source/script/cASTDumpVisitor.cc
===================================================================
--- development/source/script/cASTDumpVisitor.cc 2007-07-17 16:30:18 UTC (rev 1813)
+++ development/source/script/cASTDumpVisitor.cc 2007-07-17 17:56:48 UTC (rev 1814)
@@ -144,7 +144,15 @@
void cASTDumpVisitor::visitFunctionDefinition(cASTFunctionDefinition& node)
{
+ indent();
+ cout << (node.IsDefinition() ? "":"@") << "function: " << mapType(node.GetType()) << " " << node.GetName() << "(";
+ cout << ")" << endl;
+ if (node.IsDefinition()) {
+ m_depth++;
+ node.GetCode()->Accept(*this);
+ m_depth--;
+ }
}
Modified: development/source/script/cParser.cc
===================================================================
--- development/source/script/cParser.cc 2007-07-17 16:30:18 UTC (rev 1813)
+++ development/source/script/cParser.cc 2007-07-17 17:56:48 UTC (rev 1814)
@@ -219,7 +219,7 @@
m_tree = parseStatementList();
if (!m_eof) PARSE_UNEXPECT();
- //if (!m_tree) PARSE_ERROR(EMPTY); @todo - statement list doesn't actually return anything yet
+ if (!m_tree) PARSE_ERROR(EMPTY);
delete m_lexer;
m_lexer = NULL;
@@ -377,7 +377,6 @@
PARSE_TRACE("parseCodeBlock");
cASTNode* cb = NULL;
- nextToken();
if (currentToken() == TOKEN(ARR_OPEN)) {
loose = true;
cb = parseLooseBlock();
@@ -717,69 +716,74 @@
cASTNode* cParser::parseFunctionDefine()
{
PARSE_TRACE("parseFunctionDefine");
- cASTNode* fd = parseFunctionHeader(false);
+ cASTFunctionDefinition* fd = parseFunctionHeader(false);
bool loose = false;
- parseCodeBlock(loose);
+ fd->SetCode(parseCodeBlock(loose));
if (!loose && currentToken() != TOKEN(CMD_ENDFUNCTION)) {
PARSE_UNEXPECT();
return fd;
}
-
+
+ nextToken();
return fd;
}
-cASTNode* cParser::parseFunctionHeader(bool declare)
+cASTFunctionDefinition* cParser::parseFunctionHeader(bool declare)
{
PARSE_TRACE("parseFunctionHeader");
- cASTNode* fd = NULL;
+ ASType_t type = AS_TYPE_INVALID;
switch (nextToken()) {
- case TOKEN(TYPE_ARRAY):
- case TOKEN(TYPE_CHAR):
- case TOKEN(TYPE_FLOAT):
- case TOKEN(TYPE_INT):
- case TOKEN(TYPE_MATRIX):
- case TOKEN(TYPE_STRING):
- case TOKEN(TYPE_VOID):
- break;
+ case TOKEN(TYPE_ARRAY): type = AS_TYPE_ARRAY; break;
+ case TOKEN(TYPE_CHAR): type = AS_TYPE_CHAR; break;
+ case TOKEN(TYPE_FLOAT): type = AS_TYPE_FLOAT; break;
+ case TOKEN(TYPE_INT): type = AS_TYPE_INT; break;
+ case TOKEN(TYPE_MATRIX): type = AS_TYPE_MATRIX; break;
+ 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 fd;
+ return NULL;
}
+ type = AS_TYPE_OBJECT_REF;
break;
default:
PARSE_UNEXPECT();
- return fd;
+ return NULL;
}
if (nextToken() != TOKEN(ID)) {
PARSE_UNEXPECT();
- return fd;
+ return NULL;
}
+ cString name(currentText());
if (nextToken() != TOKEN(PREC_OPEN)) {
PARSE_UNEXPECT();
- return fd;
+ return NULL;
}
+ cASTNode* args = NULL;
if (nextToken() != TOKEN(PREC_CLOSE)) {
if (declare) {
- parseVarDeclareList();
+ args = parseVarDeclareList();
} else {
- parseArgumentList();
+ args = parseArgumentList();
}
}
if (currentToken() != TOKEN(PREC_CLOSE)) {
PARSE_UNEXPECT();
- return fd;
+ return NULL;
}
- return fd;
+ nextToken();
+
+ return new cASTFunctionDefinition(type, name, args);
}
cASTNode* cParser::parseIDStatement()
@@ -874,10 +878,10 @@
switch (nextToken()) {
case TOKEN(ARR_OPEN):
- parseArrayUnpack();
+ rs = parseArrayUnpack();
break;
case TOKEN(CMD_FUNCTION):
- parseFunctionHeader();
+ rs = parseFunctionHeader();
break;
default:
PARSE_UNEXPECT();
@@ -1085,6 +1089,8 @@
void cParser::reportError(ASParseError_t err, const int line)
{
+#define ERR_ENDL " (cParser.cc:" << line << ")" << std::endl
+
m_success = false;
std::cerr << m_filename << ":";
@@ -1097,21 +1103,21 @@
switch (err) {
case AS_PARSE_ERR_UNEXPECTED_TOKEN:
- std::cerr << "unexpected token '" << currentText() << "'." << std::endl;
+ std::cerr << "unexpected token '" << currentText() << "'" << ERR_ENDL;
break;
case AS_PARSE_ERR_UNTERMINATED_EXPR:
- std::cerr << "unterminated expression." << std::endl;
+ std::cerr << "unterminated expression" << ERR_ENDL;
break;
case AS_PARSE_ERR_NULL_EXPR:
- std::cerr << "expected expression, found '" << currentText() << "'." << std::endl;
+ std::cerr << "expected expression, found '" << currentText() << "'" << ERR_ENDL;
case AS_PARSE_ERR_EOF:
if (!m_err_eof) {
- std::cerr << "unexpected end of file" << std::endl;
+ std::cerr << "unexpected end of file" << ERR_ENDL;
m_err_eof = true;
}
break;
case AS_PARSE_ERR_EMPTY:
- std::cerr << "empty script, no valid statements found" << std::endl;
+ std::cerr << "empty script, no valid statements found" << ERR_ENDL;
break;
case AS_PARSE_ERR_INTERNAL:
std::cerr << "internal parser error at cParser.cc:" << line << std::endl;
@@ -1119,6 +1125,8 @@
default:
std::cerr << "parse error" << std::endl;
}
+
+#undef ERR_ENDL
}
#undef PARSE_DEBUG()
Modified: development/source/script/cParser.h
===================================================================
--- development/source/script/cParser.h 2007-07-17 16:30:18 UTC (rev 1813)
+++ development/source/script/cParser.h 2007-07-17 17:56:48 UTC (rev 1814)
@@ -105,7 +105,7 @@
cASTNode* parseExprP6_Index(cASTNode* l);
cASTNode* parseForeachStatement();
cASTNode* parseFunctionDefine();
- cASTNode* parseFunctionHeader(bool declare = true);
+ cASTFunctionDefinition* parseFunctionHeader(bool declare = true);
cASTNode* parseIDStatement();
cASTNode* parseIfStatement();
cASTNode* parseIndexExpression();
More information about the Avida-cvs
mailing list