00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019 #ifndef MARSYAS_SYM_TBL_H
00020 #define MARSYAS_SYM_TBL_H
00021
00022 #include <string>
00023 #include <map>
00024 #include <vector>
00025 #include "ExVal.h"
00026 #include "ExCommon.h"
00027 #include "common_header.h"
00028
00029 namespace Marsyas
00030 {
00039 class ExNode;
00040 class ExNode_Fun;
00041
00054 class ExRecord : public ExRefCount {
00055 private:
00056 int kind_;
00057 std::string name_;
00058 ExVal value_;
00059 bool reserved_;
00060
00061 std::map<std::string,std::string> syms_aliases_;
00062 std::map<std::string,ExRecord*> syms_;
00063
00064 std::vector<std::string> imports_;
00065
00066 private:
00067 void split_on(std::string p, char c, std::string& hd, std::string& tl, bool keep=false);
00068 void rsplit_on(std::string p, char c, std::string& hd, std::string& tl);
00069 ExRecord* find_sym(std::string nm);
00070
00071 public:
00072 ExRecord();
00073 ExRecord(int kind);
00074 ExRecord(int kind, ExFun* fun, bool reserved);
00075 ExRecord(int kind, std::string name, ExVal& value, bool reserved);
00076
00077 virtual ~ExRecord();
00078
00079 std::string getType(std::string nm="");
00080 std::string getElemType(std::string nm="");
00081 int getKind(std::string nm="");
00082 bool is_reserved(std::string nm="");
00083 mrs_natural size() {return syms_.size();}
00084
00085 void setValue(ExVal& v, std::string path="", int elem_pos=-1);
00086 ExVal getValue(std::string path="");
00087 ExRecord* getRecord(std::string nm);
00088 ExFun* getFunctionCopy(std::string nm="");
00089 bool is_list();
00090 bool is_seq();
00091 bool params_compare(std::string a, std::string b);
00092
00093
00094
00095
00096
00097
00098
00099
00100
00101
00102
00103
00104
00105
00106
00107 void addAliases(std::string path, std::string name);
00108 void addRecord(std::string path, ExRecord* sym);
00109 ExRecord* rmvRecord(std::string path);
00110 void addReserved(std::string path, ExFun* f);
00111 void addReserved(std::string path, ExVal v, std::string nm="", int kind=T_CONST);
00112
00113 void import(std::string);
00114 void rmv_import(std::string);
00115 };
00116
00117 class ExSymTbl : public ExRefCount {
00118
00119
00120 std::vector<ExRecord*> rho_;
00121 ExRecord* curr_;
00122 unsigned int env_id;
00123 public:
00124 ExSymTbl() : ExRefCount() {env_id=0;curr_=NULL;}
00125 virtual ~ExSymTbl();
00126
00127 void block_open();
00128 void block_close();
00129 void addTable(ExRecord* r);
00130
00131 mrs_natural size() {return rho_.size();}
00132 void setValue(ExVal& v, std::string path);
00133
00134 ExVal getValue(std::string path);
00135 ExRecord* getRecord(std::string nm);
00136 ExFun* getFunctionCopy(std::string nm);
00137
00138 void addRecord(std::string path, ExRecord* sym);
00139 ExRecord* rmvRecord(std::string path);
00140 void addReserved(std::string path, ExFun* f);
00141 void addReserved(std::string path, ExVal v, std::string nm="", int kind=T_CONST);
00142
00143 void import(std::string);
00144 void rmv_import(std::string);
00145 };
00146
00147 }
00148
00149 #endif
00150