[Avida-SVN] r2453 - development/source/script
brysonda at myxo.css.msu.edu
brysonda at myxo.css.msu.edu
Tue Mar 11 19:49:50 PDT 2008
Author: brysonda
Date: 2008-03-11 22:49:50 -0400 (Tue, 11 Mar 2008)
New Revision: 2453
Modified:
development/source/script/ASTree.cc
development/source/script/ASTree.h
development/source/script/AvidaScript.cc
development/source/script/AvidaScript.h
development/source/script/cASTVisitor.h
development/source/script/cDirectInterpretASTVisitor.cc
development/source/script/cDirectInterpretASTVisitor.h
development/source/script/cDumpASTVisitor.cc
development/source/script/cDumpASTVisitor.h
development/source/script/cLexer.l
development/source/script/cParser.cc
development/source/script/cSemanticASTVisitor.cc
development/source/script/cSemanticASTVisitor.h
Log:
AS:
Add support for a variety of builtin functions (explicit casting, array/str length, and resize)
Adjust string literals to exclude the token's quotes from the actual value.
Modified: development/source/script/ASTree.cc
===================================================================
--- development/source/script/ASTree.cc 2008-03-11 19:33:46 UTC (rev 2452)
+++ development/source/script/ASTree.cc 2008-03-12 02:49:50 UTC (rev 2453)
@@ -46,6 +46,7 @@
void cASTExpressionBinary::Accept(cASTVisitor& visitor) { visitor.VisitExpressionBinary(*this); }
void cASTExpressionUnary::Accept(cASTVisitor& visitor) { visitor.VisitExpressionUnary(*this); }
+void cASTBuiltInCall::Accept(cASTVisitor& visitor) { visitor.VisitBuiltInCall(*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); }
@@ -67,3 +68,28 @@
delete m_args;
delete m_code;
}
+
+
+cASTBuiltInCall::cASTBuiltInCall(const cASFilePosition& fp, const cString& name)
+ : cASTNode(fp), m_args(NULL), m_type(AS_TYPE_INVALID), m_builtin(AS_BUILTIN_UNKNOWN), m_vr(NULL)
+{
+ if (name == "asbool") m_builtin = AS_BUILTIN_CAST_BOOL;
+ else if (name == "aschar") m_builtin = AS_BUILTIN_CAST_CHAR;
+ else if (name == "asint") m_builtin = AS_BUILTIN_CAST_INT;
+ else if (name == "asfloat") m_builtin = AS_BUILTIN_CAST_FLOAT;
+ else if (name == "asstring") m_builtin = AS_BUILTIN_CAST_STRING;
+ else if (name == "len") m_builtin = AS_BUILTIN_LEN;
+ else if (name == "resize") m_builtin = AS_BUILTIN_RESIZE;
+}
+
+cASTBuiltInCall::~cASTBuiltInCall()
+{
+ delete m_args;
+ delete m_vr;
+}
+
+void cASTBuiltInCall::SetVariableReference(cASTVariableReference* vr)
+{
+ delete m_vr;
+ m_vr = vr;
+}
Modified: development/source/script/ASTree.h
===================================================================
--- development/source/script/ASTree.h 2008-03-11 19:33:46 UTC (rev 2452)
+++ development/source/script/ASTree.h 2008-03-12 02:49:50 UTC (rev 2453)
@@ -111,6 +111,7 @@
class cASTExpressionBinary;
class cASTExpressionUnary;
+class cASTBuiltInCall;
class cASTFunctionCall;
class cASTLiteral;
class cASTLiteralArray;
@@ -449,6 +450,35 @@
// -------- Expression Value Nodes --------
+class cASTBuiltInCall : public cASTNode
+{
+private:
+ cASTArgumentList* m_args;
+ ASType_t m_type;
+ ASBuiltIn_t m_builtin;
+ cASTVariableReference* m_vr;
+
+public:
+ cASTBuiltInCall(const cASFilePosition& fp, const cString& name);
+ ~cASTBuiltInCall();
+
+ ASBuiltIn_t GetBuiltIn() const { return m_builtin; }
+
+ void SetArguments(cASTArgumentList* args) { delete m_args; m_args = args; }
+ cASTArgumentList* GetArguments() { return m_args; }
+
+ ASType_t GetType() const { return m_type; }
+ inline void SetType(ASType_t type) { m_type = type; }
+
+ cASTVariableReference* GetVariableReference() { return m_vr; }
+ void SetVariableReference(cASTVariableReference* vr);
+
+ bool HasArguments() const { return (m_args); }
+
+ void Accept(cASTVisitor& visitor);
+};
+
+
class cASTFunctionCall : public cASTNode
{
private:
Modified: development/source/script/AvidaScript.cc
===================================================================
--- development/source/script/AvidaScript.cc 2008-03-11 19:33:46 UTC (rev 2452)
+++ development/source/script/AvidaScript.cc 2008-03-12 02:49:50 UTC (rev 2453)
@@ -25,6 +25,20 @@
#include "AvidaScript.h"
+const char* AvidaScript::mapBuiltIn(ASBuiltIn_t builtin)
+{
+ switch (builtin) {
+ case AS_BUILTIN_CAST_BOOL: return "asbool";
+ case AS_BUILTIN_CAST_CHAR: return "aschar";
+ case AS_BUILTIN_CAST_INT: return "asint";
+ case AS_BUILTIN_CAST_FLOAT: return "asfloat";
+ case AS_BUILTIN_CAST_STRING: return "asstring";
+ case AS_BUILTIN_LEN: return "len";
+ case AS_BUILTIN_RESIZE: return "resize";
+ default: return "?";
+ }
+}
+
const char* AvidaScript::mapToken(ASToken_t token)
{
switch (token) {
Modified: development/source/script/AvidaScript.h
===================================================================
--- development/source/script/AvidaScript.h 2008-03-11 19:33:46 UTC (rev 2452)
+++ development/source/script/AvidaScript.h 2008-03-12 02:49:50 UTC (rev 2453)
@@ -87,15 +87,18 @@
AS_TOKEN_CMD_RETURN, // 48
- AS_TOKEN_ID, // 49
+ AS_TOKEN_BUILTIN_CALL, // 49
+ AS_TOKEN_BUILTIN_METHOD,
- AS_TOKEN_FLOAT, // 50
+ AS_TOKEN_ID, // 51
+
+ AS_TOKEN_FLOAT, // 52
AS_TOKEN_INT,
AS_TOKEN_STRING,
AS_TOKEN_CHAR,
AS_TOKEN_BOOL,
- AS_TOKEN_UNKNOWN, // 54
+ AS_TOKEN_UNKNOWN, // 56
AS_TOKEN_INVALID
} ASToken_t;
@@ -121,6 +124,7 @@
AS_SEMANTIC_ERR_ARGUMENT_DEFAULT_REQUIRED,
AS_SEMANTIC_ERR_ARGUMENT_MISSING_REQUIRED,
+ AS_SEMANTIC_ERR_BUILTIN_CALL_SIGNATURE_MISMATCH,
AS_SEMANTIC_ERR_CANNOT_CAST,
AS_SEMANTIC_ERR_CANNOT_COMPARE,
AS_SEMANTIC_ERR_FUNCTION_CALL_SIGNATURE_MISMATCH,
@@ -157,9 +161,21 @@
AS_DIRECT_INTERPRET_ERR_UNKNOWN
} ASDirectInterpretError_t;
+typedef enum eASBuiltInFunction {
+ AS_BUILTIN_CAST_BOOL,
+ AS_BUILTIN_CAST_CHAR,
+ AS_BUILTIN_CAST_INT,
+ AS_BUILTIN_CAST_FLOAT,
+ AS_BUILTIN_CAST_STRING,
+ AS_BUILTIN_LEN,
+ AS_BUILTIN_RESIZE,
+
+ AS_BUILTIN_UNKNOWN
+} ASBuiltIn_t;
+
enum eASExitCodes {
AS_EXIT_OK = 0,
- AS_EXIT_FILE_NOT_FOUND = 100,
+ AS_EXIT_FILE_NOT_FOUND = 200,
AS_EXIT_FAIL_PARSE,
AS_EXIT_FAIL_SEMANTIC,
AS_EXIT_FAIL_INTERPRET,
@@ -186,7 +202,8 @@
namespace AvidaScript {
- const char* mapToken(ASToken_t type);
+ const char* mapBuiltIn(ASBuiltIn_t builtin);
+ const char* mapToken(ASToken_t token);
const char* mapType(ASType_t type);
};
Modified: development/source/script/cASTVisitor.h
===================================================================
--- development/source/script/cASTVisitor.h 2008-03-11 19:33:46 UTC (rev 2452)
+++ development/source/script/cASTVisitor.h 2008-03-12 02:49:50 UTC (rev 2453)
@@ -53,6 +53,7 @@
virtual void VisitExpressionBinary(cASTExpressionBinary&) = 0;
virtual void VisitExpressionUnary(cASTExpressionUnary&) = 0;
+ virtual void VisitBuiltInCall(cASTBuiltInCall&) = 0;
virtual void VisitFunctionCall(cASTFunctionCall&) = 0;
virtual void VisitLiteral(cASTLiteral&) = 0;
virtual void VisitLiteralArray(cASTLiteralArray&) = 0;
Modified: development/source/script/cDirectInterpretASTVisitor.cc
===================================================================
--- development/source/script/cDirectInterpretASTVisitor.cc 2008-03-11 19:33:46 UTC (rev 2452)
+++ development/source/script/cDirectInterpretASTVisitor.cc 2008-03-12 02:49:50 UTC (rev 2453)
@@ -729,6 +729,82 @@
}
+void cDirectInterpretASTVisitor::VisitBuiltInCall(cASTBuiltInCall& node)
+{
+ cASTArgumentList* args = node.GetArguments();
+
+ switch (node.GetBuiltIn()) {
+ case AS_BUILTIN_CAST_BOOL:
+ args->Iterator().Next()->Accept(*this);
+ m_rvalue.as_bool = asBool(m_rtype, m_rvalue, node);
+ m_rtype = TYPE(BOOL);
+ break;
+
+ case AS_BUILTIN_CAST_CHAR:
+ args->Iterator().Next()->Accept(*this);
+ m_rvalue.as_char = asChar(m_rtype, m_rvalue, node);
+ m_rtype = TYPE(CHAR);
+ break;
+
+ case AS_BUILTIN_CAST_INT:
+ args->Iterator().Next()->Accept(*this);
+ m_rvalue.as_int = asInt(m_rtype, m_rvalue, node);
+ m_rtype = TYPE(INT);
+ break;
+
+ case AS_BUILTIN_CAST_FLOAT:
+ args->Iterator().Next()->Accept(*this);
+ m_rvalue.as_float = asFloat(m_rtype, m_rvalue, node);
+ m_rtype = TYPE(FLOAT);
+ break;
+
+ case AS_BUILTIN_CAST_STRING:
+ args->Iterator().Next()->Accept(*this);
+ m_rvalue.as_string = asString(m_rtype, m_rvalue, node);
+ m_rtype = TYPE(STRING);
+ break;
+
+ case AS_BUILTIN_LEN:
+ args->Iterator().Next()->Accept(*this);
+ if (m_rtype == TYPE(STRING)) {
+ int sz = m_rvalue.as_string->GetSize();
+ delete m_rvalue.as_string;
+ m_rvalue.as_int = sz;
+ } else {
+ cLocalArray* arr = asArray(m_rtype, m_rvalue, node);
+ m_rvalue.as_int = arr->GetSize();
+ arr->RemoveReference();
+ }
+ m_rtype = TYPE(INT);
+ break;
+
+ case AS_BUILTIN_RESIZE:
+ cASTVariableReference* vr = node.GetVariableReference();
+ if (vr->GetType() == TYPE(ARRAY)) {
+ int var_idx = (vr->IsVarGlobal() ? 0 : m_sp) + vr->GetVarID();
+
+ args->Iterator().Next()->Accept(*this);
+ int sz = asInt(m_rtype, m_rvalue, node);
+
+ cLocalArray* arr = m_call_stack[var_idx].as_array;
+ if (arr->IsShared()) {
+ arr = new cLocalArray(arr);
+ m_call_stack[var_idx].as_array->RemoveReference();
+ m_call_stack[var_idx].as_array = arr;
+ }
+ m_call_stack[var_idx].as_array->Resize(sz);
+ } else {
+ // @TODO - resize matrix
+ }
+ break;
+
+ default:
+ INTERPRET_ERROR(INTERNAL);
+ break;
+ }
+}
+
+
void cDirectInterpretASTVisitor::VisitFunctionCall(cASTFunctionCall& node)
{
// Save previous scope information
Modified: development/source/script/cDirectInterpretASTVisitor.h
===================================================================
--- development/source/script/cDirectInterpretASTVisitor.h 2008-03-11 19:33:46 UTC (rev 2452)
+++ development/source/script/cDirectInterpretASTVisitor.h 2008-03-12 02:49:50 UTC (rev 2453)
@@ -94,6 +94,7 @@
void VisitExpressionBinary(cASTExpressionBinary&);
void VisitExpressionUnary(cASTExpressionUnary&);
+ void VisitBuiltInCall(cASTBuiltInCall&);
void VisitFunctionCall(cASTFunctionCall&);
void VisitLiteral(cASTLiteral&);
void VisitLiteralArray(cASTLiteralArray&);
Modified: development/source/script/cDumpASTVisitor.cc
===================================================================
--- development/source/script/cDumpASTVisitor.cc 2008-03-11 19:33:46 UTC (rev 2452)
+++ development/source/script/cDumpASTVisitor.cc 2008-03-12 02:49:50 UTC (rev 2453)
@@ -310,6 +310,33 @@
}
+void cDumpASTVisitor::VisitBuiltInCall(cASTBuiltInCall& node)
+{
+ indent();
+ cout << "builtin:" << endl;
+ m_depth++;
+
+ indent();
+ cout << "method:" << endl;
+
+ m_depth++;
+ indent();
+ cout << mapBuiltIn(node.GetBuiltIn()) << endl;
+ m_depth--;
+
+ if (node.HasArguments()) {
+ indent();
+ cout << "with:" << endl;
+
+ m_depth++;
+ node.GetArguments()->Accept(*this);
+ m_depth--;
+ }
+
+ m_depth--;
+}
+
+
void cDumpASTVisitor::VisitFunctionCall(cASTFunctionCall& node)
{
indent();
Modified: development/source/script/cDumpASTVisitor.h
===================================================================
--- development/source/script/cDumpASTVisitor.h 2008-03-11 19:33:46 UTC (rev 2452)
+++ development/source/script/cDumpASTVisitor.h 2008-03-12 02:49:50 UTC (rev 2453)
@@ -54,6 +54,7 @@
void VisitExpressionBinary(cASTExpressionBinary&);
void VisitExpressionUnary(cASTExpressionUnary&);
+ void VisitBuiltInCall(cASTBuiltInCall&);
void VisitFunctionCall(cASTFunctionCall&);
void VisitLiteral(cASTLiteral&);
void VisitLiteralArray(cASTLiteralArray&);
Modified: development/source/script/cLexer.l
===================================================================
--- development/source/script/cLexer.l 2008-03-11 19:33:46 UTC (rev 2452)
+++ development/source/script/cLexer.l 2008-03-12 02:49:50 UTC (rev 2453)
@@ -101,11 +101,21 @@
foreach return AS_TOKEN_CMD_FOREACH;
function return AS_TOKEN_CMD_FUNCTION;
+asbool return AS_TOKEN_BUILTIN_CALL;
+aschar return AS_TOKEN_BUILTIN_CALL;
+asint return AS_TOKEN_BUILTIN_CALL;
+asfloat return AS_TOKEN_BUILTIN_CALL;
+asstring return AS_TOKEN_BUILTIN_CALL;
+len return AS_TOKEN_BUILTIN_CALL;
+resize return AS_TOKEN_BUILTIN_METHOD;
+
return return AS_TOKEN_CMD_RETURN;
true return AS_TOKEN_BOOL;
false return AS_TOKEN_BOOL;
+
+
([a-zA-Z]|_+[a-zA-Z])[a-zA-Z0-9_]* return AS_TOKEN_ID; // Identifiers
[0-9]*\.[0-9]+([eE][-+]?[0-9]+)? return AS_TOKEN_FLOAT; // Literal Values
Modified: development/source/script/cParser.cc
===================================================================
--- development/source/script/cParser.cc 2008-03-11 19:33:46 UTC (rev 2452)
+++ development/source/script/cParser.cc 2008-03-12 02:49:50 UTC (rev 2453)
@@ -599,7 +599,7 @@
expr.Set(new cASTLiteral(FILEPOS, AS_TYPE_BOOL, currentText()));
break;
case TOKEN(STRING):
- expr.Set(new cASTLiteral(FILEPOS, AS_TYPE_STRING, currentText()));
+ expr.Set(new cASTLiteral(FILEPOS, AS_TYPE_STRING, currentText().Substring(1, currentText().GetSize() - 2)));
break;
case TOKEN(ID):
if (peekToken() == TOKEN(PREC_OPEN)) {
@@ -612,6 +612,17 @@
expr = new cASTVariableReference(FILEPOS, currentText());
}
break;
+ case TOKEN(BUILTIN_CALL):
+ if (peekToken() == TOKEN(PREC_OPEN)) {
+ cASTBuiltInCall* bi = new cASTBuiltInCall(FILEPOS, currentText());
+ expr.Set(bi);
+ nextToken(); // consume builtin methon name token
+ if (nextToken() != TOKEN(PREC_CLOSE)) bi->SetArguments(parseArgumentList());
+ if (currentToken() != TOKEN(PREC_CLOSE)) PARSE_UNEXPECT();
+ } else {
+ PARSE_UNEXPECT();
+ }
+ break;
case TOKEN(PREC_OPEN):
nextToken(); // consume '('
expr.Set(parseExpression());
@@ -900,6 +911,27 @@
case TOKEN(ID):
node.Set(parseIDStatement());
break;
+ case TOKEN(BUILTIN_METHOD):
+ if (peekToken() == TOKEN(PREC_OPEN)) {
+ cASTBuiltInCall* bi = new cASTBuiltInCall(FILEPOS, currentText());
+ nextToken(); // consume builtin method name token
+ if (nextToken() != TOKEN(PREC_CLOSE) && currentToken() == TOKEN(ID)) {
+ bi->SetVariableReference(new cASTVariableReference(FILEPOS, currentText()));
+ if (nextToken() == TOKEN(COMMA)) {
+ nextToken(); // consume ','
+ bi->SetArguments(parseArgumentList());
+ }
+ }
+ if (currentToken() != TOKEN(PREC_CLOSE)) PARSE_UNEXPECT();
+ nextToken(); // consume ')'
+
+ if (currentToken() == TOKEN(DOT) || currentToken() == TOKEN(IDX_OPEN)) {
+ node.Set(parseCallExpression(bi, true));
+ } else {
+ node.Set(bi);
+ }
+ }
+ break;
case TOKEN(REF):
node.Set(parseRefStatement());
break;
Modified: development/source/script/cSemanticASTVisitor.cc
===================================================================
--- development/source/script/cSemanticASTVisitor.cc 2008-03-11 19:33:46 UTC (rev 2452)
+++ development/source/script/cSemanticASTVisitor.cc 2008-03-12 02:49:50 UTC (rev 2453)
@@ -509,7 +509,114 @@
}
}
+void cSemanticASTVisitor::VisitBuiltInCall(cASTBuiltInCall& node)
+{
+#define ERR_BUILTIN_MISMATCH SEMANTIC_ERROR(BUILTIN_CALL_SIGNATURE_MISMATCH, mapBuiltIn(node.GetBuiltIn()))
+ cASTArgumentList* args = node.GetArguments();
+
+ switch (node.GetBuiltIn()) {
+ case AS_BUILTIN_CAST_BOOL:
+ if (!args || args->GetSize() != 1) ERR_BUILTIN_MISMATCH;
+ else {
+ cASTNode* argn = args->Iterator().Next();
+ argn->Accept(*this);
+ checkCast(argn->GetType(), TYPE(BOOL));
+ node.SetType(TYPE(BOOL));
+ }
+ break;
+ case AS_BUILTIN_CAST_CHAR:
+ if (!args || args->GetSize() != 1) ERR_BUILTIN_MISMATCH;
+ else {
+ cASTNode* argn = args->Iterator().Next();
+ argn->Accept(*this);
+ checkCast(argn->GetType(), TYPE(CHAR));
+ node.SetType(TYPE(CHAR));
+ }
+ break;
+
+ case AS_BUILTIN_CAST_INT:
+ if (!args || args->GetSize() != 1) ERR_BUILTIN_MISMATCH;
+ else {
+ cASTNode* argn = args->Iterator().Next();
+ argn->Accept(*this);
+ checkCast(argn->GetType(), TYPE(INT));
+ node.SetType(TYPE(INT));
+ }
+ break;
+
+ case AS_BUILTIN_CAST_FLOAT:
+ if (!args || args->GetSize() != 1) ERR_BUILTIN_MISMATCH;
+ else {
+ cASTNode* argn = args->Iterator().Next();
+ argn->Accept(*this);
+ checkCast(argn->GetType(), TYPE(FLOAT));
+ node.SetType(TYPE(FLOAT));
+ }
+ break;
+
+ case AS_BUILTIN_CAST_STRING:
+ if (!args || args->GetSize() != 1) ERR_BUILTIN_MISMATCH;
+ else {
+ cASTNode* argn = args->Iterator().Next();
+ argn->Accept(*this);
+ checkCast(argn->GetType(), TYPE(STRING));
+ node.SetType(TYPE(STRING));
+ }
+ break;
+
+ case AS_BUILTIN_LEN:
+ if (!args || args->GetSize() != 1) ERR_BUILTIN_MISMATCH;
+ else {
+ cASTNode* argn = args->Iterator().Next();
+ argn->Accept(*this);
+ checkCast(argn->GetType(), TYPE(ARRAY));
+ node.SetType(TYPE(INT));
+ }
+ break;
+
+ case AS_BUILTIN_RESIZE:
+ if (!node.GetVariableReference() || !args) ERR_BUILTIN_MISMATCH;
+ else {
+ node.GetVariableReference()->Accept(*this);
+
+ if (node.GetVariableReference()->GetType() == TYPE(ARRAY)) {
+ if (args->GetSize() == 1) {
+ cASTNode* argn = args->Iterator().Next();
+ argn->Accept(*this);
+ checkCast(argn->GetType(), TYPE(INT));
+ } else {
+ ERR_BUILTIN_MISMATCH;
+ }
+ } else if (node.GetVariableReference()->GetType() == TYPE(MATRIX)) {
+ if (args->GetSize() == 2) {
+ tListIterator<cASTNode> it = args->Iterator();
+ cASTNode* argn = it.Next();
+ argn->Accept(*this);
+ checkCast(argn->GetType(), TYPE(INT));
+ argn = it.Next();
+ argn->Accept(*this);
+ checkCast(argn->GetType(), TYPE(INT));
+ } else {
+ ERR_BUILTIN_MISMATCH;
+ }
+ } else {
+ ERR_BUILTIN_MISMATCH;
+ }
+
+ node.SetType(TYPE(VOID));
+ }
+ break;
+
+ default:
+ SEMANTIC_ERROR(INTERNAL);
+ break;
+ }
+
+#undef ERR_BUILTIN_MISMATCH
+}
+
+
void cSemanticASTVisitor::VisitFunctionCall(cASTFunctionCall& node)
{
if (m_fun_def_arg) {
@@ -839,6 +946,9 @@
case AS_SEMANTIC_ERR_ARGUMENT_MISSING_REQUIRED:
std::cerr << "required argument " << VA_ARG_STR << " not found" << ERR_ENDL;
break;
+ case AS_SEMANTIC_ERR_BUILTIN_CALL_SIGNATURE_MISMATCH:
+ std::cerr << "invalid invocation of builtin method '" << VA_ARG_STR << "()'" << ERR_ENDL;
+ break;
case AS_SEMANTIC_ERR_CANNOT_CAST:
{
const char* type1 = VA_ARG_STR;
Modified: development/source/script/cSemanticASTVisitor.h
===================================================================
--- development/source/script/cSemanticASTVisitor.h 2008-03-11 19:33:46 UTC (rev 2452)
+++ development/source/script/cSemanticASTVisitor.h 2008-03-12 02:49:50 UTC (rev 2453)
@@ -96,6 +96,7 @@
void VisitExpressionBinary(cASTExpressionBinary&);
void VisitExpressionUnary(cASTExpressionUnary&);
+ void VisitBuiltInCall(cASTBuiltInCall&);
void VisitFunctionCall(cASTFunctionCall&);
void VisitLiteral(cASTLiteral&);
void VisitLiteralArray(cASTLiteralArray&);
More information about the Avida-cvs
mailing list