]> git.saurik.com Git - bison.git/blobdiff - src/symtab.c
* ro.po: New.
[bison.git] / src / symtab.c
index 08571d837126cc21657373f6365646d9f95045c6..53c9f677431b86b79d471357c40aac06869fdbf1 100644 (file)
@@ -1,4 +1,5 @@
-/* Symbol table manager for Bison,
+/* Symbol table manager for Bison.
+
    Copyright (C) 1984, 1989, 2000, 2001, 2002 Free Software Foundation, Inc.
 
    This file is part of Bison, the GNU Compiler Compiler.
    Copyright (C) 1984, 1989, 2000, 2001, 2002 Free Software Foundation, Inc.
 
    This file is part of Bison, the GNU Compiler Compiler.
 
 
 #include "system.h"
 
 
 #include "system.h"
-#include "hash.h"
+
+#include <hash.h>
+#include <quotearg.h>
+
 #include "complain.h"
 #include "complain.h"
-#include "symtab.h"
 #include "gram.h"
 #include "gram.h"
+#include "symtab.h"
 
 /*------------------------.
 | Distinguished symbols.  |
 `------------------------*/
 
 
 /*------------------------.
 | Distinguished symbols.  |
 `------------------------*/
 
-symbol_t *errtoken = NULL;
-symbol_t *undeftoken = NULL;
-symbol_t *eoftoken = NULL;
-symbol_t *axiom = NULL;
-symbol_t *startsymbol = NULL;
+symbol *errtoken = NULL;
+symbol *undeftoken = NULL;
+symbol *endtoken = NULL;
+symbol *accept = NULL;
+symbol *startsymbol = NULL;
+location startsymbol_location;
 
 /*---------------------------------.
 | Create a new symbol, named TAG.  |
 `---------------------------------*/
 
 
 /*---------------------------------.
 | Create a new symbol, named TAG.  |
 `---------------------------------*/
 
-static symbol_t *
-symbol_new (const char *tag)
+static symbol *
+symbol_new (uniqstr tag, location loc)
 {
 {
-  symbol_t *res = XMALLOC (symbol_t, 1);
+  symbol *res = MALLOC (res, 1);
+
+  uniqstr_assert (tag);
+  res->tag = tag;
+  res->location = loc;
 
 
-  res->tag = xstrdup (tag);
   res->type_name = NULL;
   res->type_name = NULL;
+  res->destructor = NULL;
+  res->printer = NULL;
+
   res->number = NUMBER_UNDEFINED;
   res->prec = 0;
   res->number = NUMBER_UNDEFINED;
   res->prec = 0;
-  res->assoc = right_assoc;
+  res->assoc = undef_assoc;
   res->user_token_number = USER_NUMBER_UNDEFINED;
   res->user_token_number = USER_NUMBER_UNDEFINED;
+
   res->alias = NULL;
   res->class = unknown_sym;
 
   nsyms++;
   res->alias = NULL;
   res->class = unknown_sym;
 
   nsyms++;
-
   return res;
 }
 
 
   return res;
 }
 
 
-/*-----------------------------------------.
-| Set the TYPE_NAME associated to SYMBOL.  |
-`-----------------------------------------*/
+/*-----------------------------------------------------------------.
+| Set the TYPE_NAME associated with SYM.  Does nothing if passed 0 |
+| as TYPE_NAME.                                                    |
+`-----------------------------------------------------------------*/
 
 void
 
 void
-symbol_type_set (symbol_t *symbol, char *type_name)
+symbol_type_set (symbol *sym, uniqstr type_name, location loc)
 {
 {
-  if (symbol->type_name)
-    complain (_("type redeclaration for %s"), symbol->tag);
-  symbol->type_name = type_name;
+  if (type_name)
+    {
+      if (sym->type_name)
+       complain_at (loc, _("type redeclaration for %s"), sym->tag);
+      uniqstr_assert (type_name);
+      sym->type_name = type_name;
+    }
 }
 
 
 }
 
 
-/*------------------------------------------.
-| Set the PRECEDENCE associated to SYMBOL.  |
-`------------------------------------------*/
+/*------------------------------------------------------------------.
+| Set the DESTRUCTOR associated with SYM.  Do nothing if passed 0.  |
+`------------------------------------------------------------------*/
 
 void
 
 void
-symbol_precedence_set (symbol_t *symbol,
-                      int prec, associativity assoc)
+symbol_destructor_set (symbol *sym, char *destructor, location loc)
 {
 {
-  if (symbol->prec != 0)
-    complain (_("redefining precedence of %s"), symbol->tag);
-  symbol->prec = prec;
-  symbol->assoc = assoc;
+  if (destructor)
+    {
+      if (sym->destructor)
+       complain_at (loc, _("%s redeclaration for %s"),
+                    "%destructor", sym->tag);
+      sym->destructor = destructor;
+      sym->destructor_location = loc;
+    }
 }
 
 
 }
 
 
-/*------------.
-| Free THIS.  |
-`------------*/
+/*---------------------------------------------------------------.
+| Set the PRINTER associated with SYM.  Do nothing if passed 0.  |
+`---------------------------------------------------------------*/
 
 
-static void
-symbol_free (symbol_t *this)
+void
+symbol_printer_set (symbol *sym, char *printer, location loc)
 {
 {
-#if 0
-  /* This causes crashes because one string can appear more
-     than once.  */
-  XFREE (this->type_name);
-#endif
-  XFREE (this->tag);
-  XFREE (this);
+  if (printer)
+    {
+      if (sym->printer)
+       complain_at (loc, _("%s redeclaration for %s"),
+                    "%printer", sym->tag);
+      sym->printer = printer;
+      sym->printer_location = loc;
+    }
 }
 
 
 }
 
 
-/*-----------------------------------------------------------.
-| If THIS is not defined, report an error, and consider it a |
-| nonterminal.                                               |
-`-----------------------------------------------------------*/
+/*-----------------------------------------------------------------.
+| Set the PRECEDENCE associated with SYM.  Does nothing if invoked |
+| with UNDEF_ASSOC as ASSOC.                                       |
+`-----------------------------------------------------------------*/
 
 
-static bool
-symbol_check_defined (symbol_t *this)
+void
+symbol_precedence_set (symbol *sym, int prec, assoc a, location loc)
 {
 {
-  if (this->class == unknown_sym)
+  if (a != undef_assoc)
     {
     {
-      complain
-       (_("symbol %s is used, but is not defined as a token and has no rules"),
-        this->tag);
-      this->class = nterm_sym;
-      this->number = nvars++;
+      if (sym->prec != 0)
+       complain_at (loc, _("redefining precedence of %s"), sym->tag);
+      sym->prec = prec;
+      sym->assoc = a;
     }
 
     }
 
-  return TRUE;
+  /* Only terminals have a precedence. */
+  symbol_class_set (sym, token_sym, loc);
 }
 
 
 }
 
 
-/*-------------------------------------------------------------------.
-| Declare the new SYMBOL.  Make it an alias of SYMVAL, and type them |
-| with TYPENAME.                                                     |
-`-------------------------------------------------------------------*/
+/*------------------------------------.
+| Set the CLASS associated with SYM.  |
+`------------------------------------*/
+
+void
+symbol_class_set (symbol *sym, symbol_class class, location loc)
+{
+  if (sym->class != unknown_sym && sym->class != class)
+    complain_at (loc, _("symbol %s redefined"), sym->tag);
+
+  if (class == nterm_sym && sym->class != nterm_sym)
+    sym->number = nvars++;
+  else if (class == token_sym && sym->number == NUMBER_UNDEFINED)
+    sym->number = ntokens++;
+
+  sym->class = class;
+}
+
+
+/*------------------------------------------------.
+| Set the USER_TOKEN_NUMBER associated with SYM.  |
+`------------------------------------------------*/
+
+void
+symbol_user_token_number_set (symbol *sym, int user_token_number, location loc)
+{
+  if (sym->class != token_sym)
+    abort ();
+
+  if (sym->user_token_number != USER_NUMBER_UNDEFINED
+      && sym->user_token_number != user_token_number)
+    complain_at (loc, _("redefining user token number of %s"), sym->tag);
+
+  sym->user_token_number = user_token_number;
+  /* User defined $end token? */
+  if (user_token_number == 0)
+    {
+      endtoken = sym;
+      endtoken->number = 0;
+      /* It is always mapped to 0, so it was already counted in
+        NTOKENS.  */
+      --ntokens;
+    }
+}
+
+
+/*----------------------------------------------------------.
+| If SYM is not defined, report an error, and consider it a |
+| nonterminal.                                              |
+`----------------------------------------------------------*/
+
+static inline bool
+symbol_check_defined (symbol *sym)
+{
+  if (sym->class == unknown_sym)
+    {
+      complain_at
+       (sym->location,
+        _("symbol %s is used, but is not defined as a token and has no rules"),
+        sym->tag);
+      sym->class = nterm_sym;
+      sym->number = nvars++;
+    }
+
+  return true;
+}
+
+static bool
+symbol_check_defined_processor (void *sym, void *null ATTRIBUTE_UNUSED)
+{
+  return symbol_check_defined (sym);
+}
+
+
+/*------------------------------------------------------------------.
+| Declare the new symbol SYM.  Make it an alias of SYMVAL, and type |
+| SYMVAL with SYM's type.                                           |
+`------------------------------------------------------------------*/
 
 void
 
 void
-symbol_make_alias (symbol_t *symbol, symbol_t *symval, char *typename)
+symbol_make_alias (symbol *sym, symbol *symval, location loc)
 {
   if (symval->alias)
 {
   if (symval->alias)
-    warn (_("symbol `%s' used more than once as a literal string"),
+    warn_at (loc, _("symbol `%s' used more than once as a literal string"),
          symval->tag);
          symval->tag);
-  else if (symbol->alias)
-    warn (_("symbol `%s' given more than one literal string"),
-         symbol->tag);
+  else if (sym->alias)
+    warn_at (loc, _("symbol `%s' given more than one literal string"),
+         sym->tag);
   else
     {
       symval->class = token_sym;
   else
     {
       symval->class = token_sym;
-      symval->type_name = typename;
-      symval->user_token_number = symbol->user_token_number;
-      symbol->user_token_number = USER_NUMBER_ALIAS;
-      symval->alias = symbol;
-      symbol->alias = symval;
-      /* symbol and symval combined are only one symbol */
+      symval->user_token_number = sym->user_token_number;
+      sym->user_token_number = USER_NUMBER_ALIAS;
+      symval->alias = sym;
+      sym->alias = symval;
+      /* sym and symval combined are only one symbol.  */
       nsyms--;
       ntokens--;
       nsyms--;
       ntokens--;
-      assert (ntokens == symbol->number || ntokens == symval->number);
-      symbol->number = symval->number =
-       (symval->number < symbol->number) ? symval->number : symbol->number;
+      if (ntokens != sym->number && ntokens != symval->number)
+       abort ();
+      sym->number = symval->number =
+       (symval->number < sym->number) ? symval->number : sym->number;
+      symbol_type_set (symval, sym->type_name, loc);
     }
 }
 
     }
 }
 
@@ -162,8 +257,8 @@ symbol_make_alias (symbol_t *symbol, symbol_t *symval, char *typename)
 | associativity.                                           |
 `---------------------------------------------------------*/
 
 | associativity.                                           |
 `---------------------------------------------------------*/
 
-static bool
-symbol_check_alias_consistence (symbol_t *this)
+static inline bool
+symbol_check_alias_consistency (symbol *this)
 {
   /* Check only those who _are_ the aliases. */
   if (this->alias && this->user_token_number == USER_NUMBER_ALIAS)
 {
   /* Check only those who _are_ the aliases. */
   if (this->alias && this->user_token_number == USER_NUMBER_ALIAS)
@@ -171,8 +266,9 @@ symbol_check_alias_consistence (symbol_t *this)
       if (this->prec != this->alias->prec)
        {
          if (this->prec != 0 && this->alias->prec != 0)
       if (this->prec != this->alias->prec)
        {
          if (this->prec != 0 && this->alias->prec != 0)
-           complain (_("conflicting precedences for %s and %s"),
-                     this->tag, this->alias->tag);
+           complain_at (this->alias->location,
+                        _("conflicting precedences for %s and %s"),
+                        this->tag, this->alias->tag);
          if (this->prec != 0)
            this->alias->prec = this->prec;
          else
          if (this->prec != 0)
            this->alias->prec = this->prec;
          else
@@ -181,16 +277,25 @@ symbol_check_alias_consistence (symbol_t *this)
 
       if (this->assoc != this->alias->assoc)
        {
 
       if (this->assoc != this->alias->assoc)
        {
-         if (this->assoc != 0 && this->alias->assoc != 0)
-           complain (_("conflicting assoc values for %s and %s"),
-                     this->tag, this->alias->tag);
-         if (this->assoc != 0)
+         if (this->assoc != undef_assoc && this->alias->assoc != undef_assoc)
+           complain_at (this->alias->location,
+                        _("conflicting associativities for %s (%s) and %s (%s)"),
+                        this->tag, assoc_to_string (this->assoc),
+                        this->alias->tag, assoc_to_string (this->alias->assoc));
+         if (this->assoc != undef_assoc)
            this->alias->assoc = this->assoc;
          else
            this->assoc = this->alias->assoc;
        }
     }
            this->alias->assoc = this->assoc;
          else
            this->assoc = this->alias->assoc;
        }
     }
-  return TRUE;
+  return true;
+}
+
+static bool
+symbol_check_alias_consistency_processor (void *this,
+                                         void *null ATTRIBUTE_UNUSED)
+{
+  return symbol_check_alias_consistency (this);
 }
 
 
 }
 
 
@@ -199,8 +304,8 @@ symbol_check_alias_consistence (symbol_t *this)
 | into FDEFINES.  Put in SYMBOLS.                                    |
 `-------------------------------------------------------------------*/
 
 | into FDEFINES.  Put in SYMBOLS.                                    |
 `-------------------------------------------------------------------*/
 
-static bool
-symbol_pack (symbol_t *this)
+static inline bool
+symbol_pack (symbol *this)
 {
   if (this->class == nterm_sym)
     {
 {
   if (this->class == nterm_sym)
     {
@@ -213,25 +318,33 @@ symbol_pack (symbol_t *this)
         prec and assoc fields and make both the same */
       if (this->number == NUMBER_UNDEFINED)
        {
         prec and assoc fields and make both the same */
       if (this->number == NUMBER_UNDEFINED)
        {
-         if (this == eoftoken || this->alias == eoftoken)
+         if (this == endtoken || this->alias == endtoken)
            this->number = this->alias->number = 0;
          else
            {
            this->number = this->alias->number = 0;
          else
            {
-             assert (this->alias->number != NUMBER_UNDEFINED);
+             if (this->alias->number == NUMBER_UNDEFINED)
+               abort ();
              this->number = this->alias->number;
            }
        }
              this->number = this->alias->number;
            }
        }
-      /* Do not do processing below for USER_NUMBER_ALIASs.  */
+      /* Do not do processing below for USER_NUMBER_ALIASes.  */
       if (this->user_token_number == USER_NUMBER_ALIAS)
       if (this->user_token_number == USER_NUMBER_ALIAS)
-       return TRUE;
+       return true;
     }
   else /* this->class == token_sym */
     {
     }
   else /* this->class == token_sym */
     {
-      assert (this->number != NUMBER_UNDEFINED);
+      if (this->number == NUMBER_UNDEFINED)
+       abort ();
     }
 
   symbols[this->number] = this;
     }
 
   symbols[this->number] = this;
-  return TRUE;
+  return true;
+}
+
+static bool
+symbol_pack_processor (void *this, void *null ATTRIBUTE_UNUSED)
+{
+  return symbol_pack (this);
 }
 
 
 }
 
 
@@ -241,8 +354,8 @@ symbol_pack (symbol_t *this)
 | Put THIS in TOKEN_TRANSLATIONS if it is a token.  |
 `--------------------------------------------------*/
 
 | Put THIS in TOKEN_TRANSLATIONS if it is a token.  |
 `--------------------------------------------------*/
 
-static bool
-symbol_translation (symbol_t *this)
+static inline bool
+symbol_translation (symbol *this)
 {
   /* Non-terminal? */
   if (this->class == token_sym
 {
   /* Non-terminal? */
   if (this->class == token_sym
@@ -250,14 +363,21 @@ symbol_translation (symbol_t *this)
     {
       /* A token which translation has already been set? */
       if (token_translations[this->user_token_number] != undeftoken->number)
     {
       /* A token which translation has already been set? */
       if (token_translations[this->user_token_number] != undeftoken->number)
-       complain (_("tokens %s and %s both assigned number %d"),
-                 symbols[token_translations[this->user_token_number]]->tag,
-                 this->tag, this->user_token_number);
+       complain_at (this->location,
+                    _("tokens %s and %s both assigned number %d"),
+                    symbols[token_translations[this->user_token_number]]->tag,
+                    this->tag, this->user_token_number);
 
       token_translations[this->user_token_number] = this->number;
     }
 
 
       token_translations[this->user_token_number] = this->number;
     }
 
-  return TRUE;
+  return true;
+}
+
+static bool
+symbol_translation_processor (void *this, void *null ATTRIBUTE_UNUSED)
+{
+  return symbol_translation (this);
 }
 
 
 }
 
 
@@ -270,16 +390,30 @@ symbol_translation (symbol_t *this)
 
 static struct hash_table *symbol_table = NULL;
 
 
 static struct hash_table *symbol_table = NULL;
 
+static inline bool
+hash_compare_symbol (const symbol *m1, const symbol *m2)
+{
+  /* Since tags are unique, we can compare the pointers themselves.  */
+  return UNIQSTR_EQ (m1->tag, m2->tag);
+}
+
 static bool
 static bool
-hash_compare_symbol_t (const symbol_t *m1, const symbol_t *m2)
+hash_symbol_comparator (void const *m1, void const *m2)
+{
+  return hash_compare_symbol (m1, m2);
+}
+
+static inline unsigned int
+hash_symbol (const symbol *m, unsigned int tablesize)
 {
 {
-  return strcmp (m1->tag, m2->tag) ? FALSE : TRUE;
+  /* Since tags are unique, we can hash the pointer itself.  */
+  return ((uintptr_t) m->tag) % tablesize;
 }
 
 static unsigned int
 }
 
 static unsigned int
-hash_symbol_t (const symbol_t *m, unsigned int tablesize)
+hash_symbol_hasher (void const *m, unsigned int tablesize)
 {
 {
-  return hash_string (m->tag, tablesize);
+  return hash_symbol (m, tablesize);
 }
 
 
 }
 
 
@@ -292,9 +426,9 @@ symbols_new (void)
 {
   symbol_table = hash_initialize (HT_INITIAL_CAPACITY,
                                  NULL,
 {
   symbol_table = hash_initialize (HT_INITIAL_CAPACITY,
                                  NULL,
-                                 (Hash_hasher) hash_symbol_t,
-                                 (Hash_comparator) hash_compare_symbol_t,
-                                 (Hash_data_freer) symbol_free);
+                                 hash_symbol_hasher,
+                                 hash_symbol_comparator,
+                                 free);
 }
 
 
 }
 
 
@@ -303,25 +437,49 @@ symbols_new (void)
 | yet, create it.                                                 |
 `----------------------------------------------------------------*/
 
 | yet, create it.                                                 |
 `----------------------------------------------------------------*/
 
-symbol_t *
-getsym (const char *key)
+symbol *
+symbol_get (const char *key, location loc)
 {
 {
-  symbol_t probe;
-  symbol_t *entry;
+  symbol probe;
+  symbol *entry;
 
 
-  (const char *) probe.tag = key;
+  /* Keep the symbol in a printable form.  */
+  key = uniqstr_new (quotearg_style (escape_quoting_style, key));
+  probe.tag = key;
   entry = hash_lookup (symbol_table, &probe);
 
   if (!entry)
     {
       /* First insertion in the hash. */
   entry = hash_lookup (symbol_table, &probe);
 
   if (!entry)
     {
       /* First insertion in the hash. */
-      entry = symbol_new (key);
+      entry = symbol_new (key, loc);
       hash_insert (symbol_table, entry);
     }
   return entry;
 }
 
 
       hash_insert (symbol_table, entry);
     }
   return entry;
 }
 
 
+/*------------------------------------------------------------------.
+| Generate a dummy nonterminal, whose name cannot conflict with the |
+| user's names.                                                     |
+`------------------------------------------------------------------*/
+
+symbol *
+dummy_symbol_get (location loc)
+{
+  /* Incremented for each generated symbol.  */
+  static int dummy_count = 0;
+  static char buf[256];
+
+  symbol *sym;
+
+  sprintf (buf, "@%d", ++dummy_count);
+  sym = symbol_get (buf, loc);
+  sym->class = nterm_sym;
+  sym->number = nvars++;
+  return sym;
+}
+
+
 /*-------------------.
 | Free the symbols.  |
 `-------------------*/
 /*-------------------.
 | Free the symbols.  |
 `-------------------*/
@@ -330,6 +488,7 @@ void
 symbols_free (void)
 {
   hash_free (symbol_table);
 symbols_free (void)
 {
   hash_free (symbol_table);
+  free (symbols);
 }
 
 
 }
 
 
@@ -338,12 +497,10 @@ symbols_free (void)
 | terminals.                                                     |
 `---------------------------------------------------------------*/
 
 | terminals.                                                     |
 `---------------------------------------------------------------*/
 
-void
-symbols_do (symbol_processor processor, void *processor_data)
+static void
+symbols_do (Hash_processor processor, void *processor_data)
 {
 {
-  hash_do_for_each (symbol_table,
-                   (Hash_processor) processor,
-                   processor_data);
+  hash_do_for_each (symbol_table, processor, processor_data);
 }
 
 
 }
 
 
@@ -355,7 +512,7 @@ symbols_do (symbol_processor processor, void *processor_data)
 void
 symbols_check_defined (void)
 {
 void
 symbols_check_defined (void)
 {
-  symbols_do (symbol_check_defined, NULL);
+  symbols_do (symbol_check_defined_processor, NULL);
 }
 
 /*------------------------------------------------------------------.
 }
 
 /*------------------------------------------------------------------.
@@ -366,7 +523,7 @@ symbols_check_defined (void)
 static void
 symbols_token_translations_init (void)
 {
 static void
 symbols_token_translations_init (void)
 {
-  int num_256_available_p = TRUE;
+  bool num_256_available_p = true;
   int i;
 
   /* Find the highest user token number, and whether 256, the POSIX
   int i;
 
   /* Find the highest user token number, and whether 256, the POSIX
@@ -374,13 +531,13 @@ symbols_token_translations_init (void)
   max_user_token_number = 0;
   for (i = 0; i < ntokens; ++i)
     {
   max_user_token_number = 0;
   for (i = 0; i < ntokens; ++i)
     {
-      symbol_t *this = symbols[i];
+      symbol *this = symbols[i];
       if (this->user_token_number != USER_NUMBER_UNDEFINED)
        {
          if (this->user_token_number > max_user_token_number)
            max_user_token_number = this->user_token_number;
          if (this->user_token_number == 256)
       if (this->user_token_number != USER_NUMBER_UNDEFINED)
        {
          if (this->user_token_number > max_user_token_number)
            max_user_token_number = this->user_token_number;
          if (this->user_token_number == 256)
-           num_256_available_p = FALSE;
+           num_256_available_p = false;
        }
     }
 
        }
     }
 
@@ -395,21 +552,21 @@ symbols_token_translations_init (void)
 
   for (i = 0; i < ntokens; ++i)
     {
 
   for (i = 0; i < ntokens; ++i)
     {
-      symbol_t *this = symbols[i];
+      symbol *this = symbols[i];
       if (this->user_token_number == USER_NUMBER_UNDEFINED)
        this->user_token_number = ++max_user_token_number;
       if (this->user_token_number > max_user_token_number)
        max_user_token_number = this->user_token_number;
     }
 
       if (this->user_token_number == USER_NUMBER_UNDEFINED)
        this->user_token_number = ++max_user_token_number;
       if (this->user_token_number > max_user_token_number)
        max_user_token_number = this->user_token_number;
     }
 
-  token_translations = XCALLOC (symbol_number_t, max_user_token_number + 1);
+  CALLOC (token_translations, max_user_token_number + 1);
 
   /* Initialize all entries for literal tokens to 2, the internal
 
   /* Initialize all entries for literal tokens to 2, the internal
-     token number for $undefined., which represents all invalid
-     inputs.  */
+     token number for $undefined, which represents all invalid inputs.
+     */
   for (i = 0; i < max_user_token_number + 1; i++)
     token_translations[i] = undeftoken->number;
   for (i = 0; i < max_user_token_number + 1; i++)
     token_translations[i] = undeftoken->number;
-  symbols_do (symbol_translation, NULL);
+  symbols_do (symbol_translation_processor, NULL);
 }
 
 
 }
 
 
@@ -421,15 +578,19 @@ symbols_token_translations_init (void)
 void
 symbols_pack (void)
 {
 void
 symbols_pack (void)
 {
-  symbols = XCALLOC (symbol_t *, nsyms);
+  CALLOC (symbols, nsyms);
 
 
-  symbols_do (symbol_check_alias_consistence, NULL);
-  symbols_do (symbol_pack, NULL);
+  symbols_do (symbol_check_alias_consistency_processor, NULL);
+  symbols_do (symbol_pack_processor, NULL);
 
   symbols_token_translations_init ();
 
   if (startsymbol->class == unknown_sym)
 
   symbols_token_translations_init ();
 
   if (startsymbol->class == unknown_sym)
-    fatal (_("the start symbol %s is undefined"), startsymbol->tag);
+    fatal_at (startsymbol_location,
+             _("the start symbol %s is undefined"),
+             startsymbol->tag);
   else if (startsymbol->class == token_sym)
   else if (startsymbol->class == token_sym)
-    fatal (_("the start symbol %s is a token"), startsymbol->tag);
+    fatal_at (startsymbol_location,
+             _("the start symbol %s is a token"),
+             startsymbol->tag);
 }
 }