[Avida-SVN] r2447 - development/source/script
brysonda at myxo.css.msu.edu
brysonda at myxo.css.msu.edu
Mon Mar 10 13:19:34 PDT 2008
Author: brysonda
Date: 2008-03-10 16:19:33 -0400 (Mon, 10 Mar 2008)
New Revision: 2447
Modified:
development/source/script/cDirectInterpretASTVisitor.cc
development/source/script/cDirectInterpretASTVisitor.h
development/source/script/cParser.cc
development/source/script/cSemanticASTVisitor.cc
Log:
AS:
Fix unary expression parsing.
Add scope initialization pass.
Modified: development/source/script/cDirectInterpretASTVisitor.cc
===================================================================
--- development/source/script/cDirectInterpretASTVisitor.cc 2008-03-10 17:39:47 UTC (rev 2446)
+++ development/source/script/cDirectInterpretASTVisitor.cc 2008-03-10 20:19:33 UTC (rev 2447)
@@ -50,10 +50,40 @@
, m_has_returned(false), m_obj_assign(false)
{
m_call_stack.Resize(m_global_symtbl->GetNumVariables());
- for (int i = 0; i < m_global_symtbl->GetNumVariables(); i++) m_call_stack[i].as_string = NULL;
+ for (int i = 0; i < m_global_symtbl->GetNumVariables(); i++) {
+ switch (m_global_symtbl->GetVariableType(i)) {
+ case TYPE(ARRAY): m_call_stack[i].as_array = new cLocalArray; break;
+ case TYPE(BOOL): m_call_stack[i].as_bool = false; break;
+ case TYPE(CHAR): m_call_stack[i].as_char = 0; break;
+ case TYPE(INT): m_call_stack[i].as_int = 0; break;
+ case TYPE(FLOAT): m_call_stack[i].as_float = 0.0; break;
+ case TYPE(MATRIX): m_call_stack[i].as_matrix = NULL; break;
+ case TYPE(OBJECT_REF): m_call_stack[i].as_ref = NULL; break;
+ case TYPE(STRING): m_call_stack[i].as_string = NULL; break;
+ default: break;
+ }
+ }
}
+cDirectInterpretASTVisitor::~cDirectInterpretASTVisitor()
+{
+ for (int i = 0; i < m_global_symtbl->GetNumVariables(); i++) {
+ switch (m_global_symtbl->GetVariableType(i)) {
+ case TYPE(ARRAY): m_call_stack[i].as_array->RemoveReference(); break;
+ case TYPE(BOOL): break;
+ case TYPE(CHAR): break;
+ case TYPE(INT): break;
+ case TYPE(FLOAT): break;
+ case TYPE(MATRIX): break; // @TODO - cleanup scope
+ case TYPE(OBJECT_REF): delete m_call_stack[i].as_ref; break;
+ case TYPE(STRING): delete m_call_stack[i].as_string; break;
+ default: break;
+ }
+ }
+
+}
+
int cDirectInterpretASTVisitor::Interpret(cASTNode* node)
{
node->Accept(*this);
@@ -712,10 +742,21 @@
cSymbolTable* func_symtbl = func_src_symtbl->GetFunctionSymbolTable(fun_id);
int sp = m_sp + prev_symtbl->GetNumVariables();
m_call_stack.Resize(m_call_stack.GetSize() + func_symtbl->GetNumVariables());
- for (int i = 0; i < func_symtbl->GetNumVariables(); i++) m_call_stack[sp + i].as_string = NULL;
+ for (int i = 0; i < func_symtbl->GetNumVariables(); i++) {
+ switch (func_symtbl->GetVariableType(i)) {
+ case TYPE(ARRAY): m_call_stack[sp + i].as_array = new cLocalArray; break;
+ case TYPE(BOOL): m_call_stack[sp + i].as_bool = false; break;
+ case TYPE(CHAR): m_call_stack[sp + i].as_char = 0; break;
+ case TYPE(INT): m_call_stack[sp + i].as_int = 0; break;
+ case TYPE(FLOAT): m_call_stack[sp + i].as_float = 0.0; break;
+ case TYPE(MATRIX): m_call_stack[sp + i].as_matrix = NULL; break;
+ case TYPE(OBJECT_REF): m_call_stack[sp + i].as_ref = NULL; break;
+ case TYPE(STRING): m_call_stack[sp + i].as_string = NULL; break;
+ default: break;
+ }
+ }
// Process the arguments to the function
- tSmartArray<int> str_var_idxs;
tListIterator<cASTVariableDefinition> sit = func_src_symtbl->GetFunctionSignature(fun_id)->Iterator();
tListIterator<cASTNode> cit = node.GetArguments()->Iterator();
cASTVariableDefinition* arg_def = NULL;
@@ -737,7 +778,6 @@
case TYPE(STRING):
{
m_call_stack[sp + var_id].as_string = asString(m_rtype, m_rvalue, node);
- str_var_idxs.Push(var_id);
}
break;
@@ -769,8 +809,20 @@
}
m_rtype = node.GetType();
- // Clean up string variables in the current scope
- for (int i = 0; i < str_var_idxs.GetSize(); i++) delete m_call_stack[m_sp + str_var_idxs[i]].as_string;
+ // Clean up variables in the current scope
+ for (int i = 0; i < func_symtbl->GetNumVariables(); i++) {
+ switch (func_symtbl->GetVariableType(i)) {
+ case TYPE(ARRAY): m_call_stack[sp + i].as_array->RemoveReference(); break;
+ case TYPE(BOOL): break;
+ case TYPE(CHAR): break;
+ case TYPE(INT): break;
+ case TYPE(FLOAT): break;
+ case TYPE(MATRIX): break; // @TODO - cleanup scope
+ case TYPE(OBJECT_REF): delete m_call_stack[sp + i].as_ref; break;
+ case TYPE(STRING): delete m_call_stack[sp + i].as_string; break;
+ default: break;
+ }
+ }
// Restore previous scope
m_has_returned = false;
Modified: development/source/script/cDirectInterpretASTVisitor.h
===================================================================
--- development/source/script/cDirectInterpretASTVisitor.h 2008-03-10 17:39:47 UTC (rev 2446)
+++ development/source/script/cDirectInterpretASTVisitor.h 2008-03-10 20:19:33 UTC (rev 2447)
@@ -72,6 +72,7 @@
public:
cDirectInterpretASTVisitor(cSymbolTable* global_symtbl);
+ ~cDirectInterpretASTVisitor();
int Interpret(cASTNode* node);
Modified: development/source/script/cParser.cc
===================================================================
--- development/source/script/cParser.cc 2008-03-10 17:39:47 UTC (rev 2446)
+++ development/source/script/cParser.cc 2008-03-10 20:19:33 UTC (rev 2447)
@@ -192,8 +192,8 @@
#endif
#if DEBUG_AS_PARSER
-# define PARSE_DEBUG(x) /*{ std::cerr << x << std::endl; }*/
-# define PARSE_TRACE(x) /*{ std::cerr << "trace: " << x << std::endl; }*/
+# define PARSE_DEBUG(x) { std::cerr << x << std::endl; }
+# define PARSE_TRACE(x) { std::cerr << "trace: " << x << std::endl; }
#else
# define PARSE_DEBUG(x)
# define PARSE_TRACE(x)
@@ -635,13 +635,12 @@
case TOKEN(OP_SUB):
ASToken_t op = currentToken();
nextToken(); // consume operation
- cASTNode* r = parseExpression();
+ cASTNode* r = parseExprP6();
if (!r) {
PARSE_ERROR(NULL_EXPR);
return NULL;
}
expr.Set(new cASTExpressionUnary(FILEPOS, op, r));
- nextToken();
return expr.Release();
default:
Modified: development/source/script/cSemanticASTVisitor.cc
===================================================================
--- development/source/script/cSemanticASTVisitor.cc 2008-03-10 17:39:47 UTC (rev 2446)
+++ development/source/script/cSemanticASTVisitor.cc 2008-03-10 20:19:33 UTC (rev 2447)
@@ -487,6 +487,7 @@
case TYPE(CHAR):
case TYPE(FLOAT):
case TYPE(INT):
+ case TYPE(RUNTIME):
// Char, Float and Int Okay
node.SetType(node.GetExpression()->GetType());
More information about the Avida-cvs
mailing list