bison-patches
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[PATCH] Define the "identifier" of a symbol.


From: Akim Demaille
Subject: [PATCH] Define the "identifier" of a symbol.
Date: Thu, 13 Nov 2008 05:21:06 -0000

Symbols may have several string representations, for instance if they
have an alias.  What I call its "id" is a string that can be used as
an identifier.  May not exist.

Currently the symbols which have the "tag_is_id" flag set are those that
don't have an alias.  Look harder for the id.

        * src/output.c (is_identifier): Move to...
        * src/symtab.c (is_identifier): here.
        * src/symtab.h, src/symtab.c (symbol_id_get): New.
        * src/output.c (symbol_definitions_output): Use it to define "id"
        and "has_id".
        Remove the definition of "tag_is_id".
        * data/lalr1.cc: Use the "id" and "has_id" whereever "tag" and
        "tag_is_id" were used to produce code.
        We still use "tag" for documentation.
---
 ChangeLog     |   20 ++++++++++++++++++++
 data/lalr1.cc |   10 +++++-----
 src/output.c  |   34 ++++++++++------------------------
 src/symtab.c  |   35 +++++++++++++++++++++++++++++++++++
 src/symtab.h  |   24 ++++++++++++++++++++----
 5 files changed, 90 insertions(+), 33 deletions(-)

diff --git a/ChangeLog b/ChangeLog
index d5d3800..3ea95f1 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,23 @@
+2008-11-13  Akim Demaille  <address@hidden>
+
+       Define the "identifier" of a symbol.
+       Symbols may have several string representations, for instance if they
+       have an alias.  What I call its "id" is a string that can be used as
+       an identifier.  May not exist.
+       
+       Currently the symbols which have the "tag_is_id" flag set are those that
+       don't have an alias.  Look harder for the id.
+       
+       * src/output.c (is_identifier): Move to...
+       * src/symtab.c (is_identifier): here.
+       * src/symtab.h, src/symtab.c (symbol_id_get): New.
+       * src/output.c (symbol_definitions_output): Use it to define "id"
+       and "has_id".
+       Remove the definition of "tag_is_id".
+       * data/lalr1.cc: Use the "id" and "has_id" whereever "tag" and
+       "tag_is_id" were used to produce code.
+       We still use "tag" for documentation.
+
 2008-11-11  Akim Demaille  <address@hidden>
 
        Locations are no longer required by lalr1.cc.
diff --git a/data/lalr1.cc b/data/lalr1.cc
index fd5e5ec..01b8166 100644
--- a/data/lalr1.cc
+++ b/data/lalr1.cc
@@ -225,11 +225,11 @@ m4_map([b4_symbol_constructor_declaration_], 
m4_defn([b4_type_names]))])])
 # Specializations cannot be declared at class-level, this must be done
 # at namespace-level.
 m4_define([b4_symbol_constructor_specialization_],
-[b4_symbol_if([$1], [is_token], [b4_symbol_if([$1], [tag_is_id],
+[b4_symbol_if([$1], [is_token], [b4_symbol_if([$1], [has_id],
 [  template <>
   inline
   b4_parser_class_name::symbol_type
-  b4_parser_class_name::make_symbol 
<b4_parser_class_name::token::b4_symbol([$1], [tag])> (dnl
+  b4_parser_class_name::make_symbol 
<b4_parser_class_name::token::b4_symbol([$1], [id])> (dnl
 b4_args(b4_symbol_if([$1], [has_type_name],
                      [const b4_symbol([$1], [type_name])& v]),
         b4_locations_if([const b4_parser_class_name::location_type& l])));
@@ -251,15 +251,15 @@ m4_map([b4_symbol_constructor_specialization_],
 # ------------------------------------------------
 # Define make_symbol for this SYMBOL-NUMBER.
 m4_define([b4_symbol_constructor_definition_],
-[b4_symbol_if([$1], [is_token], [b4_symbol_if([$1], [tag_is_id],
+[b4_symbol_if([$1], [is_token], [b4_symbol_if([$1], [has_id],
 [  template <>
   b4_parser_class_name::symbol_type
-  b4_parser_class_name::make_symbol 
<b4_parser_class_name::token::b4_symbol([$1], [tag])> (dnl
+  b4_parser_class_name::make_symbol 
<b4_parser_class_name::token::b4_symbol([$1], [id])> (dnl
 b4_args(b4_symbol_if([$1], [has_type_name],
                      [const b4_symbol([$1], [type_name])& v]),
         b4_locations_if([const location_type& l])))
   {
-    return symbol_type (b4_args([yytranslate_ (token::b4_symbol([$1], [tag]))],
+    return symbol_type (b4_args([yytranslate_ (token::b4_symbol([$1], [id]))],
                                 b4_symbol_if([$1], [has_type_name], [v]),
                                 b4_locations_if([l])));
   }
diff --git a/src/output.c b/src/output.c
index afcec94..4759164 100644
--- a/src/output.c
+++ b/src/output.c
@@ -396,26 +396,6 @@ merger_output (FILE *out)
 }
 
 
-/*----------------------------------.
-| Whether S is a valid identifier.  |
-`----------------------------------*/
-
-static bool
-is_identifier (uniqstr s)
-{
-  static char const alphanum[26 + 26 + 1 + 10] =
-    "abcdefghijklmnopqrstuvwxyz"
-    "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
-    "_"
-    "0123456789";
-  if (!s || ! memchr (alphanum, *s, sizeof alphanum - 10))
-    return false;
-  for (++s; *s; ++s)
-    if (! memchr (alphanum, *s, sizeof alphanum))
-      return false;
-  return true;
-}
-
 /*---------------------------------------.
 | Output the symbol definitions to OUT.  |
 `---------------------------------------*/
@@ -428,17 +408,23 @@ symbol_definitions_output (FILE *out)
     {
       symbol *sym = symbols[i];
       const char *key;
+      const char *value;
 
 #define SET_KEY(Entry)                                                  \
       obstack_fgrow2 (&format_obstack, "symbol(%d, %s)", i, Entry);     \
       obstack_1grow (&format_obstack, 0);                               \
       key = obstack_finish (&format_obstack);
 
-      // Whether the tag is a valid identifier.
-      SET_KEY("tag_is_id");
-      MUSCLE_INSERT_INT (key, is_identifier(sym->tag));
+      // Whether the symbol has an identifier.
+      value = symbol_id_get (sym);
+      SET_KEY("has_id");
+      MUSCLE_INSERT_INT (key, !!value);
+
+      // Its identifier.
+      SET_KEY("id");
+      MUSCLE_INSERT_STRING (key, value ? value : "");
 
-      // The inner tag.
+      // Its tag.  Typically for documentation purpose.
       SET_KEY("tag");
       MUSCLE_INSERT_STRING (key, sym->tag);
 
diff --git a/src/symtab.c b/src/symtab.c
index 13b7554..b65bdd4 100644
--- a/src/symtab.c
+++ b/src/symtab.c
@@ -128,6 +128,41 @@ symbol_print (symbol *s, FILE *f)
 #undef SYMBOL_ATTR_PRINT
 #undef SYMBOL_CODE_PRINT
 
+
+/*----------------------------------.
+| Whether S is a valid identifier.  |
+`----------------------------------*/
+
+static bool
+is_identifier (uniqstr s)
+{
+  static char const alphanum[26 + 26 + 1 + 10] =
+    "abcdefghijklmnopqrstuvwxyz"
+    "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
+    "_"
+    "0123456789";
+  if (!s || ! memchr (alphanum, *s, sizeof alphanum - 10))
+    return false;
+  for (++s; *s; ++s)
+    if (! memchr (alphanum, *s, sizeof alphanum))
+      return false;
+  return true;
+}
+
+
+/*-----------------------------------------------.
+| Get the identifier associated to this symbol.  |
+`-----------------------------------------------*/
+uniqstr
+symbol_id_get (symbol const *sym)
+{
+  aver (sym->user_token_number != USER_NUMBER_ALIAS);
+  if (sym->alias)
+    sym = sym->alias;
+  return is_identifier (sym->tag) ? sym->tag : 0;
+}
+
+
 /*------------------------------------------------------------------.
 | Complain that S's WHAT is redeclared at SECOND, and was first set |
 | at FIRST.                                                         |
diff --git a/src/symtab.h b/src/symtab.h
index fe37716..0e52162 100644
--- a/src/symtab.h
+++ b/src/symtab.h
@@ -1,6 +1,6 @@
 /* Definitions for symtab.c and callers, part of Bison.
 
-   Copyright (C) 1984, 1989, 1992, 2000, 2001, 2002, 2004, 2005, 2006, 2007
+   Copyright (C) 1984, 1989, 1992, 2000, 2001, 2002, 2004, 2005, 2006, 2007, 
2008
    Free Software Foundation, Inc.
 
    This file is part of Bison, the GNU Compiler Compiler.
@@ -105,9 +105,6 @@ struct symbol
 /* Undefined internal token number.  */
 #define NUMBER_UNDEFINED (-1)
 
-/** Print a symbol (for debugging). */
-void symbol_print (symbol *s, FILE *f);
-
 /** Fetch (or create) the symbol associated to KEY.  */
 symbol *symbol_from_uniqstr (const uniqstr key, location loc);
 
@@ -119,9 +116,23 @@ symbol *symbol_get (const char *key, location loc);
    Its name cannot conflict with the user's names.  */
 symbol *dummy_symbol_get (location loc);
 
+
+/*--------------------.
+| Methods on symbol.  |
+`--------------------*/
+
+/** Print a symbol (for debugging). */
+void symbol_print (symbol *s, FILE *f);
+
 /** Is this a dummy nonterminal?  */
 bool symbol_is_dummy (const symbol *sym);
 
+/** Return the name of the symbol that can be used as an identifier.
+ ** Consider the alias if needed.
+ ** Return 0 if there is none (e.g., the symbol is only defined as
+ ** a string). */
+uniqstr symbol_id_get (symbol const *sym);
+
 /** Declare the new symbol \c sym.  Make it an alias of \c symval.  */
 void symbol_make_alias (symbol *sym, symbol *symval, location loc);
 
@@ -161,6 +172,11 @@ void symbol_class_set (symbol *sym, symbol_class class, 
location loc,
 void symbol_user_token_number_set (symbol *sym, int user_number, location loc);
 
 
+
+/*------------------.
+| Special symbols.  |
+`------------------*/
+
 /** The error token. */
 extern symbol *errtoken;
 /** The token for unknown tokens.  */
-- 
1.6.0.2.588.g3102





reply via email to

[Prev in Thread] Current Thread [Next in Thread]