[Avida-SVN] r2379 - development/source/script

brysonda at myxo.css.msu.edu brysonda at myxo.css.msu.edu
Mon Feb 25 17:59:38 PST 2008


Author: brysonda
Date: 2008-02-25 20:59:38 -0500 (Mon, 25 Feb 2008)
New Revision: 2379

Modified:
   development/source/script/ASTree.h
   development/source/script/AvidaScript.h
   development/source/script/cParser.cc
   development/source/script/cSemanticASTVisitor.cc
   development/source/script/cSemanticASTVisitor.h
   development/source/script/cSymbolTable.cc
   development/source/script/cSymbolTable.h
Log:
Add provisions for ASTNode file position tracking and basic error reporting in cSemanticASTVisitor.

Modified: development/source/script/ASTree.h
===================================================================
--- development/source/script/ASTree.h	2008-02-25 21:22:42 UTC (rev 2378)
+++ development/source/script/ASTree.h	2008-02-26 01:59:38 UTC (rev 2379)
@@ -38,6 +38,30 @@
 class cASTVisitor;
 
 
+class cASFilePosition
+{
+private:
+  cString m_filename;
+  int m_line;
+  
+  
+  cASFilePosition(); // @not_implemented
+  cASFilePosition& operator=(const cASFilePosition&); // @not_implemented
+  
+  
+public:
+  inline cASFilePosition(const cString& fn, int line) : m_filename(fn), m_line(line) { ; }
+  inline cASFilePosition(const cASFilePosition& fp) : m_filename(fp.m_filename), m_line(fp.m_line) { ; }
+  
+  inline const cString& GetFilename() const { return m_filename; }
+  inline int GetLineNumber() const { return m_line; }
+  
+  inline bool operator==(const cASFilePosition& fp) { return m_line == fp.m_line && m_filename == fp.m_filename; }
+  inline bool operator!=(const cASFilePosition& fp) { return m_line != fp.m_line || m_filename != fp.m_filename; }
+};
+
+  
+
 // -- Abstract Syntax Tree Base Class
 // ---------------------------------------------------------------------------------------------------------------------
 
@@ -46,15 +70,19 @@
 class cASTNode
 {
 private:
+  cASTNode(); // @not_implemented
   cASTNode(const cASTNode&); // @not_implemented
   cASTNode& operator=(const cASTNode&); // @not_implmented
 
 protected:
-  cASTNode() { ; }
+  cASFilePosition m_file_pos;
+  cASTNode(const cASFilePosition& fp) : m_file_pos(fp) { ; }
 
 public:
   virtual ~cASTNode() { ; }
   
+  inline const cASFilePosition& GetFilePosition() const { return m_file_pos; }
+  
   virtual void Accept(cASTVisitor& visitor) = 0;
 };
 
@@ -97,7 +125,7 @@
   cASTNode* m_expr;
   
 public:
-  cASTAssignment(const cString& var) : m_var(var), m_expr(NULL) { ; }
+  cASTAssignment(const cASFilePosition& fp, const cString& var) : cASTNode(fp), m_var(var), m_expr(NULL) { ; }
   ~cASTAssignment() { delete m_expr; }
   
   inline const cString& GetVariable() { return m_var; }
@@ -115,7 +143,7 @@
   tList<cASTNode> m_nodes;
   
 public:
-  cASTArgumentList() { ; }
+  cASTArgumentList(const cASFilePosition& fp) : cASTNode(fp) { ; }
   ~cASTArgumentList() { ; }
   
   inline void AddNode(cASTNode* n) { m_nodes.PushRear(n); }
@@ -135,7 +163,7 @@
   cASTNode* m_expr;
   
 public:
-  cASTReturnStatement(cASTNode* expr) : m_expr(expr) { ; }
+  cASTReturnStatement(const cASFilePosition& fp, cASTNode* expr) : cASTNode(fp), m_expr(expr) { ; }
   ~cASTReturnStatement() { delete m_expr; }
 
   inline cASTNode* GetExpression() { return m_expr; }
@@ -150,7 +178,7 @@
   tList<cASTNode> m_nodes;
   
 public:
-  cASTStatementList() { ; }
+  cASTStatementList(const cASFilePosition& fp) : cASTNode(fp) { ; }
   ~cASTStatementList();
   
   inline void AddNode(cASTNode* n) { m_nodes.PushRear(n); }
@@ -172,7 +200,8 @@
   cASTNode* m_code;
   
 public:
-  cASTForeachBlock(cASTVariableDefinition* v, cASTNode* e, cASTNode* c) : m_var(v), m_expr(e), m_code(c) { ; }
+  cASTForeachBlock(const cASFilePosition& fp, cASTVariableDefinition* v, cASTNode* e, cASTNode* c) 
+    : cASTNode(fp), m_var(v), m_expr(e), m_code(c) { ; }
   
   inline cASTVariableDefinition* GetVariable() { return m_var; }
   inline cASTNode* GetValues() { return m_expr; }
@@ -207,7 +236,8 @@
   tList<cElseIf> m_elifs;
   
 public:
-  cASTIfBlock(cASTNode* expr, cASTNode* code) : m_expr(expr), m_code(code), m_else(NULL) { ; }
+  cASTIfBlock(const cASFilePosition& fp, cASTNode* expr, cASTNode* code)
+    : cASTNode(fp), m_expr(expr), m_code(code), m_else(NULL) { ; }
   ~cASTIfBlock()
   {
     delete m_expr;
@@ -239,7 +269,7 @@
   cASTNode* m_code;
   
 public:
-  cASTWhileBlock(cASTNode* expr, cASTNode* code) : m_expr(expr), m_code(code) { ; }
+  cASTWhileBlock(const cASFilePosition& fp, cASTNode* expr, cASTNode* code) : cASTNode(fp), m_expr(expr), m_code(code) { ; }
   ~cASTWhileBlock() { delete m_expr; delete m_code; }
   
   inline cASTNode* GetCondition() { return m_expr; }
@@ -262,8 +292,8 @@
   cASTNode* m_code;
   
 public:
-  cASTFunctionDefinition(ASType_t type, const cString& name, cASTVariableDefinitionList* args)
-    : m_type(type), m_name(name), m_args(args), m_code(NULL) { ; }
+  cASTFunctionDefinition(const cASFilePosition& fp, ASType_t type, const cString& name, cASTVariableDefinitionList* args)
+    : cASTNode(fp), 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; }
@@ -287,7 +317,8 @@
   cASTArgumentList* m_dims;
   
 public:
-  cASTVariableDefinition(ASType_t type, const cString& var) : m_type(type), m_var(var), m_assign(NULL), m_dims(NULL) { ; }
+  cASTVariableDefinition(const cASFilePosition& fp, ASType_t type, const cString& var)
+    : cASTNode(fp), m_type(type), m_var(var), m_assign(NULL), m_dims(NULL) { ; }
   ~cASTVariableDefinition() { delete m_assign; delete m_dims; }
   
   inline ASType_t GetType() { return m_type; }
@@ -307,7 +338,7 @@
   tList<cASTVariableDefinition> m_nodes;
   
 public:
-  cASTVariableDefinitionList() { ; }
+  cASTVariableDefinitionList(const cASFilePosition& fp) : cASTNode(fp) { ; }
   ~cASTVariableDefinitionList() { ; }
   
   inline void AddNode(cASTVariableDefinition* n) { m_nodes.PushRear(n); }
@@ -332,7 +363,8 @@
   cASTNode* m_right;
   
 public:
-  cASTExpressionBinary(ASToken_t op, cASTNode* l, cASTNode* r) : m_op(op), m_left(l), m_right(r) { ; }
+  cASTExpressionBinary(const cASFilePosition& fp, ASToken_t op, cASTNode* l, cASTNode* r)
+    : cASTNode(fp), m_op(op), m_left(l), m_right(r) { ; }
   ~cASTExpressionBinary() { delete m_left; delete m_right; }
   
   inline ASToken_t GetOperator() { return m_op; }
@@ -352,7 +384,7 @@
   cASTNode* m_expr;
   
 public:
-  cASTExpressionUnary(ASToken_t op, cASTNode* e) : m_op(op), m_expr(e) { ; }
+  cASTExpressionUnary(const cASFilePosition& fp, ASToken_t op, cASTNode* e) : cASTNode(fp), m_op(op), m_expr(e) { ; }
   ~cASTExpressionUnary() { delete m_expr; }
 
   inline ASToken_t GetOperator() { return m_op; }
@@ -373,7 +405,7 @@
   cASTArgumentList* m_args;
   
 public:
-  cASTFunctionCall(cASTNode* target) : m_target(target), m_args(NULL) { ; }
+  cASTFunctionCall(const cASFilePosition& fp, cASTNode* target) : cASTNode(fp), m_target(target), m_args(NULL) { ; }
   ~cASTFunctionCall() { delete m_args; }
   
   cASTNode* GetTarget() { return m_target; }
@@ -393,7 +425,7 @@
   cString m_value;
   
 public:
-  cASTLiteral(ASType_t t, const cString& v) : m_type(t), m_value(v) { ; }
+  cASTLiteral(const cASFilePosition& fp, ASType_t t, const cString& v) : cASTNode(fp), m_type(t), m_value(v) { ; }
   
   inline ASType_t GetType() { return m_type; }
   inline const cString& GetValue() { return m_value; }
@@ -409,7 +441,7 @@
   bool m_is_matrix;
   
 public:
-  cASTLiteralArray(cASTNode* v, bool is_mat) : m_value(v), m_is_matrix(is_mat) { ; }
+  cASTLiteralArray(const cASFilePosition& fp, cASTNode* v, bool is_mat) : cASTNode(fp), m_value(v), m_is_matrix(is_mat) { ; }
   ~cASTLiteralArray() { delete m_value; }  
   
   inline cASTNode* GetValue() { return m_value; }
@@ -425,7 +457,7 @@
   cString m_name;
   
 public:
-  cASTVariableReference(const cString& name) : m_name(name) { ; }
+  cASTVariableReference(const cASFilePosition& fp, const cString& name) : cASTNode(fp), m_name(name) { ; }
   
   inline const cString& GetName() { return m_name; }
   
@@ -442,7 +474,7 @@
   cASTNode* m_expr;
   
 public:
-  cASTUnpackTarget() : m_last_wild(false), m_last_named(false), m_expr(NULL) { ; }
+  cASTUnpackTarget(const cASFilePosition& fp) : cASTNode(fp), m_last_wild(false), m_last_named(false), m_expr(NULL) { ; }
   ~cASTUnpackTarget() { delete m_expr; }
   
   inline void AddVar(const cString& name) { m_nodes.Push(name); }

Modified: development/source/script/AvidaScript.h
===================================================================
--- development/source/script/AvidaScript.h	2008-02-25 21:22:42 UTC (rev 2378)
+++ development/source/script/AvidaScript.h	2008-02-26 01:59:38 UTC (rev 2379)
@@ -110,6 +110,14 @@
 } ASParseError_t;
 
 
+typedef enum eASSemanticErrors {
+  AS_SEMANTIC_ERR_VARIABLE_REDEFINITION,
+  AS_SEMANTIC_ERR_INTERNAL,
+  
+  AS_SEMANTIC_ERR_UNKNOWN
+} ASSemanticError_t;
+
+
 typedef enum eASTypes {
   AS_TYPE_ARRAY = 0,
   AS_TYPE_CHAR,

Modified: development/source/script/cParser.cc
===================================================================
--- development/source/script/cParser.cc	2008-02-25 21:22:42 UTC (rev 2378)
+++ development/source/script/cParser.cc	2008-02-26 01:59:38 UTC (rev 2379)
@@ -192,6 +192,8 @@
 #define PARSE_ERROR(x) reportError(AS_PARSE_ERR_ ## x, __LINE__)
 #define PARSE_UNEXPECT() { if (currentToken()) { PARSE_ERROR(UNEXPECTED_TOKEN); } else { PARSE_ERROR(EOF); } return NULL; }
 
+#define FILEPOS cASFilePosition(m_filename, m_lexer ? m_lexer->lineno() : 0)
+
 #define TOKEN(x) AS_TOKEN_ ## x
 
 
@@ -267,7 +269,7 @@
   
   if (nextToken() != TOKEN(ID)) PARSE_UNEXPECT();
 
-  tAutoRelease<cASTUnpackTarget> ut(new cASTUnpackTarget());
+  tAutoRelease<cASTUnpackTarget> ut(new cASTUnpackTarget(FILEPOS));
   (*ut).AddVar(currentText());
   
   while (nextToken()) {
@@ -303,7 +305,7 @@
 cASTArgumentList* cParser::parseArgumentList()
 {
   PARSE_TRACE("parseArgumentList");
-  cASTArgumentList* al = new cASTArgumentList();
+  cASTArgumentList* al = new cASTArgumentList(FILEPOS);
 
   al->AddNode(parseExpression());
   while (currentToken() == TOKEN(COMMA)) {
@@ -317,7 +319,7 @@
 cASTNode* cParser::parseAssignment()
 {
   PARSE_TRACE("parseAssignment");
-  cASTAssignment* an = new cASTAssignment(currentText());
+  cASTAssignment* an = new cASTAssignment(FILEPOS, currentText());
   
   nextToken(); // consume '='
 
@@ -338,11 +340,11 @@
     switch (currentToken()) {
       case TOKEN(DOT):
         if (nextToken() != TOKEN(ID)) PARSE_UNEXPECT();
-        ce.Set(new cASTExpressionBinary(TOKEN(DOT), ce.Release(), new cASTVariableReference(currentText())));
+        ce.Set(new cASTExpressionBinary(FILEPOS, TOKEN(DOT), ce.Release(), new cASTVariableReference(FILEPOS, currentText())));
         nextToken(); // consume id
         break;
       case TOKEN(PREC_OPEN):
-        cASTFunctionCall* fc = new cASTFunctionCall(ce.Release());
+        cASTFunctionCall* fc = new cASTFunctionCall(FILEPOS, ce.Release());
         ce.Set(fc);
         if (nextToken() != TOKEN(PREC_CLOSE)) fc->SetArguments(parseArgumentList());
         if (currentToken() != TOKEN(PREC_CLOSE)) PARSE_UNEXPECT();
@@ -354,7 +356,7 @@
       case TOKEN(IDX_OPEN):
         do {
           nextToken(); // consume '['
-          ce.Set(new cASTExpressionBinary(TOKEN(IDX_OPEN), ce.Release(), parseExpression()));
+          ce.Set(new cASTExpressionBinary(FILEPOS, TOKEN(IDX_OPEN), ce.Release(), parseExpression()));
           if (currentToken() != TOKEN(IDX_CLOSE)) PARSE_UNEXPECT();
         } while (nextToken() == TOKEN(IDX_OPEN));
         break;
@@ -409,7 +411,7 @@
         nextToken();
         r = parseExprP1();
         if (!r) PARSE_ERROR(NULL_EXPR);
-        l = new cASTExpressionBinary(op, l, r);
+        l = new cASTExpressionBinary(FILEPOS, op, l, r);
         break;
         
       default:
@@ -434,7 +436,7 @@
         nextToken();
         r = parseExprP2();
         if (!r) PARSE_ERROR(NULL_EXPR);
-        l = new cASTExpressionBinary(op, l, r);
+        l = new cASTExpressionBinary(FILEPOS, op, l, r);
         break;
         
       default:
@@ -459,7 +461,7 @@
         nextToken();
         r = parseExprP3();
         if (!r) PARSE_ERROR(NULL_EXPR);
-        l = new cASTExpressionBinary(op, l, r);
+        l = new cASTExpressionBinary(FILEPOS, op, l, r);
         break;
         
       default:
@@ -488,7 +490,7 @@
         nextToken();
         r = parseExprP4();
         if (!r) PARSE_ERROR(NULL_EXPR);
-        l = new cASTExpressionBinary(op, l, r);
+        l = new cASTExpressionBinary(FILEPOS, op, l, r);
         break;
         
       default:
@@ -513,7 +515,7 @@
         nextToken();
         r = parseExprP5();
         if (!r) PARSE_ERROR(NULL_EXPR);
-        l = new cASTExpressionBinary(op, l, r);
+        l = new cASTExpressionBinary(FILEPOS, op, l, r);
         break;
         
       default:
@@ -539,7 +541,7 @@
         nextToken();
         r = parseExprP6();
         if (!r) PARSE_ERROR(NULL_EXPR);
-        l = new cASTExpressionBinary(op, l, r);
+        l = new cASTExpressionBinary(FILEPOS, op, l, r);
         break;
         
       default:
@@ -559,27 +561,27 @@
   
   switch (currentToken()) {
     case TOKEN(FLOAT):
-      expr.Set(new cASTLiteral(AS_TYPE_FLOAT, currentText()));
+      expr.Set(new cASTLiteral(FILEPOS, AS_TYPE_FLOAT, currentText()));
       break;
     case TOKEN(INT):
-      expr.Set(new cASTLiteral(AS_TYPE_INT, currentText()));
+      expr.Set(new cASTLiteral(FILEPOS, AS_TYPE_INT, currentText()));
       break;
     case TOKEN(CHAR):
-      expr.Set(new cASTLiteral(AS_TYPE_CHAR, currentText()));
+      expr.Set(new cASTLiteral(FILEPOS, AS_TYPE_CHAR, currentText()));
       break;
     case TOKEN(STRING):
-      expr.Set(new cASTLiteral(AS_TYPE_STRING, currentText()));
+      expr.Set(new cASTLiteral(FILEPOS, AS_TYPE_STRING, currentText()));
       break;
     case TOKEN(ID):
       if (peekToken() == TOKEN(PREC_OPEN)) {
-        cASTNode* vr = new cASTVariableReference(currentText());
+        cASTNode* vr = new cASTVariableReference(FILEPOS, currentText());
         nextToken(); // consume id token
-        cASTFunctionCall* fc = new cASTFunctionCall(vr);
+        cASTFunctionCall* fc = new cASTFunctionCall(FILEPOS, vr);
         expr.Set(fc);
         if (nextToken() != TOKEN(PREC_CLOSE)) fc->SetArguments(parseArgumentList());        
         if (currentToken() != TOKEN(PREC_CLOSE)) PARSE_UNEXPECT();
       } else {
-        expr = new cASTVariableReference(currentText());
+        expr = new cASTVariableReference(FILEPOS, currentText());
       }
       break;
     case TOKEN(PREC_OPEN):
@@ -594,7 +596,7 @@
     case TOKEN(ARR_OPEN):
       if (nextToken() != TOKEN(ARR_CLOSE)) expr.Set(parseArgumentList());
       if (currentToken() != TOKEN(ARR_CLOSE)) PARSE_UNEXPECT();
-      expr.Set(new cASTLiteralArray(expr.Release(), is_matrix));
+      expr.Set(new cASTLiteralArray(FILEPOS, expr.Release(), is_matrix));
       break;
       
     case TOKEN(OP_BIT_NOT):
@@ -606,7 +608,7 @@
         PARSE_ERROR(NULL_EXPR);
         return NULL;
       }
-      expr.Set(new cASTExpressionUnary(op, r));
+      expr.Set(new cASTExpressionUnary(FILEPOS, op, r));
       nextToken();
       return expr.Release();
       
@@ -653,7 +655,7 @@
     return NULL;
   }
   
-  tAutoRelease<cASTVariableDefinition> var(new cASTVariableDefinition(type, currentText()));
+  tAutoRelease<cASTVariableDefinition> var(new cASTVariableDefinition(FILEPOS, type, currentText()));
   
   if (nextToken() != TOKEN(PREC_OPEN)) {
     PARSE_UNEXPECT();
@@ -671,7 +673,7 @@
   
   cASTNode* code = parseCodeBlock();
   
-  return new cASTForeachBlock(var.Release(), expr.Release(), code);
+  return new cASTForeachBlock(FILEPOS, var.Release(), expr.Release(), code);
 }
 
 cASTNode* cParser::parseFunctionDefine()
@@ -719,7 +721,7 @@
   if (currentToken() != TOKEN(PREC_CLOSE)) PARSE_UNEXPECT();
   nextToken(); // consume ')'
   
-  return new cASTFunctionDefinition(type, name, args.Release());
+  return new cASTFunctionDefinition(FILEPOS, type, name, args.Release());
 }
 
 cASTNode* cParser::parseIDStatement()
@@ -733,7 +735,7 @@
     case TOKEN(DOT):
     case TOKEN(IDX_OPEN):
     case TOKEN(PREC_OPEN):
-      cASTNode* target = new cASTVariableReference(currentText());
+      cASTNode* target = new cASTVariableReference(FILEPOS, currentText());
       nextToken(); // consume id
       return parseCallExpression(target, true);
       break;
@@ -757,7 +759,7 @@
   if (currentToken() != TOKEN(PREC_CLOSE)) PARSE_UNEXPECT();
   nextToken();
   
-  tAutoRelease<cASTIfBlock> is(new cASTIfBlock(cond.Release(), parseCodeBlock()));
+  tAutoRelease<cASTIfBlock> is(new cASTIfBlock(FILEPOS, cond.Release(), parseCodeBlock()));
 
   while (currentToken() == TOKEN(CMD_ELSEIF)) {
     
@@ -813,7 +815,7 @@
   PARSE_TRACE("parseReturnStatement");
   
   nextToken(); // consume 'return'
-  cASTNode* rs = new cASTReturnStatement(parseExpression());
+  cASTNode* rs = new cASTReturnStatement(FILEPOS, parseExpression());
   
   return rs;
 }
@@ -822,7 +824,7 @@
 cASTNode* cParser::parseStatementList()
 {
   PARSE_TRACE("parseStatementList");
-  tAutoRelease<cASTStatementList> sl(new cASTStatementList());
+  tAutoRelease<cASTStatementList> sl(new cASTStatementList(FILEPOS));
   
   tAutoRelease<cASTNode> node;
 
@@ -912,7 +914,7 @@
   
   if (nextToken() != TOKEN(ID)) PARSE_UNEXPECT();
   
-  tAutoRelease<cASTVariableDefinition> vd(new cASTVariableDefinition(vtype, currentText()));
+  tAutoRelease<cASTVariableDefinition> vd(new cASTVariableDefinition(FILEPOS, vtype, currentText()));
   
   switch (nextToken()) {
     case TOKEN(ASSIGN):
@@ -936,7 +938,7 @@
 cASTVariableDefinitionList* cParser::parseVariableDefinitionList()
 {
   PARSE_TRACE("parseVariableDefinitionList");
-  tAutoRelease<cASTVariableDefinitionList> vl(new cASTVariableDefinitionList());
+  tAutoRelease<cASTVariableDefinitionList> vl(new cASTVariableDefinitionList(FILEPOS));
  
   cASTVariableDefinition* vd = parseVariableDefinition();
   if (!vd) return NULL;
@@ -964,7 +966,7 @@
   nextToken();
   
   cASTNode* code = parseCodeBlock();
-  return new cASTWhileBlock(cond.Release(), code);
+  return new cASTWhileBlock(FILEPOS, cond.Release(), code);
 }
 
 
@@ -1018,4 +1020,6 @@
 #undef PARSE_ERROR()
 #undef PARSE_UNEXPECT()
 
+#undef FILEPOS
+
 #undef TOKEN()

Modified: development/source/script/cSemanticASTVisitor.cc
===================================================================
--- development/source/script/cSemanticASTVisitor.cc	2008-02-25 21:22:42 UTC (rev 2378)
+++ development/source/script/cSemanticASTVisitor.cc	2008-02-26 01:59:38 UTC (rev 2379)
@@ -28,8 +28,11 @@
 #include "cSymbolTable.h"
 
 
+#define SEMANTIC_ERROR(code, info) reportError(AS_SEMANTIC_ERR_ ## code, node.GetFilePosition(),  __LINE__, info)
+
+
 cSemanticASTVisitor::cSemanticASTVisitor(cASLibrary* lib, cSymbolTable* global_symtbl)
-  : m_library(lib), m_global_symtbl(global_symtbl), m_cur_symtbl(NULL)
+  : m_library(lib), m_global_symtbl(global_symtbl), m_cur_symtbl(global_symtbl)
 {
 }
 
@@ -77,6 +80,9 @@
 
 void cSemanticASTVisitor::visitVariableDefinition(cASTVariableDefinition& node)
 {
+  if (!m_cur_symtbl->AddVariable(node.GetVariable(), node.GetType())) {
+    SEMANTIC_ERROR(VARIABLE_REDEFINITION, node.GetVariable());
+  }
 }
 
 
@@ -123,3 +129,29 @@
 void cSemanticASTVisitor::visitUnpackTarget(cASTUnpackTarget& node)
 {
 }
+
+
+void cSemanticASTVisitor::reportError(ASSemanticError_t err, const cASFilePosition& fp, const int line, const cString& info)
+{
+#define ERR_ENDL "  (cSemanticASTVisitor.cc:" << line << ")" << std::endl
+  
+  m_success = false;
+  
+  std::cerr << fp.GetFilename() << ":" << fp.GetLineNumber() << ": error: ";
+  
+  switch (err) {
+    case AS_SEMANTIC_ERR_VARIABLE_REDEFINITION:
+      std::cerr << "redefining variable '" << info << "'" << ERR_ENDL;
+      break;
+    case AS_SEMANTIC_ERR_INTERNAL:
+      std::cerr << "internal semantic analysis error at cSemanticASTVisitor.cc:" << line << std::endl;
+      break;
+    case AS_SEMANTIC_ERR_UNKNOWN:
+      default:
+      std::cerr << "unknown error" << std::endl;
+  }
+  
+#undef ERR_ENDL
+}
+
+#undef SEMANTIC_ERROR()

Modified: development/source/script/cSemanticASTVisitor.h
===================================================================
--- development/source/script/cSemanticASTVisitor.h	2008-02-25 21:22:42 UTC (rev 2378)
+++ development/source/script/cSemanticASTVisitor.h	2008-02-26 01:59:38 UTC (rev 2379)
@@ -41,6 +41,14 @@
   cSymbolTable* m_cur_symtbl;
   tSmartArray<cSymbolTable*> m_symtbl_stack;
   
+  bool m_success;
+
+  
+  cSemanticASTVisitor(); // @not_implemented
+  cSemanticASTVisitor(const cSemanticASTVisitor&); // @not_implemented
+  cSemanticASTVisitor& operator=(const cSemanticASTVisitor&); // @not_implemented
+  
+  
 public:
   cSemanticASTVisitor(cASLibrary* lib, cSymbolTable* global_symtbl);
   
@@ -68,7 +76,6 @@
   void visitUnpackTarget(cASTUnpackTarget&);
 
 private:
-
+  void reportError(ASSemanticError_t err, const cASFilePosition& fp, const int line, const cString& info);
 };
-
 #endif

Modified: development/source/script/cSymbolTable.cc
===================================================================
--- development/source/script/cSymbolTable.cc	2008-02-25 21:22:42 UTC (rev 2378)
+++ development/source/script/cSymbolTable.cc	2008-02-26 01:59:38 UTC (rev 2379)
@@ -24,3 +24,22 @@
 
 #include "cSymbolTable.h"
 
+bool cSymbolTable::AddVariable(const cString& name, ASType_t type)
+{
+  if (HasSymbol(name)) return false;
+
+  m_sym_tbl.Push(new sSymbolEntry(name, type));
+  m_sym_dict.Add(name, m_sym_tbl.GetSize() - 1);
+  
+  return true;
+}
+
+bool cSymbolTable::AddFunction(const cString& name, ASType_t type)
+{
+  if (HasSymbol(name)) return false;
+  
+  m_fun_tbl.Push(new sFunctionEntry(name, type));
+  m_fun_dict.Add(name, m_fun_tbl.GetSize() - 1);
+  
+  return true;
+}

Modified: development/source/script/cSymbolTable.h
===================================================================
--- development/source/script/cSymbolTable.h	2008-02-25 21:22:42 UTC (rev 2378)
+++ development/source/script/cSymbolTable.h	2008-02-26 01:59:38 UTC (rev 2379)
@@ -67,10 +67,12 @@
   
 public:
   cSymbolTable() { ; }
+
   
-  bool AddSymbol(const cString& name);
+  bool AddVariable(const cString& name, ASType_t type);
+  bool AddFunction(const cString& name, ASType_t type);
   
-  bool Lookup(const cString& name) const;
+  inline bool HasSymbol(const cString& name) const { return m_sym_dict.HasEntry(name) || m_fun_dict.HasEntry(name); }
 };
 
 




More information about the Avida-cvs mailing list