[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