bison-patches
[Top][All Lists]
Advanced

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

RFC: rename parser_class_name as api.parser.class


From: Akim Demaille
Subject: RFC: rename parser_class_name as api.parser.class
Date: Wed, 2 Jan 2019 08:13:23 +0100

We've never finished cleaning up the muscle names.  If D really makes it into 
Bison, it would be sad that they use such inconsistent names, so let's finish 
this soon.

I'm not very happy with api.parser.class, if someone has a better idea, please 
step forward!  I have avoided api.parser.type, because api.value.type and 
api.location.type are not about declaring a type, but using a type.  I think 
that api.parser.class.name is too long.  But we do have api.value.union.name 
already.

So api.parser.class.name could be better, but I'd be happy to have opinions.

commit bc191870be7367476989ad45e427998c3255c3d7
Author: Akim Demaille <address@hidden>
Date:   Tue Jan 1 16:55:52 2019 +0100

    style: rename parser_class_name as api.parser.class
    
    The previous name was historical and inconsistent.
    
    * src/muscle-tab.c (define_directive): Use the proper value passing
    syntax, based on the muscle kind.
    (muscle_percent_variable_update): Use the right value passing syntax.
    Migrate from parser_class_name to api.parser.class.
    
    * data/skeletons: Migrate from parser_class_name to api.parser.class.
    
    * doc/bison.texi (%define Summary): Document both parser_class_name
    and api.parser.class.
    Promote the latter over the former.

diff --git a/NEWS b/NEWS
index 1e253c0f..b37517ca 100644
--- a/NEWS
+++ b/NEWS
@@ -22,6 +22,11 @@ GNU Bison NEWS
   The use of the %error-verbose directive is deprecated in favor of "%define
   parse.error verbose" since Bison 3.0, but no warning was issued.
 
+  The following variables have been renamed for consistency.  Backward
+  compatibility is ensured, but upgrading is recommended.
+
+    parser_class_name          -> api.parser.class
+
 ** New features
 
 *** Bison is now relocatable
diff --git a/data/skeletons/README-D.txt b/data/skeletons/README-D.txt
index 171187e7..214e3099 100644
--- a/data/skeletons/README-D.txt
+++ b/data/skeletons/README-D.txt
@@ -44,7 +44,7 @@ public interface Lexer
 - the following (non-standard) %defines are supported:
 
   %define package "<package_name>"
-  %define parser_class_name "my_class_name>"
+  %define api.parser.class "my_class_name>"
   %define position_type "my_position_type"
   %define location_type "my_location_type"
 
diff --git a/data/skeletons/c++.m4 b/data/skeletons/c++.m4
index 82b0d0e8..64fdeb44 100644
--- a/data/skeletons/c++.m4
+++ b/data/skeletons/c++.m4
@@ -25,7 +25,7 @@ b4_percent_define_ifdef([[api.value.union.name]],
 m4_include(b4_skeletonsdir/[c.m4])
 
 b4_percent_define_check_kind([api.namespace], [code], [deprecated])
-b4_percent_define_check_kind([parser_class_name], [code], [deprecated])
+b4_percent_define_check_kind([api.parser.class], [code], [deprecated])
 
 
 ## ----- ##
@@ -94,7 +94,7 @@ m4_define([b4_cxx_portability],
 ## Default values.  ##
 ## ---------------- ##
 
-b4_percent_define_default([[parser_class_name]], [[parser]])
+b4_percent_define_default([[api.parser.class]], [[parser]])
 
 # Don't do that so that we remember whether we're using a user
 # request, or the default value.
diff --git a/data/skeletons/d.m4 b/data/skeletons/d.m4
index e874e1dd..163cb89d 100644
--- a/data/skeletons/d.m4
+++ b/data/skeletons/d.m4
@@ -178,8 +178,8 @@ b4_percent_define_default([[stype]], [[YYSemanticType]])])
 # %name-prefix
 m4_define_default([b4_prefix], [[YY]])
 
-b4_percent_define_default([[parser_class_name]], [b4_prefix[]YYParser])])
-m4_define([b4_parser_class], [b4_percent_define_get([[parser_class_name]])])
+b4_percent_define_default([[api.parser.class]], [b4_prefix[]YYParser])])
+m4_define([b4_parser_class], [b4_percent_define_get([[api.parser.class]])])
 
 #b4_percent_define_default([[location_type]], [Location])])
 m4_define([b4_location_type], 
b4_percent_define_ifdef([[location_type]],[b4_percent_define_get([[location_type]])],[YYLocation]))
diff --git a/data/skeletons/glr.cc b/data/skeletons/glr.cc
index dbf89fea..e36fec9b 100644
--- a/data/skeletons/glr.cc
+++ b/data/skeletons/glr.cc
@@ -50,7 +50,7 @@ m4_include(b4_skeletonsdir/[c++.m4])
 b4_bison_locations_if([m4_include(b4_skeletonsdir/[location.cc])])
 
 m4_define([b4_parser_class],
-          [b4_percent_define_get([[parser_class_name]])])
+          [b4_percent_define_get([[api.parser.class]])])
 
 # Save the parse parameters.
 m4_define([b4_parse_param_orig], m4_defn([b4_parse_param]))
diff --git a/data/skeletons/java.m4 b/data/skeletons/java.m4
index 1d34d1ce..a79a764c 100644
--- a/data/skeletons/java.m4
+++ b/data/skeletons/java.m4
@@ -180,7 +180,7 @@ b4_percent_define_check_kind([[extends]],           [code], 
[deprecated])
 b4_percent_define_check_kind([[implements]],        [code], [deprecated])
 b4_percent_define_check_kind([[init_throws]],       [code], [deprecated])
 b4_percent_define_check_kind([[lex_throws]],        [code], [deprecated])
-b4_percent_define_check_kind([[parser_class_name]], [code], [deprecated])
+b4_percent_define_check_kind([[api.parser.class]], [code], [deprecated])
 b4_percent_define_check_kind([[throws]],            [code], [deprecated])
 
 
@@ -195,8 +195,8 @@ b4_percent_define_default([[api.value.type]], [[Object]])
 # %name-prefix
 m4_define_default([b4_prefix], [[YY]])
 
-b4_percent_define_default([[parser_class_name]], [b4_prefix[]Parser])
-m4_define([b4_parser_class], [b4_percent_define_get([[parser_class_name]])])
+b4_percent_define_default([[api.parser.class]], [b4_prefix[]Parser])
+m4_define([b4_parser_class], [b4_percent_define_get([[api.parser.class]])])
 
 b4_percent_define_default([[lex_throws]], [[java.io.IOException]])
 m4_define([b4_lex_throws], [b4_percent_define_get([[lex_throws]])])
diff --git a/data/skeletons/lalr1.cc b/data/skeletons/lalr1.cc
index 58e8f897..9e89cf6d 100644
--- a/data/skeletons/lalr1.cc
+++ b/data/skeletons/lalr1.cc
@@ -138,7 +138,7 @@ m4_pushdef([b4_copyright_years],
            [2002-2015, 2018])
 
 m4_define([b4_parser_class],
-          [b4_percent_define_get([[parser_class_name]])])
+          [b4_percent_define_get([[api.parser.class]])])
 
 b4_bison_locations_if([# Backward compatibility.
    m4_define([b4_location_constructors])
diff --git a/doc/bison.texi b/doc/bison.texi
index 3f5af7db..5902289c 100644
--- a/doc/bison.texi
+++ b/doc/bison.texi
@@ -1807,10 +1807,10 @@ token type is an identifier, that identifier is defined 
by Bison as a C
 macro whose definition is the appropriate number.  In this example,
 therefore, @code{NUM} becomes a macro for @code{yylex} to use.
 
-The semantic value of the token (if it has one) is stored into the
-global variable @code{yylval}, which is where the Bison parser will look
-for it.  (The C data type of @code{yylval} is @code{YYSTYPE}, whose value
-was defined at the beginning of the grammar via @samp{%define api.value.type
+The semantic value of the token (if it has one) is stored into the global
+variable @code{yylval}, which is where the Bison parser will look for it.
+(The C data type of @code{yylval} is @code{YYSTYPE}, whose value was defined
+at the beginning of the grammar via @samp{%define api.value.type
 @address@hidden; @pxref{Rpcalc Declarations,,Declarations for @code{rpcalc}}.)
 
 A token type code of zero is returned if the end-of-input is encountered.
@@ -5987,6 +5987,29 @@ Introduced in Bison 2.7 for C, C++ and Java.  Introduced 
under the name
 @end itemize
 @end deffn
 
address@hidden ================================================== 
api.parser.class
address@hidden Directive {%define api.parser.class} @address@hidden@}
address@hidden @bullet
address@hidden Language(s):
+C++, Java
+
address@hidden Purpose:
+The name of the parser class.
+
address@hidden Accepted Values:
+Any valid identifier.
+
address@hidden Default Value:
+In C++, @code{parser}.  In Java, @code{YYParser} or
address@hidden@var{name-prefix}Parser} (@pxref{Java Bison Interface}).
+
address@hidden History:
+Introduced in Bison 3.3 to replace @code{parser_class_name}.
address@hidden itemize
address@hidden deffn
address@hidden api.parser.class
+
+
 @c ================================================== api.prefix
 @deffn {Directive} {%define api.prefix} @address@hidden@}
 
@@ -6388,8 +6411,8 @@ LR(1) family.  @xref{LR Table Construction}.
 @c ================================================== namespace
 @deffn Directive %define namespace @address@hidden@}
 Obsoleted by @code{api.namespace}
address@hidden namespace
 @end deffn
address@hidden namespace
 
 @c ================================================== parse.assert
 @deffn Directive {%define parse.assert}
@@ -6472,6 +6495,17 @@ compiled.
 @end deffn
 @c parse.trace
 
address@hidden ================================================== 
parser_class_name
address@hidden Directive %define parser_class_name @address@hidden@}
+Obsoleted by @code{api.parser.class}
address@hidden deffn
address@hidden parser_class_name
+
+
+
+
+
+
 @node %code Summary
 @subsection %code Summary
 @findex %code
@@ -10950,19 +10984,19 @@ complete and accurate documentation.
 
 @node C++ Parser Interface
 @subsection C++ Parser Interface
address@hidden - define parser_class_name
address@hidden - define api.parser.class
 @c - Ctor
 @c - parse, error, set_debug_level, debug_level, set_debug_stream,
 @c   debug_stream.
 @c - Reporting errors
 
-The output files @address@hidden and @address@hidden declare
-and define the parser class in the namespace @code{yy}.  The class name
-defaults to @code{parser}, but may be changed using @samp{%define
-parser_class_name @address@hidden@}}.  The interface of this class is detailed
-below.  It can be extended using the @code{%parse-param} feature: its
-semantics is slightly changed since it describes an additional member of the
-parser class, and an additional argument for its constructor.
+The output files @address@hidden and @address@hidden declare and
+define the parser class in the namespace @code{yy}.  The class name defaults
+to @code{parser}, but may be changed using @samp{%define api.parser.class
address@hidden@address@hidden  The interface of this class is detailed below.  
It can be
+extended using the @code{%parse-param} feature: its semantics is slightly
+changed since it describes an additional member of the parser class, and an
+additional argument for its constructor.
 
 @defcv {Type} {parser} {semantic_type}
 The types for semantic values. @xref{C++ Semantic Values}.
@@ -12330,17 +12364,17 @@ properly, the position class should override the 
@code{equals} and
 
 @node Java Parser Interface
 @subsection Java Parser Interface
address@hidden - define parser_class_name
address@hidden - define api.parser.class
 @c - Ctor
 @c - parse, error, set_debug_level, debug_level, set_debug_stream,
 @c   debug_stream.
 @c - Reporting errors
 
 The name of the generated parser class defaults to @code{YYParser}.  The
address@hidden prefix may be changed using the @code{%name-prefix} directive
-or the @option{-p}/@option{--name-prefix} option.  Alternatively, use
address@hidden parser_class_name @address@hidden@}} to give a custom name to
-the class.  The interface of this class is detailed below.
address@hidden prefix may be changed using the @code{%name-prefix} directive or
+the @option{-p}/@option{--name-prefix} option.  Alternatively, use
address@hidden api.parser.class @address@hidden@}} to give a custom name to the
+class.  The interface of this class is detailed below.
 
 By default, the parser class has package visibility.  A declaration
 @samp{%define public} will change to public visibility.  Remember that,
@@ -12719,7 +12753,7 @@ constructor that @emph{creates} a lexer.  Default is 
none.
 
 @deffn {Directive} %name-prefix "@var{prefix}"
 The prefix of the parser class name @address@hidden if
address@hidden parser_class_name} is not used.  Default is @code{YY}.
address@hidden api.parser.class} is not used.  Default is @code{YY}.
 @xref{Java Bison Interface}.
 @end deffn
 
@@ -12822,10 +12856,9 @@ The package to put the parser class in.  Default is 
none.
 @xref{Java Bison Interface}.
 @end deffn
 
address@hidden {Directive} {%define parser_class_name} @address@hidden@}
address@hidden {Directive} {%define api.parser.class} @address@hidden@}
 The name of the parser class.  Default is @code{YYParser} or
address@hidden@var{name-prefix}Parser}.
address@hidden Bison Interface}.
address@hidden@var{name-prefix}Parser}.  @xref{Java Bison Interface}.
 @end deffn
 
 @deffn {Directive} {%define api.position.type} @address@hidden@}
diff --git a/examples/d/calc.y b/examples/d/calc.y
index 320e7427..a82778c7 100644
--- a/examples/d/calc.y
+++ b/examples/d/calc.y
@@ -1,6 +1,6 @@
 %language "D"
 %name-prefix "Calc"
-%define parser_class_name {Calc}
+%define api.parser.class {Calc}
 %define public
 
 %define parse.error verbose
diff --git a/examples/java/Calc.y b/examples/java/Calc.y
index 46c1dec2..4de97583 100644
--- a/examples/java/Calc.y
+++ b/examples/java/Calc.y
@@ -1,6 +1,6 @@
 %language "Java"
 %name-prefix "Calc"
-%define parser_class_name {Calc}
+%define api.parser.class {Calc}
 %define public
 
 %define parse.error verbose %locations
diff --git a/src/muscle-tab.c b/src/muscle-tab.c
index d4c195cb..186b228d 100644
--- a/src/muscle-tab.c
+++ b/src/muscle-tab.c
@@ -407,10 +407,16 @@ muscle_user_name_list_grow (char const *key, char const 
*user_name,
 
 static
 char *
-define_directive (char const *assignment, char const *value)
+define_directive (char const *assignment,
+                  muscle_kind kind,
+                  char const *value)
 {
   char *eq = strchr (assignment, '=');
-  char const *fmt = !eq && value && *value ? "%%define %s %s" : "%%define %s";
+  char const *fmt
+    = eq || !value || !*value ? "%%define %s"
+    : kind == muscle_code     ? "%%define %s {%s}"
+    : kind == muscle_string   ? "%%define %s \"%s\""
+    :                           "%%define %s %s";
   char *res = xmalloc (strlen (fmt) + strlen (assignment)
                        + (value ? strlen (value) : 0));
   sprintf (res, fmt, assignment, value);
@@ -427,28 +433,31 @@ define_directive (char const *assignment, char const 
*value)
 static
 char *
 muscle_percent_variable_update (char const *variable, location variable_loc,
+                                muscle_kind kind,
                                 char const **value)
 {
   typedef struct
   {
     const char *obsolete;
     const char *updated;
+    muscle_kind kind;
   } conversion_type;
   const conversion_type conversion[] =
-    {
-      { "api.push_pull",              "api.push-pull", },
-      { "api.tokens.prefix",          "api.token.prefix", },
-      { "lex_symbol",                 "api.token.constructor", },
-      { "location_type",              "api.location.type", },
-      { "lr.default-reductions",      "lr.default-reduction", },
-      { "lr.keep-unreachable-states", "lr.keep-unreachable-state", },
-      { "lr.keep_unreachable_states", "lr.keep-unreachable-state", },
-      { "namespace",                  "api.namespace", },
-      { "stype",                      "api.value.type", },
-      { "variant=",                   "api.value.type=variant", },
-      { "variant=true",               "api.value.type=variant", },
-      { NULL, NULL, }
-    };
+  {
+    { "api.push_pull",              "api.push-pull",             
muscle_keyword },
+    { "api.tokens.prefix",          "api.token.prefix",          muscle_code },
+    { "lex_symbol",                 "api.token.constructor",     -1 },
+    { "location_type",              "api.location.type",         muscle_code },
+    { "lr.default-reductions",      "lr.default-reduction",      
muscle_keyword },
+    { "lr.keep-unreachable-states", "lr.keep-unreachable-state", 
muscle_keyword },
+    { "lr.keep_unreachable_states", "lr.keep-unreachable-state", 
muscle_keyword },
+    { "namespace",                  "api.namespace",             muscle_code },
+    { "parser_class_name",          "api.parser.class",          muscle_code },
+    { "stype",                      "api.value.type",            -1 },
+    { "variant=",                   "api.value.type=variant",    -1 },
+    { "variant=true",               "api.value.type=variant",    -1 },
+    { NULL, NULL, -1, }
+  };
 
   for (conversion_type const *c = conversion; c->obsolete; ++c)
     {
@@ -458,8 +467,8 @@ muscle_percent_variable_update (char const *variable, 
location variable_loc,
              && STREQ (eq + 1, *value))
           : STREQ (c->obsolete, variable))
         {
-          char *old = define_directive (c->obsolete, *value);
-          char *upd = define_directive (c->updated, *value);
+          char *old = define_directive (c->obsolete, kind, *value);
+          char *upd = define_directive (c->updated, c->kind, *value);
           deprecated_directive (&variable_loc, old, upd);
           free (old);
           free (upd);
@@ -483,7 +492,8 @@ muscle_percent_define_insert (char const *var, location 
variable_loc,
                               muscle_percent_define_how how)
 {
   /* Backward compatibility.  */
-  char *variable = muscle_percent_variable_update (var, variable_loc, &value);
+  char *variable
+    = muscle_percent_variable_update (var, variable_loc, kind, &value);
   uniqstr name = muscle_name (variable, NULL);
   uniqstr loc_name = muscle_name (variable, "loc");
   uniqstr syncline_name = muscle_name (variable, "syncline");
diff --git a/tests/input.at b/tests/input.at
index 36a1c144..8ffb82c7 100644
--- a/tests/input.at
+++ b/tests/input.at
@@ -1834,7 +1834,7 @@ AT_SETUP([["%define" Boolean variables]])
 AT_DATA([Input.y],
 [[%language "Java"
 %define public maybe
-%define parser_class_name {Input}
+%define api.parser.class {Input}
 %%
 start: %empty;
 ]])
@@ -1991,6 +1991,7 @@ AT_DATA([[input.y]],
 %define namespace "foo"
 %define api.namespace {foo}
 %define variant
+%define parser_class_name {parser}
 %%
 start: %empty;
 ]])
@@ -2001,7 +2002,7 @@ AT_BISON_CHECK([[-fcaret input.y]], [1], [],
 input.y:2.9-34: warning: deprecated directive, use '%define 
lr.keep-unreachable-state maybe' [-Wdeprecated]
  %define lr.keep_unreachable_states maybe
          ^^^^^^^^^^^^^^^^^^^^^^^^^^
-input.y:3.9-17: warning: deprecated directive, use '%define api.namespace foo' 
[-Wdeprecated]
+input.y:3.9-17: warning: deprecated directive, use '%define api.namespace 
{foo}' [-Wdeprecated]
  %define namespace "foo"
          ^^^^^^^^^
 input.y:4.9-21: error: %define variable 'api.namespace' redefined
@@ -2013,6 +2014,9 @@ input.y:3.9-17:     previous definition
 input.y:5.9-15: warning: deprecated directive, use '%define api.value.type 
variant' [-Wdeprecated]
  %define variant
          ^^^^^^^
+input.y:6.9-25: warning: deprecated directive, use '%define api.parser.class 
{parser}' [-Wdeprecated]
+ %define parser_class_name {parser}
+         ^^^^^^^^^^^^^^^^^
 ]])
 
 AT_CLEANUP
diff --git a/tests/java.at b/tests/java.at
index aae24bac..4ae00451 100644
--- a/tests/java.at
+++ b/tests/java.at
@@ -37,7 +37,7 @@ AT_DATA([Calc.y],
 [[/* Infix notation calculator--calc */
 %language "Java"
 %name-prefix "Calc"
-%define parser_class_name {Calc}
+%define api.parser.class {Calc}
 %define public
 
 ]$4[
@@ -463,7 +463,7 @@ AT_CHECK_JAVA_GREP([[class PrefixParser]])
 AT_CHECK_JAVA_MINIMAL([[%define api.token.prefix {TOK_}]])
 AT_CHECK_JAVA_GREP([[.*TOK_END.*]])
 
-AT_CHECK_JAVA_MINIMAL([[%define parser_class_name {ParserClassName}]])
+AT_CHECK_JAVA_MINIMAL([[%define api.parser.class {ParserClassName}]])
 AT_CHECK_JAVA_GREP([[class ParserClassName]])
 
 AT_CHECK_JAVA_MINIMAL([[%define package {user_java_package}]])
diff --git a/tests/javapush.at b/tests/javapush.at
index 8749301a..e5573b0e 100644
--- a/tests/javapush.at
+++ b/tests/javapush.at
@@ -44,7 +44,7 @@ AT_BANNER([[Java Push Parsing Tests]])
 # This is missing main(), so two versions
 # are instantiated with different main() procedures.
 m4_define([AT_TRIVIAL_GRAMMAR],[
-%define parser_class_name {YYParser}
+%define api.parser.class {YYParser}
 %define parse.error verbose
 
 %code imports {
@@ -346,7 +346,7 @@ AT_DATA([input],[[1 + 2 * 3 = 7
 AT_DATA([Calc.y],[[/* Infix notation calculator--calc */
 %language "Java"
 %name-prefix "Calc"
-%define parser_class_name {Calc}
+%define api.parser.class {Calc}
 
 %code {
 static class UserLexer implements Calc.Lexer
@@ -620,7 +620,7 @@ AT_BISON_OPTION_PUSHDEFS
 AT_DATA([Calc.y],[[/* Infix notation calculator--calc.  */
 %language "Java"
 %name-prefix "Calc"
-%define parser_class_name {Calc}
+%define api.parser.class {Calc}
 %lex-param { Reader rdr }
 %locations
 




reply via email to

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