From 9a84cc2ae2ec1273ad60d5c64ccd7103a51c0db8 Mon Sep 17 00:00:00 2001 From: "Mike D. Lowis" Date: Tue, 13 Mar 2012 14:16:37 -0400 Subject: [PATCH] Added symbol and scopestack classes --- source/symbol/scopestack.cpp | 59 ++++++++++++++++++++++++++++++++++++ source/symbol/scopestack.h | 28 +++++++++++++++++ source/symbol/symbol.cpp | 34 +++++++++++++++++++++ source/symbol/symbol.h | 22 ++++++++++++++ 4 files changed, 143 insertions(+) create mode 100644 source/symbol/scopestack.cpp create mode 100644 source/symbol/scopestack.h create mode 100644 source/symbol/symbol.cpp create mode 100644 source/symbol/symbol.h diff --git a/source/symbol/scopestack.cpp b/source/symbol/scopestack.cpp new file mode 100644 index 0000000..1b7b469 --- /dev/null +++ b/source/symbol/scopestack.cpp @@ -0,0 +1,59 @@ +#include "scopestack.h" + +using namespace std; + +ScopeStack::ScopeStack() +{ +} + +ScopeStack::~ScopeStack() +{ +} + +void ScopeStack::startScope() +{ + scope_stack.push_front( sym_table_t() ); +} + +void ScopeStack::stopScope() +{ + scope_stack.pop_front(); +} + +void ScopeStack::define(const std::string& name) +{ + sym_pair_t pair(name, Symbol(name)); + scope_stack.front().insert( pair ); +} + +void ScopeStack::define(const std::string& name, symtype_t type) +{ + sym_pair_t pair(name, Symbol(name,type)); + scope_stack.front().insert( pair ); +} + +const Symbol* ScopeStack::lookup(const std::string& name) +{ + Symbol* p_sym = NULL; + list::iterator it; + for(it = scope_stack.begin(); it != scope_stack.end(); it++) + { + sym_table_t::iterator p_val = (*it).find(name); + if( p_val != (*it).end()) + { + p_sym = &(p_val->second); + } + } + return p_sym; +} + +bool ScopeStack::isLocal(const std::string& name) const +{ + return false; +} + +bool ScopeStack::isGlobal(const std::string& name) const +{ + return false; +} + diff --git a/source/symbol/scopestack.h b/source/symbol/scopestack.h new file mode 100644 index 0000000..f2d631c --- /dev/null +++ b/source/symbol/scopestack.h @@ -0,0 +1,28 @@ +#ifndef SCOPE_TREE_H +#define SCOPE_TREE_H + +#include +#include +#include +#include "symbol.h" + +typedef std::pair sym_pair_t; +typedef std::map sym_table_t; + +class ScopeStack { + protected: + std::list scope_stack; + public: + ScopeStack(); + virtual ~ScopeStack(); + + void startScope(); + void stopScope(); + void define(const std::string& name); + void define(const std::string& name, symtype_t type); + const Symbol* lookup(const std::string& name); + bool isLocal(const std::string& name) const; + bool isGlobal(const std::string& name) const; +}; + +#endif diff --git a/source/symbol/symbol.cpp b/source/symbol/symbol.cpp new file mode 100644 index 0000000..128f4ad --- /dev/null +++ b/source/symbol/symbol.cpp @@ -0,0 +1,34 @@ +#include "symbol.h" + +Symbol::Symbol(const std::string& name) : sym_name(name), sym_type(0) +{ +} + +Symbol::Symbol(const std::string& name, symtype_t type) : sym_name(name), sym_type(0) +{ +} + +Symbol::~Symbol() +{ +} + +symtype_t Symbol::type() const +{ + return sym_type; +} + +void Symbol::type(symtype_t type) +{ + sym_type = type; +} + +const std::string& Symbol::name() const +{ + return sym_name; +} + +void Symbol::name(const std::string& name) +{ + sym_name = name; +} + diff --git a/source/symbol/symbol.h b/source/symbol/symbol.h new file mode 100644 index 0000000..8c646dc --- /dev/null +++ b/source/symbol/symbol.h @@ -0,0 +1,22 @@ +#ifndef SYMBOL_H +#define SYMBOL_H + +#include + +typedef unsigned int symtype_t; + +class Symbol { + protected: + std::string sym_name; + symtype_t sym_type; + public: + Symbol(const std::string& name); + Symbol(const std::string& name, symtype_t type); + virtual ~Symbol(); + symtype_t type() const; + void type(symtype_t type); + const std::string& name() const; + void name(const std::string& name); +}; + +#endif -- 2.52.0