Index: ChangeLog
from  Akim Demaille  <akim@epita.fr>

	* bootstrap (gnulib_modules): Add strverscmp.
	* lib/.cvsignore: Add strverscmp.c, strverscmp.h.
	* m4/.cvsignore: Add strverscmp.m4.
	* src/parse-gram.y (%require): New token, new rule.
	(version_check): New.
	* src/scan-gram.l (%require): Adjust.
	* tests/input.at (AT_REQUIRE): New.
	Use it.
	* doc/bison.texinfo (Require Decl): New.
	(Calc++ Parser): Use %require.

Index: NEWS
===================================================================
RCS file: /cvsroot/bison/bison/NEWS,v
retrieving revision 1.126
diff -u -r1.126 NEWS
--- NEWS 2 Oct 2005 17:00:30 -0000 1.126
+++ NEWS 2 Oct 2005 18:46:26 -0000
@@ -5,6 +5,9 @@
 
 * DJGPP support added.
 
+* %require "VERSION"
+  To specify the youngest version of Bison accepted by the grammar file.
+
 * lalr1.cc: The token and value types are now class members.
   The tokens where defined as free form enums and cpp macros.  YYSTYPE
   was defined as a free form union.  Both are now class members:
@@ -13,8 +16,11 @@
 
   If you do not want or can update to this scheme, the directive
   `%define "global_tokens_and_yystype" "1"' triggers the global
-  definition of tokens and YYSTYPE.
+  definition of tokens and YYSTYPE.  This change is suitable both
+  for previous releases of Bison, and this one.
 
+  If you wish to update, then make sure older version of Bison will
+  fail using `%require "2.1a"'.
 
 Changes in version 2.1, 2005-09-16:
 
Index: bootstrap
===================================================================
RCS file: /cvsroot/bison/bison/bootstrap,v
retrieving revision 1.29
diff -u -r1.29 bootstrap
--- bootstrap 29 Sep 2005 19:02:53 -0000 1.29
+++ bootstrap 2 Oct 2005 18:46:26 -0000
@@ -110,6 +110,7 @@
 stpcpy
 strerror
 strtoul
+strverscmp
 unistd-safer
 verify
 xalloc
Index: doc/bison.texinfo
===================================================================
RCS file: /cvsroot/bison/bison/doc/bison.texinfo,v
retrieving revision 1.162
diff -u -r1.162 bison.texinfo
--- doc/bison.texinfo 30 Sep 2005 17:57:05 -0000 1.162
+++ doc/bison.texinfo 2 Oct 2005 18:46:29 -0000
@@ -145,9 +145,9 @@
 
 Writing @acronym{GLR} Parsers
 
-* Simple GLR Parsers::          Using @acronym{GLR} parsers on unambiguous grammars
-* Merging GLR Parses::          Using @acronym{GLR} parsers to resolve ambiguities
-* Compiler Requirements::       @acronym{GLR} parsers require a modern C compiler
+* Simple GLR Parsers::       Using @acronym{GLR} parsers on unambiguous grammars
+* Merging GLR Parses::       Using @acronym{GLR} parsers to resolve ambiguities
+* Compiler Requirements::    @acronym{GLR} parsers require a modern C compiler
 
 Examples
 
@@ -225,6 +225,7 @@
 
 Bison Declarations
 
+* Require Decl::      Requiring a Bison version.
 * Token Decl::        Declaring terminal symbols.
 * Precedence Decl::   Declaring terminals with precedence and associativity.
 * Union Decl::        Declaring the set of all semantic value types.
@@ -732,9 +733,9 @@
 merged result.
 
 @menu
-* Simple GLR Parsers::          Using @acronym{GLR} parsers on unambiguous grammars
-* Merging GLR Parses::          Using @acronym{GLR} parsers to resolve ambiguities
-* Compiler Requirements::       @acronym{GLR} parsers require a modern C compiler
+* Simple GLR Parsers::       Using @acronym{GLR} parsers on unambiguous grammars
+* Merging GLR Parses::       Using @acronym{GLR} parsers to resolve ambiguities
+* Compiler Requirements::    @acronym{GLR} parsers require a modern C compiler
 @end menu
 
 @node Simple GLR Parsers
@@ -3548,6 +3549,7 @@
 Grammars}).
 
 @menu
+* Require Decl::      Requiring a Bison version.
 * Token Decl::        Declaring terminal symbols.
 * Precedence Decl::   Declaring terminals with precedence and associativity.
 * Union Decl::        Declaring the set of all semantic value types.
@@ -3560,6 +3562,19 @@
 * Decl Summary::      Table of all Bison declarations.
 @end menu
 
+@node Require Decl
+@subsection Require a Version of Bison
+@cindex version requirement
+@cindex requiring a version of Bison
+@findex %require
+
+You may require the minimum version of Bison to process the grammar.  If
+the requirement is not met, @command{bison} exits with an error.
+
+@example
+%require "@var{version}"
+@end example
+
 @node Token Decl
 @subsection Token Type Names
 @cindex declaring token type names
@@ -4157,6 +4172,12 @@
 (Reentrant) Parser}).
 @end deffn
 
+@deffn {Directive} %require "@var{version}"
+Specify that version @var{version} or higher of Bison required for the
+grammar.
+@xref{Require Decl, , Require a Version of Bison}.
+@end deffn
+
 @deffn {Directive} %token-table
 Generate an array of token names in the parser file.  The name of the
 array is @code{yytname}; @code{yytname[@var{i}]} is the name of the
@@ -7275,13 +7296,16 @@
 @node Calc++ Parser
 @subsection Calc++ Parser
 
-The parser definition file @file{calc++-parser.yy} starts by asking
-for the C++ LALR(1) skeleton, the creation of the parser header file, and
-specifies the name of the parser class.
+The parser definition file @file{calc++-parser.yy} starts by asking for
+the C++ LALR(1) skeleton, the creation of the parser header file, and
+specifies the name of the parser class.  Because the C++ skeleton
+changed several times, it is safer to require the version you designed
+the grammar for.
 
 @comment file: calc++-parser.yy
 @example
 %skeleton "lalr1.cc"                          /*  -*- C++ -*- */
+%require "2.1a"
 %defines
 %define "parser_class_name" "calcxx_parser"
 @end example
@@ -7966,6 +7990,12 @@
 @deffn {Directive} %pure-parser
 Bison declaration to request a pure (reentrant) parser.
 @xref{Pure Decl, ,A Pure (Reentrant) Parser}.
+@end deffn
+
+@deffn {Directive} %require "@var{version}"
+Specify that version @var{version} or higher of Bison required for the
+grammar.
+@xref{Require Decl, , Require a Version of Bison}.
 @end deffn
 
 @deffn {Directive} %right
Index: lib/.cvsignore
===================================================================
RCS file: /cvsroot/bison/bison/lib/.cvsignore,v
retrieving revision 1.17
diff -u -r1.17 .cvsignore
--- lib/.cvsignore 29 Sep 2005 19:02:53 -0000 1.17
+++ lib/.cvsignore 2 Oct 2005 18:46:29 -0000
@@ -54,6 +54,8 @@
 strnlen.h
 strtol.c
 strtoul.c
+strverscmp.c
+strverscmp.h
 unistd--.h
 unistd-safer.h
 unlocked-io.h
Index: m4/.cvsignore
===================================================================
RCS file: /cvsroot/bison/bison/m4/.cvsignore,v
retrieving revision 1.14
diff -u -r1.14 .cvsignore
--- m4/.cvsignore 29 Sep 2005 19:02:54 -0000 1.14
+++ m4/.cvsignore 2 Oct 2005 18:46:29 -0000
@@ -30,6 +30,7 @@
 strnlen.m4
 strtol.m4
 strtoul.m4
+strverscmp.m4
 unistd-safer.m4
 unlocked-io.m4
 xalloc.m4
Index: src/parse-gram.y
===================================================================
RCS file: /cvsroot/bison/bison/src/parse-gram.y,v
retrieving revision 1.58
diff -u -r1.58 parse-gram.y
--- src/parse-gram.y 30 Sep 2005 17:57:05 -0000 1.58
+++ src/parse-gram.y 2 Oct 2005 18:46:30 -0000
@@ -32,6 +32,7 @@
 #include "quotearg.h"
 #include "reader.h"
 #include "symlist.h"
+#include "strverscmp.h"
 
 #define YYLLOC_DEFAULT(Current, Rhs, N)  (Current) = lloc_default (Rhs, N)
 static YYLTYPE lloc_default (YYLTYPE const *, int);
@@ -39,6 +40,8 @@
 #define YY_LOCATION_PRINT(File, Loc) \
           location_print (File, Loc)
 
+static void version_check (location const *loc, char const *version);
+
 /* Request detailed syntax error messages, and pass them to GRAM_ERROR.
    FIXME: depends on the undocumented availability of YYLLOC.  */
 #undef  yyerror
@@ -133,6 +136,7 @@
   PERCENT_OUTPUT          "%output"
   PERCENT_PARSE_PARAM     "%parse-param {...}"
   PERCENT_PURE_PARSER     "%pure-parser"
+  PERCENT_REQUIRE 	  "%require"
   PERCENT_SKELETON        "%skeleton"
   PERCENT_START           "%start"
   PERCENT_TOKEN_TABLE     "%token-table"
@@ -226,6 +230,7 @@
 | "%output" "=" string_content             { spec_outfile = $3; }
 | "%parse-param {...}"			   { add_param ("parse_param", $1, @1); }
 | "%pure-parser"                           { pure_parser = true; }
+| "%require" string_content                { version_check (&@2, $2); }
 | "%skeleton" string_content               { skeleton = $2; }
 | "%token-table"                           { token_table_flag = true; }
 | "%verbose"                               { report_flag = report_states; }
@@ -528,6 +533,14 @@
     }
 
   scanner_last_string_free ();
+}
+
+static void
+version_check (location const *loc, char const *version)
+{
+  if (strverscmp (version, PACKAGE_VERSION) > 0)
+    complain_at (*loc, "require bison %s, but have %s",
+		 version, PACKAGE_VERSION);
 }
 
 static void
Index: src/scan-gram.l
===================================================================
RCS file: /cvsroot/bison/bison/src/scan-gram.l,v
retrieving revision 1.75
diff -u -r1.75 scan-gram.l
--- src/scan-gram.l 22 Jul 2005 17:58:51 -0000 1.75
+++ src/scan-gram.l 2 Oct 2005 18:46:31 -0000
@@ -224,6 +224,7 @@
   "%prec"                 rule_length--; return PERCENT_PREC;
   "%printer"              token_type = PERCENT_PRINTER; BEGIN SC_PRE_CODE;
   "%pure"[-_]"parser"     return PERCENT_PURE_PARSER;
+  "%require"              return PERCENT_REQUIRE;
   "%right"                return PERCENT_RIGHT;
   "%skeleton"             return PERCENT_SKELETON;
   "%start"                return PERCENT_START;
Index: tests/input.at
===================================================================
RCS file: /cvsroot/bison/bison/tests/input.at,v
retrieving revision 1.34
diff -u -r1.34 input.at
--- tests/input.at 14 May 2005 06:49:48 -0000 1.34
+++ tests/input.at 2 Oct 2005 18:46:31 -0000
@@ -297,3 +297,24 @@
 AT_CHECK([bison -o input.c input.y])
 
 AT_CLEANUP
+
+
+## --------- ##
+## Require.  ##
+## --------- ##
+
+m4_define([AT_CHECK_REQUIRE],
+[AT_SETUP([Require $1])
+AT_DATA_GRAMMAR([input.y],
+[[%require "$1";
+%%
+empty_file:;
+]])
+AT_CHECK([bison -o input.c input.y], $2, [], ignore)
+AT_CLEANUP
+])
+
+AT_CHECK_REQUIRE(1.0, 0)
+AT_CHECK_REQUIRE(AT_PACKAGE_VERSION, 0)
+## FIXME: Some day augment this version number.
+AT_CHECK_REQUIRE(100.0, 1)
