00001 #ifndef DVE_SYMBOL_TABLE_HH
00002 #define DVE_SYMBOL_TABLE_HH
00003
00007 #ifndef DOXYGEN_PROCESSING
00008 #include <vector>
00009 #include <list>
00010 #include <stack>
00011 #include <cstdio>
00012 #include "system/dve/syntax_analysis/dve_symbol.hh"
00013 #include "common/error.hh"
00014 #include "common/array.hh"
00015 #include "system/dve/syntax_analysis/dve_commonparse.hh"
00016 #include "system/dve/syntax_analysis/dve_token_vector.hh"
00017 #include "common/array.hh"
00018 #include "common/deb.hh"
00019
00020 namespace divine {
00021 #endif //DOXYGEN_PROCESSING
00022
00023
00024 class dve_symbol_t;
00025
00027 class dve_symbol_table_t
00028 {
00029 protected:
00031 array_t<dve_symbol_t *> symbols;
00032 array_t<dve_symbol_t *> channel_symbs;
00033 array_t<dve_symbol_t *> variable_symbs;
00034 array_t<dve_symbol_t *> process_symbs;
00035 array_t<dve_symbol_t *> state_symbs;
00036 array_t<array_t<dve_symbol_t *> *> symbols_of_processes;
00037 array_t<std::size_t> processes_of_symbols;
00038 array_t<dve_symbol_t *> global_symbols;
00039 dve_token_vector_t token_vector;
00040 error_vector_t & terr;
00041
00042 public:
00045 dve_symbol_table_t(error_vector_t & evect): terr(evect) {}
00047
00051 bool found_symbol(const char * name, const std::size_t proc_gid) const;
00052
00054
00057 bool found_global_symbol(const char * name) const;
00058
00060
00065 std::size_t find_symbol(const char * name, const std::size_t proc_gid) const;
00066
00068
00073 std::size_t find_global_symbol(const char * name) const;
00074
00077
00086 std::size_t find_visible_symbol(const char * name,
00087 const std::size_t proc_gid) const;
00088
00090 dve_symbol_t * get_symbol(const std::size_t sid)
00091 { return symbols[sid]; }
00092
00095 const dve_symbol_t * get_symbol(const std::size_t sid) const
00096 { return symbols[sid]; }
00097
00099
00104 std::size_t get_symbol_count() const { return symbols.size(); }
00106
00109 std::size_t get_variable_count() const
00110 { return variable_symbs.size(); }
00112
00115 std::size_t get_channel_count() const
00116 { return channel_symbs.size(); }
00118
00121 std::size_t get_process_count() const
00122 { return process_symbs.size(); }
00124
00127 std::size_t get_state_count() const
00128 { return state_symbs.size(); }
00130 dve_symbol_t * get_variable(const std::size_t gid)
00131 { return variable_symbs[gid]; }
00133 const dve_symbol_t * get_variable(const std::size_t gid) const
00134 { return variable_symbs[gid]; }
00136 dve_symbol_t * get_channel(const std::size_t gid)
00137 { return channel_symbs[gid]; }
00139 const dve_symbol_t * get_channel(const std::size_t gid) const
00140 { return channel_symbs[gid]; }
00142 dve_symbol_t * get_process(const std::size_t gid)
00143 { return process_symbs[gid]; }
00145 const dve_symbol_t * get_process(const std::size_t gid) const
00146 { return process_symbs[gid]; }
00148 dve_symbol_t * get_state(const std::size_t gid)
00149 { return state_symbs[gid]; }
00151 const dve_symbol_t * get_state(const std::size_t gid) const
00152 { return state_symbs[gid]; }
00153
00156 const char * save_token(const char * const token)
00157 { return token_vector.save_token(token); }
00158
00160 void add_channel(dve_symbol_t * const symbol);
00162
00165 void add_process(dve_symbol_t * const symbol);
00167 void add_variable(dve_symbol_t * const symbol);
00169 void add_state(dve_symbol_t * const symbol);
00170
00171 ~dve_symbol_table_t();
00172 };
00173
00174 #ifndef DOXYGEN_PROCESSING
00175 }
00176 #include "common/undeb.hh"
00177
00178 #endif //DOXYGEN_PROCESSING
00179
00180 #endif
00181