diff -r 000000000000 -r fb772792efd1 util/dsymtable.cc --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/util/dsymtable.cc Wed Jan 31 15:32:38 2007 +0100 @@ -0,0 +1,133 @@ +/* + * (c) 2005 Mario de Sousa + * + * Offered to the public under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 of the + * License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General + * Public License for more details. + * + * This code is made available on the understanding that it will not be + * used in safety-critical situations without a full and competent review. + */ + +/* + * An IEC 61131-3 IL and ST compiler. + * + * Based on the + * FINAL DRAFT - IEC 61131-3, 2nd Ed. (2001-12-10) + * + */ + + +/* + * A generic symbol table that allows duplicate values. + * + * This is used to create a symbol table of previously defined + * functions. Duplicate are allowed since the standard permits function\ + * overloading in the standard library. + */ + + +#include +#include "symtable.hh" + + + +/* A macro for printing out internal parser errors... */ +#define ERROR error_exit(__FILE__,__LINE__) +/* function defined in main.cc */ +extern void error_exit(const char *file_name, int line_no); + + + + + /* clear all entries... */ +template +void dsymtable_c::reset(void) { + _base.clear(); +} + + +template +void dsymtable_c::insert(const char *identifier_str, value_t new_value) { + // std::cout << "store_identifier(" << identifier_str << "): \n"; + std::pair new_element(identifier_str, new_value); + /* iterator res = */ _base.insert(new_element); +} + + +template +void dsymtable_c::insert(const symbol_c *symbol, value_t new_value) { + const token_c *name = dynamic_cast(symbol); + if (name == NULL) + ERROR; + insert(name->value, new_value); +} + + +#if 0 +template +void dsymtable_c::insert_noduplicate(const char *identifier_str, value_t new_value) { + if (find_value(identifier_str) != null_value) + /* already present in the set! */ + ERROR; + + // std::cout << "store_identifier(" << identifier_str << "): \n"; + std::pair new_element(identifier_str, new_value); + /* iterator res = */ _base.insert(new_element); +} + + +template +void dsymtable_c::insert_noduplicate(const symbol_c *symbol, value_t new_value) { + const token_c *name = dynamic_cast(symbol); + if (name == NULL) + ERROR; + insert_noduplicate(name->value, new_value); +} +#endif + + +/* returns null_value if not found! */ +template +value_type dsymtable_c::find_value(const char *identifier_str) { + iterator i = _base.find(identifier_str); + + if (i == _base.end()) + return null_value; + else + return i->second; +} + + +template +value_type dsymtable_c::find_value(const symbol_c *symbol) { + const token_c *name = dynamic_cast(symbol); + if (name == NULL) + ERROR; + return find_value(name->value); +} + + +/* debuging function... */ +template +void dsymtable_c::print(void) { + for(iterator i = _base.begin(); + i != _base.end(); + i++) + std::cout << i->second << ":" << i->first << "\n"; + std::cout << "=====================\n"; +} + + + + + + + + +