]> git.saurik.com Git - bison.git/commitdiff
output: use the token list to define the yytokentype
authorAkim Demaille <akim@lrde.epita.fr>
Sun, 22 Jul 2012 07:11:37 +0000 (09:11 +0200)
committerAkim Demaille <akim@lrde.epita.fr>
Sun, 22 Jul 2012 15:01:15 +0000 (17:01 +0200)
There are currently two systems used to pass information about tokens to
m4: the original one, and another, which is used for instance for
printers and destructors, variants etc.  Move to using only the latter.

* data/bison.m4 (b4_symbol_map, b4_token_visible_if)
(b4_token_has_definition, b4_any_token_visible_if, b4_token_format): New.
* data/c++.m4, data/c.m4, data/glr.c, data/java.m4: Adjust to use them.

data/bison.m4
data/c++.m4
data/c.m4
data/java.m4

index 58ed5d85532770f606035a6afc3b99e67242013d..1ec1799ffcacaacd5583d817ccb6b8962d699843 100644 (file)
@@ -326,6 +326,13 @@ b4_define_flag_if([yacc])               # Whether POSIX Yacc is emulated.
 ## Symbols.  ##
 ## --------- ##
 
+# In order to unify the handling of the various aspects of symbols
+# (tag, type_name, whether terminal, etc.), bison.exe defines one
+# macro per (token, field), where field can has_id, id, etc.: see
+# src/output.c:prepare_symbols_definitions().
+#
+# The following macros provide access to these values.
+
 # b4_symbol_(NUM, FIELD)
 # ----------------------
 # Recover a FIELD about symbol #NUM.  Thanks to m4_indir, fails if
@@ -406,6 +413,45 @@ m4_define([b4_symbol_case_],
 m4_define([b4_symbol_foreach],
           [m4_map([$1], m4_defn([b4_symbol_numbers]))])
 
+# b4_symbol_map(MACRO)
+# --------------------
+# Return a list (possibly empty elements) of MACRO invoked for each
+# SYMBOL-NUM.
+m4_define([b4_symbol_map],
+[m4_map_args_sep([$1(], [)], [,], b4_symbol_numbers)])
+
+
+# b4_token_visible_if(NUM, IF-TRUE, IF-FALSE)
+# -------------------------------------------
+# Whether NUM denotes a token that has an exported definition (i.e.,
+# shows in enum yytokentype).
+m4_define([b4_token_visible_if],
+[b4_symbol_if([$1], [is_token],
+              [b4_symbol_if([$1], [has_id], [$2], [$3])],
+              [$3])])
+
+# b4_token_has_definition(NUM)
+# ----------------------------
+# 1 if NUM is visible, nothing otherwise.
+m4_define([b4_token_has_definition],
+[b4_token_visible_if([$1], [1])])
+
+# b4_any_token_visible_if([IF-TRUE], [IF-FALSE])
+# ----------------------------------------------
+# Whether there is a token that needs to be defined.
+m4_define([b4_any_token_visible_if],
+[m4_ifval(b4_symbol_foreach([b4_token_has_definition]),
+          [$1], [$2])])
+
+
+# b4_token_format(FORMAT, NUM)
+# ----------------------------
+m4_define([b4_token_format],
+[b4_token_visible_if([$2],
+[m4_quote(m4_format([$1],
+                     [b4_symbol([$2], [id])],
+                     [b4_symbol([$2], [user_number])]))])])
+
 
 ## ------- ##
 ## Types.  ##
index a64777c394fe4e5dda9fdf81d27e376e54afd53a..62374be15b34904dd111602517d2229ada21ca47 100644 (file)
@@ -86,16 +86,16 @@ m4_bpatsubst(m4_dquote(m4_bpatsubst(m4_dquote(b4_namespace_ref[ ]),
              [::\([^][:]\|:[^:]\)*], [} ])[} // ]b4_namespace_ref])])
 
 
-# b4_token_enums(LIST-OF-PAIRS-TOKEN-NAME-TOKEN-NUMBER)
-# -----------------------------------------------------
+# b4_token_enums
+# --------------
 # Output the definition of the tokens as enums.
 m4_define([b4_token_enums],
-[/* Tokens.  */
-   enum yytokentype {
-m4_map_sep([     b4_token_enum], [,
-],
-           [$@])
-   };
+[[enum yytokentype
+      {
+        ]m4_join([,
+        ],
+                 b4_symbol_map([b4_token_enum]))[
+      };]dnl
 ])
 
 
@@ -143,7 +143,7 @@ m4_define([b4_public_types_declare],
     /// Tokens.
     struct token
     {
-      ]b4_token_enums(b4_tokens)[
+      ]b4_token_enums[
     };
 
     /// Token type.
index adf5d4f104307f8a03322043d412c59136a1abf9..ded8e374a7c939348d1ab51f7c4d185c61ade950 100644 (file)
--- a/data/c.m4
+++ b/data/c.m4
@@ -250,57 +250,54 @@ static const b4_int_type_for([$2]) yy$1[[]] =
 ## Assigning token numbers.  ##
 ## ------------------------- ##
 
-# b4_token_define(TOKEN-NAME, TOKEN-NUMBER)
-# -----------------------------------------
+# b4_token_define(TOKEN-NUM)
+# --------------------------
 # Output the definition of this token as #define.
 m4_define([b4_token_define],
-[#define b4_percent_define_get([api.tokens.prefix])$1 $2
-])
-
+[b4_token_format([#define %s %s], [$1])])
 
-# b4_token_defines(LIST-OF-PAIRS-TOKEN-NAME-TOKEN-NUMBER)
-# -------------------------------------------------------
-# Output the definition of the tokens (if there are) as #defines.
+# b4_token_defines
+# ----------------
+# Output the definition of the tokens.
 m4_define([b4_token_defines],
-[m4_if([$#$1], [1], [],
-[/* Tokens.  */
-m4_map([b4_token_define], [$@])])
-])
+[b4_any_token_visible_if([/* Tokens.  */
+m4_join([
+], b4_symbol_map([b4_token_define]))
+])])
 
 
-# b4_token_enum(TOKEN-NAME, TOKEN-NUMBER)
-# ---------------------------------------
+# b4_token_enum(TOKEN-NUM)
+# ------------------------
 # Output the definition of this token as an enum.
 m4_define([b4_token_enum],
-[b4_percent_define_get([api.tokens.prefix])$1 = $2])
+[b4_token_format([%s = %s], [$1])])
 
 
-# b4_token_enums(LIST-OF-PAIRS-TOKEN-NAME-TOKEN-NUMBER)
-# -----------------------------------------------------
+# b4_token_enums
+# --------------
 # Output the definition of the tokens (if there are) as enums.
 m4_define([b4_token_enums],
-[m4_if([$#$1], [1], [],
-[[/* Tokens.  */
+[b4_any_token_visible_if([[/* Tokens.  */
 #ifndef ]b4_api_PREFIX[TOKENTYPE
 # define ]b4_api_PREFIX[TOKENTYPE
-   /* Put the tokens into the symbol table, so that GDB and other debuggers
-      know about them.  */
-   enum ]b4_api_prefix[tokentype {
-]m4_map_sep([     b4_token_enum], [,
-],
-           [$@])
-   };[
+  /* Put the tokens into the symbol table, so that GDB and other debuggers
+     know about them.  */
+  enum ]b4_api_prefix[tokentype
+  {
+    ]m4_join([,
+    ],
+             b4_symbol_map([b4_token_enum]))[
+  };
 #endif
 ]])])
 
 
-# b4_token_enums_defines(LIST-OF-PAIRS-TOKEN-NAME-TOKEN-NUMBER)
-# -------------------------------------------------------------
-# Output the definition of the tokens (if there are any) as enums and, if POSIX
-# Yacc is enabled, as #defines.
+# b4_token_enums_defines
+# ----------------------
+# Output the definition of the tokens (if there are any) as enums and,
+# if POSIX Yacc is enabled, as #defines.
 m4_define([b4_token_enums_defines],
-[b4_token_enums($@)b4_yacc_if([b4_token_defines($@)], [])
-])
+[b4_token_enums[]b4_yacc_if([b4_token_defines])])
 
 
 ## ----------------- ##
index 1b8666e4672b3dfc1e72c2eb21ba9419875ef7e9..cd70852c148a51151d9fb1fc7dec5cac4ca43fd5 100644 (file)
@@ -142,23 +142,20 @@ m4_define([b4_integral_parser_table_define],
 ## Assigning token numbers.  ##
 ## ------------------------- ##
 
-# b4_token_enum(TOKEN-NAME, TOKEN-NUMBER)
-# ---------------------------------------
+# b4_token_enum(TOKEN-NUM)
+# ------------------------
 # Output the definition of this token as an enum.
 m4_define([b4_token_enum],
-[    /** Token number, to be returned by the scanner.  */
-    static final int b4_percent_define_get([api.tokens.prefix])$1 = $2;
-])
-
+[b4_token_format([    /** Token number, to be returned by the scanner.  */
+    static final int %s = %s;
+], [$1])])
 
-# b4_token_enums(LIST-OF-PAIRS-TOKEN-NAME-TOKEN-NUMBER)
-# -----------------------------------------------------
+# b4_token_enums
+# --------------
 # Output the definition of the tokens (if there are) as enums.
 m4_define([b4_token_enums],
-[m4_if([$#$1], [1], [],
-[/* Tokens.  */
-m4_map([b4_token_enum], [$@])])
-])
+[b4_any_token_visible_if([/* Tokens.  */
+b4_symbol_foreach([b4_token_enum])])])
 
 # b4-case(ID, CODE)
 # -----------------