X-Git-Url: https://perl5.git.perl.org/perl5.git/blobdiff_plain/2eee27d7b177d9896e448afbc693e62df0094ca3..6987f4434e4dfee71506125954ee1ae41c46f1cb:/regen_perly.pl diff --git a/regen_perly.pl b/regen_perly.pl index 510cb3b..044fd28 100644 --- a/regen_perly.pl +++ b/regen_perly.pl @@ -35,7 +35,8 @@ sub usage { die "usage: $0 [ -b bison_executable ] [ file.y ]\n" } use warnings; use strict; -BEGIN { require 'regen/regen_lib.pl'; } +our $Verbose; +BEGIN { require './regen/regen_lib.pl'; } my $bison = 'bison'; @@ -73,16 +74,21 @@ unless ($version) { die < 99; + die "Unexpectedly large bison subversion '$v2'" if $v2 > 9999; + + printf $h_fh "#define PERL_BISON_VERSION %2d%04d\n\n", $v1, $v2; +} + my $endcore_done = 0; -# Token macros need to be generated manually on bison 2.4 -my $gather_tokens = ($version =~ /\b2\.4\b/ ? undef : 0); +my $gather_tokens = 0; my $tokens; while (<$tmph_fh>) { + # bison 2.6 adds header guards, which break things because of where we + # insert #ifdef PERL_CORE, so strip them because they aren't important + next if /YY_PERLYTMP_H/; + print $h_fh "#ifdef PERL_CORE\n" if $. == 1; if (!$endcore_done and /YYSTYPE_IS_DECLARED/) { - print $h_fh "#endif /* PERL_CORE */\n"; + print $h_fh <= 3 ? 'yyr2' : 'yystos'; $clines =~ m@ (?: ^/* YYFINAL[^\n]+\n #optional comment )? \# \s* define \s* YYFINAL # first #define .*? # other defines + most tables - yystos\[\]\s*= # start of last table + $last_table\[\]\s*= # start of last table .*? }\s*; # end of last table @xms or die "Can't extract tables from $tmpc_file\n"; - $tablines = $&; + $tablines .= $&; + + # extract all the cases in the big action switch statement $clines =~ m@ - switch \s* \( \s* \w+ \s* \) \s* { \s* - ( - case \s* \d+ \s* : - \s* - (?: \s* /\* .*? \*/ \s* )* # optional C-comments - \s* - \#line [^\n]+"\Q$y_file\E" - .*? - ) - } - \s* - (?: \s* /\* .*? \*/ \s* )* # optional C-comments - \s* - ( - \#line[^\n]+\.c" - | - \#line[^\n]+\.simple" - | - YY_SYMBOL_PRINT - ) + switch \s* \( \s* yyn \s* \) \s* { \s* + ( .*? default: \s* break; \s* ) + } @xms or die "Can't extract actions from $tmpc_file\n"; $actlines = $1; @@ -196,6 +234,9 @@ sub extract { # Remove extraneous comments from bison 2.4 $actlines =~ s!\s* /\* \s* Line \s* \d+ \s* of \s* yacc\.c \s* \*/!!gx; + # Remove extraneous comments from bison 3.x + $actlines =~ s!\s* /\* \s* yacc\.c : \d+ \s* \*/!!gx; + # C<#line 188 "perlytmp.c"> gets picked up by make depend, so remove them. $actlines =~ s/^#line \d+ "\Q$tmpc_file\E".*$//gm; @@ -240,12 +281,13 @@ sub extract { sub make_type_tab { my ($y_file, $tablines) = @_; + my %just_tokens; my %tokens; my %types; my $default_token; open my $fh, '<', $y_file or die "Can't open $y_file: $!\n"; while (<$fh>) { - if (/(\$\d+)\s*=/) { + if (/(\$\d+)\s*=[^=]/) { warn "$y_file:$.: dangerous assignment to $1: $_"; } @@ -259,26 +301,32 @@ sub make_type_tab { } next unless /^%(token|type)/; - s/^%(token|type)\s+<(\w+)>\s+// + s/^%((token)|type)\s+<(\w+)>\s+// or die "$y_file: unparseable token/type line: $_"; - $tokens{$_} = $2 for (split ' ', $_); - $types{$2} = 1; + for (split ' ', $_) { + $tokens{$_} = $3; + if ($2) { + $just_tokens{$_} = $3; + } + } + $types{$3} = 1; } + *tokens = \%just_tokens; # perly.h needs this die "$y_file: no __DEFAULT__ token defined\n" unless $default_token; $types{$default_token} = 1; $tablines =~ /^\Qstatic const char *const yytname[] =\E\n - {\n + \{\n (.*?) ^}; /xsm or die "Can't extract yytname[] from table string\n"; my $fields = $1; - $fields =~ s{"([^"]+)"} + $fields =~ s{"((?:[^"\\]|\\.)+)"} { "toketype_" . (defined $tokens{$1} ? $tokens{$1} : $default_token) }ge; - $fields =~ s/, \s* 0 \s* $//x + $fields =~ s/, \s* (?:0|YY_NULL|YY_NULLPTR) \s* $//x or die "make_type_tab: couldn't delete trailing ',0'\n"; return @@ -293,6 +341,9 @@ sub make_type_tab { sub my_system { + if ($Verbose) { + print "executing: @_\n"; + } system(@_); if ($? == -1) { die "failed to execute command '@_': $!\n";