Improve the logic in regen_perly.pl for manually generating token macros.
authorNicholas Clark <nick@ccl4.org>
Thu, 2 May 2013 11:34:13 +0000 (13:34 +0200)
committerNicholas Clark <nick@ccl4.org>
Mon, 6 May 2013 07:36:45 +0000 (09:36 +0200)
Without this fixup the build breaks on Win32. Previously it was enabled using
a second regular expression to parse the bison version string. This
effectively duplicates the first regular expression that parses the bison
version string to determine if the version of bison found can be used.

The second regular expression could get missed when changing the first, as
happened with commit f5cf236ddbe8e24e. So refactor the code to extract the
bison version once, and then use this later as a simple numeric comparison.

With this change, we can actually use bison 2.7 to regenerate perly.*

perly.act
perly.h
perly.tab
regen_perly.pl

index 32c1cd3..98b09d7 100644 (file)
--- a/perly.act
+++ b/perly.act
@@ -1779,5 +1779,5 @@ case 2:
 
 /* Generated from:
  * 28c2c7738eefc00762e227af0363c729186c992e9127e0c935684cccbf3a3b4f perly.y
- * 112a738a076e5c6a33dc63b7b99e09240ef32ab644bd350d4b78f83bc3f96f1d regen_perly.pl
+ * 5c9d2a0262457fe9b70073fc8ad6c188f812f38ad57712b7e2f53daa01b297cc regen_perly.pl
  * ex: set ro: */
diff --git a/perly.h b/perly.h
index af54a51..6f1d6b9 100644 (file)
--- a/perly.h
+++ b/perly.h
@@ -287,5 +287,5 @@ int yyparse ();
 
 /* Generated from:
  * 28c2c7738eefc00762e227af0363c729186c992e9127e0c935684cccbf3a3b4f perly.y
- * 112a738a076e5c6a33dc63b7b99e09240ef32ab644bd350d4b78f83bc3f96f1d regen_perly.pl
+ * 5c9d2a0262457fe9b70073fc8ad6c188f812f38ad57712b7e2f53daa01b297cc regen_perly.pl
  * ex: set ro: */
index 790f8b5..5172cc2 100644 (file)
--- a/perly.tab
+++ b/perly.tab
@@ -1133,5 +1133,5 @@ static const toketypes yy_type_tab[] =
 
 /* Generated from:
  * 28c2c7738eefc00762e227af0363c729186c992e9127e0c935684cccbf3a3b4f perly.y
- * 112a738a076e5c6a33dc63b7b99e09240ef32ab644bd350d4b78f83bc3f96f1d regen_perly.pl
+ * 5c9d2a0262457fe9b70073fc8ad6c188f812f38ad57712b7e2f53daa01b297cc regen_perly.pl
  * ex: set ro: */
index 7907c20..b962756 100644 (file)
@@ -73,16 +73,21 @@ unless ($version) { die <<EOF; }
 Could not find a version of bison in your path. Please install bison.
 EOF
 
+# Don't change this to add new bison versions without testing that the generated
+# files actually work :-) Win32 in particular may not like them. :-(
 unless ($version =~ /\b(1\.875[a-z]?|2\.[0134567])\b/) { die <<EOF; }
 
 You have the wrong version of bison in your path; currently 1.875
-2.0, 2.1, 2.3-2.7 is required.  Try installing
-    http://ftp.gnu.org/gnu/bison/bison-2.7.tar.gz
+2.0, 2.1, 2.3, 2.4, 2.5, 2.6 or 2.7 is required.  Try installing
+    http://ftp.gnu.org/gnu/bison/bison-2.5.1.tar.gz
 or similar.  Your bison identifies itself as:
 
 $version
 EOF
 
+# bison's version number, not the entire string, is most useful later on.
+$version = $1;
+
 # creates $tmpc_file and $tmph_file
 my_system("$bison -d -o $tmpc_file $y_file");
 
@@ -116,7 +121,7 @@ open my $tmph_fh, '<', $tmph_file or die "Can't open $tmph_file: $!\n";
 
 my $endcore_done = 0;
 # Token macros need to be generated manually from bison 2.4 on
-my $gather_tokens = ($version =~ /\b2\.[456]\b/ ? undef : 0);
+my $gather_tokens = $version >= 2.4 ? undef : 0;
 my $tokens;
 while (<$tmph_fh>) {
     # bison 2.6 adds header guards, which break things because of where we