util/dsymtable.cc
changeset 0 fb772792efd1
child 279 c0453b7f99df
--- /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 <iostream>
+#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<typename value_type, value_type null_value>
+void dsymtable_c<value_type, null_value>::reset(void) {
+  _base.clear();
+}
+
+
+template<typename value_type, value_type null_value>
+void dsymtable_c<value_type, null_value>::insert(const char *identifier_str, value_t new_value) {
+  // std::cout << "store_identifier(" << identifier_str << "): \n";
+  std::pair<const char *, value_t> new_element(identifier_str, new_value);
+  /* iterator res = */ _base.insert(new_element);
+}
+
+
+template<typename value_type, value_type null_value>
+void dsymtable_c<value_type, null_value>::insert(const symbol_c *symbol, value_t new_value) {
+  const token_c *name = dynamic_cast<const token_c *>(symbol);
+  if (name == NULL)
+    ERROR;
+  insert(name->value, new_value);
+}
+
+
+#if 0
+template<typename value_type, value_type null_value>
+void dsymtable_c<value_type, null_value>::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<const char *, value_t> new_element(identifier_str, new_value);
+  /* iterator res = */ _base.insert(new_element);
+}
+
+
+template<typename value_type, value_type null_value>
+void dsymtable_c<value_type, null_value>::insert_noduplicate(const symbol_c *symbol, value_t new_value) {
+  const token_c *name = dynamic_cast<const token_c *>(symbol);
+  if (name == NULL)
+    ERROR;
+  insert_noduplicate(name->value, new_value);
+}
+#endif
+
+
+/* returns null_value if not found! */
+template<typename value_type, value_type null_value>
+value_type dsymtable_c<value_type, null_value>::find_value(const char *identifier_str) {
+  iterator i = _base.find(identifier_str);
+
+  if (i == _base.end())
+    return null_value;
+  else
+    return i->second;
+}
+
+
+template<typename value_type, value_type null_value>
+value_type dsymtable_c<value_type, null_value>::find_value(const symbol_c *symbol) {
+  const token_c *name = dynamic_cast<const token_c *>(symbol);
+  if (name == NULL)
+    ERROR;
+  return find_value(name->value);
+}
+
+
+/* debuging function... */
+template<typename value_type, value_type null_value>
+void dsymtable_c<value_type, null_value>::print(void) {
+  for(iterator i = _base.begin();
+      i != _base.end();
+      i++)
+    std::cout << i->second << ":" << i->first << "\n";
+  std::cout << "=====================\n";
+}
+
+
+
+
+
+
+
+
+