X-Git-Url: https://git.saurik.com/bison.git/blobdiff_plain/fb9712a96207a21a6c442bbee9c20324c40e6727..b09a18c50d221b54e6bc94e03deb65ecd52c4288:/src/parse-gram.y

diff --git a/src/parse-gram.y b/src/parse-gram.y
index 19d8cb93..d4f2731e 100644
--- a/src/parse-gram.y
+++ b/src/parse-gram.y
@@ -20,6 +20,7 @@
    02110-1301  USA
 */
 
+#include <config.h>
 #include "system.h"
 
 #include "complain.h"
@@ -32,6 +33,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 +41,8 @@ static YYLTYPE lloc_default (YYLTYPE const *, int);
 #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
@@ -50,9 +54,8 @@ static void add_param (char const *, char *, location);
 
 static symbol_class current_class = unknown_sym;
 static uniqstr current_type = 0;
-symbol *current_lhs;
-location current_lhs_location;
-assoc current_assoc;
+static symbol *current_lhs;
+static location current_lhs_location;
 static int current_prec = 0;
 %}
 
@@ -133,6 +136,7 @@ static int current_prec = 0;
   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 @@ declaration:
 | "%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; }
@@ -530,6 +535,17 @@ add_param (char const *type, char *decl, location loc)
   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);
+      exit (63);
+    }
+}
+
 static void
 gram_error (location const *loc, char const *msg)
 {