Hello community,

here is the log from the commit of package perl-Parse-RecDescent for 
openSUSE:Factory checked in at 2015-09-24 06:13:11
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Comparing /work/SRC/openSUSE:Factory/perl-Parse-RecDescent (Old)
 and      /work/SRC/openSUSE:Factory/.perl-Parse-RecDescent.new (New)
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Package is "perl-Parse-RecDescent"

Changes:
--------
--- 
/work/SRC/openSUSE:Factory/perl-Parse-RecDescent/perl-Parse-RecDescent.changes  
    2012-06-01 22:32:33.000000000 +0200
+++ 
/work/SRC/openSUSE:Factory/.perl-Parse-RecDescent.new/perl-Parse-RecDescent.changes
 2015-09-24 06:13:13.000000000 +0200
@@ -1,0 +2,6 @@
+Mon Sep 14 08:51:35 UTC 2015 - [email protected]
+
+- updated to 1.967012
+   see /usr/share/doc/packages/perl-Parse-RecDescent/Changes
+
+-------------------------------------------------------------------

Old:
----
  Parse-RecDescent-1.967009.tar.gz

New:
----
  Parse-RecDescent-1.967012.tar.gz
  cpanspec.yml

++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Other differences:
------------------
++++++ perl-Parse-RecDescent.spec ++++++
--- /var/tmp/diff_new_pack.8cXTJm/_old  2015-09-24 06:13:14.000000000 +0200
+++ /var/tmp/diff_new_pack.8cXTJm/_new  2015-09-24 06:13:14.000000000 +0200
@@ -1,7 +1,7 @@
 #
 # spec file for package perl-Parse-RecDescent
 #
-# Copyright (c) 2012 SUSE LINUX Products GmbH, Nuernberg, Germany.
+# Copyright (c) 2015 SUSE LINUX GmbH, Nuernberg, Germany.
 #
 # All modifications and additions to the file contributed by third parties
 # remain the property of their copyright owners, unless otherwise agreed
@@ -17,24 +17,19 @@
 
 
 Name:           perl-Parse-RecDescent
-Version:        1.967009
+Version:        1.967012
 Release:        0
 %define cpan_name Parse-RecDescent
 Summary:        Generate Recursive-Descent Parsers
 License:        GPL-1.0+ or Artistic-1.0
 Group:          Development/Libraries/Perl
 Url:            http://search.cpan.org/dist/Parse-RecDescent/
-Source:         
http://www.cpan.org/authors/id/J/JT/JTBRAUN/%{cpan_name}-%{version}.tar.gz
+Source0:        
http://www.cpan.org/authors/id/J/JT/JTBRAUN/%{cpan_name}-%{version}.tar.gz
+Source1:        cpanspec.yml
 BuildRoot:      %{_tmppath}/%{name}-%{version}-build
 BuildRequires:  perl
 BuildRequires:  perl-macros
-BuildRequires:  perl(ExtUtils::MakeMaker) >= 6.57
 BuildRequires:  perl(Module::Build)
-#BuildRequires: perl(AutoDump)
-#BuildRequires: perl(Calc)
-#BuildRequires: perl(CGrammar)
-#BuildRequires: perl(DecommentGrammar)
-#BuildRequires: perl(Parse::RecDescent)
 %{perl_requires}
 
 %description

++++++ Parse-RecDescent-1.967009.tar.gz -> Parse-RecDescent-1.967012.tar.gz 
++++++
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/Parse-RecDescent-1.967009/Changes 
new/Parse-RecDescent-1.967012/Changes
--- old/Parse-RecDescent-1.967009/Changes       2012-03-16 15:25:51.000000000 
+0100
+++ new/Parse-RecDescent-1.967012/Changes       2015-09-13 17:00:59.000000000 
+0200
@@ -753,45 +753,82 @@
 
 1.967_005   Wed Feb  8 18:46:35 2012
 
-      - Added [email protected] as author in Build.PL.
+    - Added [email protected] as author in Build.PL.
 
-      - Added ExtUtils::MakeMaker build/configure version
-        requirements. (RT.cpan.org #74787, Thanks POPEL!)
+    - Added ExtUtils::MakeMaker build/configure version
+      requirements. (RT.cpan.org #74787, Thanks POPEL!)
 
 1.967006   Fri Feb 10 20:48:48 2012
 
-      - Bumped version to 1.967006 for non-development release.
+    - Bumped version to 1.967006 for non-development release.
 
 1.967_007      Thu Feb 23 07:26:03 2012
 
-      - Revised ExtUtils::MakeMaker build/configure version
-        requirements. (RT.cpan.org #74787, Thanks Paul!)
+    - Revised ExtUtils::MakeMaker build/configure version
+      requirements. (RT.cpan.org #74787, Thanks Paul!)
 
-      - Revised Text::Balanced prereq to require version 1.95,
-        necessary for t/skip.t to pass.
-        (RT.cpan.org #74787, Thanks Paul!)
-
-      - Removed unused version.pm prereq.
-
-      - Fix a circular reference memory leak caused by the use of
-        $AUTOLOAD in sub AUTOLOAD{} in the generated parser's
-        namespace.  Workaround documented in perl5 RT #110248.
-        Workaround a circular reference memory leak in ISA documented
-        by perl5 RT #92708.  A parser's DESTROY() method redefines all
-        subs before deleting the stash, to avoid circular references
-        between subrules. (RT #53710, thanks Andreas!)
-
-      - Parse::RecDescent::AUTOLOAD did not correctly handle
-        initializing the line counting mechanism when a reference to a
-        scalar was passed to the parser. (RT.cpan.org #27705, thanks
-        Justin!)
+    - Revised Text::Balanced prereq to require version 1.95, necessary
+      for t/skip.t to pass.  (RT.cpan.org #74787, Thanks Paul!)
+
+    - Removed unused version.pm prereq.
+
+    - Fix a circular reference memory leak caused by the use of
+      $AUTOLOAD in sub AUTOLOAD{} in the generated parser's namespace.
+      Workaround documented in perl5 RT #110248.  Workaround a
+      circular reference memory leak in ISA documented by perl5 RT
+      #92708.  A parser's DESTROY() method redefines all subs before
+      deleting the stash, to avoid circular references between
+      subrules. (RT #53710, thanks Andreas!)
+
+    - Parse::RecDescent::AUTOLOAD did not correctly handle
+      initializing the line counting mechanism when a reference to a
+      scalar was passed to the parser. (RT.cpan.org #27705, thanks
+      Justin!)
 
 1.967_008      Tue Mar 13 22:28:00 2012
 
-      - Restore old _parserepeat calling convention.  Change a
-        parser's DESTROY method to check for $self->{_not_precompiled}
-        instead of $self->{_precompiled}. (Fix for RT #74593).
+    - Restore old _parserepeat calling convention.  Change a parser's
+      DESTROY method to check for $self->{_not_precompiled} instead of
+      $self->{_precompiled}. (Fix for RT #74593).
 
 1.967009      Fri Mar 16 07:25:09 2012
 
-      - Bumped version to 1.967009 for non-development release.
+    - Bumped version to 1.967009 for non-development release.
+
+1.967_010     Sun Jul  7 11:23:53 2013
+
+    - Base the standalone precompiled parser's runtime name on the
+      parser's class, rather than use the fixed
+      "Parse::RecDescent::_Runtime".  This prevents "already defined"
+      warnings when two standalone precompiled parsers are used.
+
+    - Add support for allowing precompiled parsers to share a common
+      runtime via the Precompile({-runtime_class}) option and the
+      PrecompiledRuntime() function.
+
+    - Warn on creation of Precompiled parsers that depend on
+      Parse::RecDescent.
+
+    - *** NON-BACKWARDS COMPATIBLE CHANGE! *** Change global the
+      <skip:> directive to eval similar to other <skip:> directives,
+      rather than being single-quoted in the resulting parser.
+
+1.967011      Sat Sep 12 16:42:01 2015
+
+    - Correct some typos in the documentation. (RT.cpan.org #87185,
+      thanks dsteinbrunner!)
+
+    - Sort hash keys and rulenames when generating code. This keeps
+      the output text for a given input text the same, reducing
+      differences in automated builds. (RT.cpan.org #102160, thanks
+      Reiner!)
+
+    - Precompiled parsers now document which
+      $Parse::RecDescent::VERSION was used to generate
+      them. (RT.cpan.org #77001)
+
+1.967012      Sun Sep 13 07:59:00 2015
+
+    - Reference Data::Dumper::Sortkeys, not SortKeys. Actually
+      produces reproducible precompiled parsers now. (RT.cpan.org
+      #107061, thanks Slaven!)
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/Parse-RecDescent-1.967009/MANIFEST 
new/Parse-RecDescent-1.967012/MANIFEST
--- old/Parse-RecDescent-1.967009/MANIFEST      2012-03-16 15:27:02.000000000 
+0100
+++ new/Parse-RecDescent-1.967012/MANIFEST      2015-09-13 02:44:06.000000000 
+0200
@@ -78,6 +78,7 @@
 t/precompile.t
 t/re_capture_return.t
 t/reentry.t
+t/reproducible.t
 t/separated_repetition.t
 t/skip.t
 t/skip_dynamic.t
@@ -88,5 +89,3 @@
 tutorial/TPJ_maze.gif
 tutorial/TPJ_tree.gif
 tutorial/tutorial.html
-META.yml                                 Module YAML meta-data (added by 
MakeMaker)
-META.json                                Module JSON meta-data (added by 
MakeMaker)
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/Parse-RecDescent-1.967009/META.json 
new/Parse-RecDescent-1.967012/META.json
--- old/Parse-RecDescent-1.967009/META.json     2012-03-16 15:27:02.000000000 
+0100
+++ new/Parse-RecDescent-1.967012/META.json     1970-01-01 01:00:00.000000000 
+0100
@@ -1,43 +0,0 @@
-{
-   "abstract" : "Generate Recursive-Descent Parsers",
-   "author" : [
-      "Damian Conway <[email protected]>",
-      "Jeremy T. Braun <[email protected]>"
-   ],
-   "dynamic_config" : 1,
-   "generated_by" : "ExtUtils::MakeMaker version 6.62, CPAN::Meta::Converter 
version 2.113640",
-   "license" : [
-      "unknown"
-   ],
-   "meta-spec" : {
-      "url" : "http://search.cpan.org/perldoc?CPAN::Meta::Spec";,
-      "version" : "2"
-   },
-   "name" : "Parse-RecDescent",
-   "no_index" : {
-      "directory" : [
-         "t",
-         "inc"
-      ]
-   },
-   "prereqs" : {
-      "build" : {
-         "requires" : {
-            "ExtUtils::MakeMaker" : "6.5702"
-         }
-      },
-      "configure" : {
-         "requires" : {
-            "ExtUtils::MakeMaker" : "6.5702"
-         }
-      },
-      "runtime" : {
-         "requires" : {
-            "Test::More" : 0,
-            "Text::Balanced" : "1.95"
-         }
-      }
-   },
-   "release_status" : "stable",
-   "version" : "1.967009"
-}
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/Parse-RecDescent-1.967009/META.yml 
new/Parse-RecDescent-1.967012/META.yml
--- old/Parse-RecDescent-1.967009/META.yml      2012-03-16 15:27:02.000000000 
+0100
+++ new/Parse-RecDescent-1.967012/META.yml      1970-01-01 01:00:00.000000000 
+0100
@@ -1,24 +0,0 @@
----
-abstract: 'Generate Recursive-Descent Parsers'
-author:
-  - 'Damian Conway <[email protected]>'
-  - 'Jeremy T. Braun <[email protected]>'
-build_requires:
-  ExtUtils::MakeMaker: 6.5702
-configure_requires:
-  ExtUtils::MakeMaker: 6.5702
-dynamic_config: 1
-generated_by: 'ExtUtils::MakeMaker version 6.62, CPAN::Meta::Converter version 
2.113640'
-license: unknown
-meta-spec:
-  url: http://module-build.sourceforge.net/META-spec-v1.4.html
-  version: 1.4
-name: Parse-RecDescent
-no_index:
-  directory:
-    - t
-    - inc
-requires:
-  Test::More: 0
-  Text::Balanced: 1.95
-version: 1.967009
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/Parse-RecDescent-1.967009/README 
new/Parse-RecDescent-1.967012/README
--- old/Parse-RecDescent-1.967009/README        2012-03-16 15:26:10.000000000 
+0100
+++ new/Parse-RecDescent-1.967012/README        2015-09-13 17:01:10.000000000 
+0200
@@ -1,4 +1,4 @@
-Parse::RecDescent version 1.967009
+Parse::RecDescent version 1.967012
 
 NAME
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/Parse-RecDescent-1.967009/lib/Parse/RecDescent.pm 
new/Parse-RecDescent-1.967012/lib/Parse/RecDescent.pm
--- old/Parse-RecDescent-1.967009/lib/Parse/RecDescent.pm       2012-03-16 
15:26:26.000000000 +0100
+++ new/Parse-RecDescent-1.967012/lib/Parse/RecDescent.pm       2015-09-13 
17:01:33.000000000 +0200
@@ -16,7 +16,7 @@
 
 #ifndef RUNTIME
 sub import  # IMPLEMENT PRECOMPILER BEHAVIOUR UNDER:
-        #    perl -MParse::RecDescent - <grammarfile> <classname>
+        #    perl -MParse::RecDescent - <grammarfile> <classname> 
[runtimeclassname]
 {
     local *_die = sub { print @_, "\n"; exit };
 
@@ -25,9 +25,9 @@
     if ($file eq '-' && $line == 0)
     {
         _die("Usage: perl -MLocalTest - <grammarfile> <classname>")
-            unless @ARGV == 2;
+            unless @ARGV >= 2 and $ARGV <= 3;
 
-        my ($sourcefile, $class) = @ARGV;
+        my ($sourcefile, $class, $runtime_class) = @ARGV;
 
         local *IN;
         open IN, $sourcefile
@@ -36,7 +36,8 @@
         my $grammar = <IN>;
         close IN;
 
-        Parse::RecDescent->Precompile($grammar, $class, $sourcefile);
+        Parse::RecDescent->Precompile({ -runtime_class => $runtime_class },
+                                      $grammar, $class, $sourcefile);
         exit;
     }
 }
@@ -55,10 +56,21 @@
     $self->{saving} = 0;
 }
 
+sub PrecompiledRuntime
+{
+    my ($self, $class) = @_;
+    my $opt = {
+        -standalone => 1,
+        -runtime_class => $class,
+    };
+    $self->Precompile($opt, '', $class);
+}
+
 sub Precompile
 {
     my $self = shift;
-    my %opt = ( -standalone => 0 );
+    my %opt = ( -standalone => 0,
+            );
     if ('HASH' eq ref $_[0]) {
         %opt = (%opt, %{$_[0]});
         shift;
@@ -71,21 +83,75 @@
     $modulefile =~ s/.*:://;
     $modulefile .= ".pm";
 
-    my $runtime_package = 'Parse::RecDescent::_Runtime';
-    my $code;
+    my $code = '';
 
     local *OUT;
     open OUT, ">", $modulefile
       or croak("Can't write to new module file '$modulefile'");
 
+    print OUT "#\n",
+      "# This parser was generated with\n",
+      "# Parse::RecDescent version $Parse::RecDescent::VERSION\n",
+      "#\n\n";
+
     print STDERR "precompiling grammar from file '$sourcefile'\n",
       "to class $class in module file '$modulefile'\n"
       if $grammar && $sourcefile;
 
-    # Make the resulting pre-compiled parser stand-alone by
-    # including the contents of Parse::RecDescent as
-    # Parse::RecDescent::Runtime in the resulting precompiled
-    # parser.
+    if ($grammar) {
+        $self = Parse::RecDescent->new($grammar,  # $grammar
+                                       1,         # $compiling
+                                       $class     # $namespace
+                                 )
+          || croak("Can't compile bad grammar")
+          if $grammar;
+
+        # Do not allow &DESTROY to remove the precompiled namespace
+        delete $self->{_not_precompiled};
+
+        foreach ( keys %{$self->{rules}} ) {
+            $self->{rules}{$_}{changed} = 1;
+        }
+
+        $code = $self->_code();
+    }
+
+    # If a name for the runtime package was not provided,
+    # generate one based on the module output name and the generated
+    # code
+    if (not defined($opt{-runtime_class})) {
+        if ($opt{-standalone}) {
+            my $basename = $class . '::_Runtime';
+
+            my $name = $basename;
+
+            for (my $i = 0; $code =~ /$basename/; ++$i) {
+                $name = sprintf("%s%06d", $basename, $i);
+            }
+
+            $opt{-runtime_class} = $name;
+        } else {
+            my $package = ref $self;
+            local $::RD_HINT = defined $::RD_HINT ? $::RD_HINT : 1;
+            _hint(<<EOWARNING);
+The precompiled grammar did not specify the -runtime_class
+option. The resulting parser will "use $package". Future changes to
+$package may cause $class to stop working.
+
+Consider building a -standalone parser, or providing the
+-runtime_class option as described in Parse::RecDescent's POD.
+
+Use \$::RD_HINT = 0 to disable this message.
+EOWARNING
+            $opt{-runtime_class} = $package;
+        }
+    }
+
+    $code =~ s/Parse::RecDescent/$opt{-runtime_class}/gs;
+
+    # Make the resulting pre-compiled parser stand-alone by including
+    # the contents of Parse::RecDescent as -runtime_class in the
+    # resulting precompiled parser.
     if ($opt{-standalone}) {
         local *IN;
         open IN, '<', $Parse::RecDescent::_FILENAME
@@ -104,7 +170,8 @@
                 if ($_ =~ m/^__END__/) {
                     last;
                 }
-                s/Parse::RecDescent/$runtime_package/gs;
+
+                s/Parse::RecDescent/$opt{-runtime_class}/gs;
                 print OUT $_;
             }
         }
@@ -112,45 +179,32 @@
         print OUT "}\n";
     }
 
-    $self = Parse::RecDescent->new($grammar,  # $grammar
-                                   1,         # $compiling
-                                   $class     # $namespace
-                             )
-      || croak("Can't compile bad grammar")
-      if $grammar;
-
-    # Do not allow &DESTROY to remove the precompiled namespace
-    delete $self->{_not_precompiled};
-
-    foreach ( keys %{$self->{rules}} ) {
-        $self->{rules}{$_}{changed} = 1;
+    if ($grammar) {
+        print OUT "package $class;\n";
     }
 
-
-    print OUT "package $class;\n";
     if (not $opt{-standalone}) {
-        print OUT "use Parse::RecDescent;\n";
+        print OUT "use $opt{-runtime_class};\n";
     }
 
-    print OUT "{ my \$ERRORS;\n\n";
+    if ($grammar) {
+        print OUT "{ my \$ERRORS;\n\n";
 
-    $code = $self->_code();
-    if ($opt{-standalone}) {
-        $code =~ s/Parse::RecDescent/$runtime_package/gs;
-    }
-    print OUT $code;
+        print OUT $code;
 
-    print OUT "}\npackage $class; sub new { ";
-    print OUT "my ";
+        print OUT "}\npackage $class; sub new { ";
+        print OUT "my ";
 
-    require Data::Dumper;
-    $code = Data::Dumper->Dump([$self], [qw(self)]);
-    if ($opt{-standalone}) {
-        $code =~ s/Parse::RecDescent/$runtime_package/gs;
-    }
-    print OUT $code;
+        require Data::Dumper;
+        # Sort the keys to ensure the output is reproducible
+        local $Data::Dumper::Sortkeys = 1;
+        $code = Data::Dumper->Dump([$self], [qw(self)]);
+        $code =~ s/Parse::RecDescent/$opt{-runtime_class}/gs;
 
-    print OUT "}";
+        print OUT $code;
+
+        print OUT "}";
+    }
 
     close OUT
       or croak("Can't write to new module file '$modulefile'");
@@ -1896,7 +1950,7 @@
 
 my $ERRORS = 0;
 
-our $VERSION = '1.967009';
+our $VERSION = '1.967012';
 $VERSION = eval $VERSION;
 $_FILENAME=__FILE__;
 
@@ -2018,61 +2072,61 @@
            to be part of.");
 }
 
-my $NEGLOOKAHEAD    = '\G(\s*\.\.\.\!)';
-my $POSLOOKAHEAD    = '\G(\s*\.\.\.)';
-my $RULE        = '\G\s*(\w+)[ \t]*:';
-my $PROD        = '\G\s*([|])';
-my $TOKEN       = q{\G\s*/((\\\\/|\\\\\\\\|[^/])*)/([cgimsox]*)};
-my $MTOKEN      = q{\G\s*(m\s*[^\w\s])};
-my $LITERAL     = q{\G\s*'((\\\\['\\\\]|[^'])*)'};
+my $NEGLOOKAHEAD    =  '\G(\s*\.\.\.\!)';
+my $POSLOOKAHEAD    =  '\G(\s*\.\.\.)';
+my $RULE            =  '\G\s*(\w+)[ \t]*:';
+my $PROD            =  '\G\s*([|])';
+my $TOKEN           = q{\G\s*/((\\\\/|\\\\\\\\|[^/])*)/([cgimsox]*)};
+my $MTOKEN          = q{\G\s*(m\s*[^\w\s])};
+my $LITERAL         = q{\G\s*'((\\\\['\\\\]|[^'])*)'};
 my $INTERPLIT       = q{\G\s*"((\\\\["\\\\]|[^"])*)"};
-my $SUBRULE     = '\G\s*(\w+)';
-my $MATCHRULE       = '\G(\s*<matchrule:)';
-my $SIMPLEPAT       = '((\\s+/[^/\\\\]*(?:\\\\.[^/\\\\]*)*/)?)';
-my $OPTIONAL        = '\G\((\?)'.$SIMPLEPAT.'\)';
-my $ANY         = '\G\((s\?)'.$SIMPLEPAT.'\)';
-my $MANY        = '\G\((s|\.\.)'.$SIMPLEPAT.'\)';
-my $EXACTLY     = '\G\(([1-9]\d*)'.$SIMPLEPAT.'\)';
-my $BETWEEN     = '\G\((\d+)\.\.([1-9]\d*)'.$SIMPLEPAT.'\)';
-my $ATLEAST     = '\G\((\d+)\.\.'.$SIMPLEPAT.'\)';
-my $ATMOST      = '\G\(\.\.([1-9]\d*)'.$SIMPLEPAT.'\)';
-my $BADREP      = '\G\((-?\d+)?\.\.(-?\d+)?'.$SIMPLEPAT.'\)';
-my $ACTION      = '\G\s*\{';
-my $IMPLICITSUBRULE = '\G\s*\(';
-my $COMMENT     = '\G\s*(#.*)';
-my $COMMITMK        = '\G\s*<commit>';
-my $UNCOMMITMK      = '\G\s*<uncommit>';
-my $QUOTELIKEMK     = '\G\s*<perl_quotelike>';
-my $CODEBLOCKMK     = '\G\s*<perl_codeblock(?:\s+([][()<>{}]+))?>';
-my $VARIABLEMK      = '\G\s*<perl_variable>';
-my $NOCHECKMK       = '\G\s*<nocheck>';
-my $AUTOACTIONPATMK = '\G\s*<autoaction:';
-my $AUTOTREEMK      = '\G\s*<autotree(?::\s*([\w:]+)\s*)?>';
-my $AUTOSTUBMK      = '\G\s*<autostub>';
-my $AUTORULEMK      = '\G\s*<autorule:(.*?)>';
-my $REJECTMK        = '\G\s*<reject>';
-my $CONDREJECTMK    = '\G\s*<reject:';
-my $SCOREMK     = '\G\s*<score:';
-my $AUTOSCOREMK     = '\G\s*<autoscore:';
-my $SKIPMK      = '\G\s*<skip:';
-my $OPMK        = '\G\s*<(left|right)op(?:=(\'.*?\'))?:';
-my $ENDDIRECTIVEMK  = '\G\s*>';
-my $RESYNCMK        = '\G\s*<resync>';
-my $RESYNCPATMK     = '\G\s*<resync:';
-my $RULEVARPATMK    = '\G\s*<rulevar:';
-my $DEFERPATMK      = '\G\s*<defer:';
-my $TOKENPATMK      = '\G\s*<token:';
-my $AUTOERRORMK     = '\G\s*<error(\??)>';
-my $MSGERRORMK      = '\G\s*<error(\??):';
-my $NOCHECK     = '\G\s*<nocheck>';
-my $WARNMK      = '\G\s*<warn((?::\s*(\d+)\s*)?)>';
-my $HINTMK      = '\G\s*<hint>';
-my $TRACEBUILDMK    = '\G\s*<trace_build((?::\s*(\d+)\s*)?)>';
-my $TRACEPARSEMK    = '\G\s*<trace_parse((?::\s*(\d+)\s*)?)>';
+my $SUBRULE         =  '\G\s*(\w+)';
+my $MATCHRULE       =  '\G(\s*<matchrule:)';
+my $SIMPLEPAT       =  '((\\s+/[^/\\\\]*(?:\\\\.[^/\\\\]*)*/)?)';
+my $OPTIONAL        =  '\G\((\?)'.$SIMPLEPAT.'\)';
+my $ANY             =  '\G\((s\?)'.$SIMPLEPAT.'\)';
+my $MANY            =  '\G\((s|\.\.)'.$SIMPLEPAT.'\)';
+my $EXACTLY         =  '\G\(([1-9]\d*)'.$SIMPLEPAT.'\)';
+my $BETWEEN         =  '\G\((\d+)\.\.([1-9]\d*)'.$SIMPLEPAT.'\)';
+my $ATLEAST         =  '\G\((\d+)\.\.'.$SIMPLEPAT.'\)';
+my $ATMOST          =  '\G\(\.\.([1-9]\d*)'.$SIMPLEPAT.'\)';
+my $BADREP          =  '\G\((-?\d+)?\.\.(-?\d+)?'.$SIMPLEPAT.'\)';
+my $ACTION          =  '\G\s*\{';
+my $IMPLICITSUBRULE =  '\G\s*\(';
+my $COMMENT         =  '\G\s*(#.*)';
+my $COMMITMK        =  '\G\s*<commit>';
+my $UNCOMMITMK      =  '\G\s*<uncommit>';
+my $QUOTELIKEMK     =  '\G\s*<perl_quotelike>';
+my $CODEBLOCKMK     =  '\G\s*<perl_codeblock(?:\s+([][()<>{}]+))?>';
+my $VARIABLEMK      =  '\G\s*<perl_variable>';
+my $NOCHECKMK       =  '\G\s*<nocheck>';
+my $AUTOACTIONPATMK =  '\G\s*<autoaction:';
+my $AUTOTREEMK      =  '\G\s*<autotree(?::\s*([\w:]+)\s*)?>';
+my $AUTOSTUBMK      =  '\G\s*<autostub>';
+my $AUTORULEMK      =  '\G\s*<autorule:(.*?)>';
+my $REJECTMK        =  '\G\s*<reject>';
+my $CONDREJECTMK    =  '\G\s*<reject:';
+my $SCOREMK         =  '\G\s*<score:';
+my $AUTOSCOREMK     =  '\G\s*<autoscore:';
+my $SKIPMK          =  '\G\s*<skip:';
+my $OPMK            =  '\G\s*<(left|right)op(?:=(\'.*?\'))?:';
+my $ENDDIRECTIVEMK  =  '\G\s*>';
+my $RESYNCMK        =  '\G\s*<resync>';
+my $RESYNCPATMK     =  '\G\s*<resync:';
+my $RULEVARPATMK    =  '\G\s*<rulevar:';
+my $DEFERPATMK      =  '\G\s*<defer:';
+my $TOKENPATMK      =  '\G\s*<token:';
+my $AUTOERRORMK     =  '\G\s*<error(\??)>';
+my $MSGERRORMK      =  '\G\s*<error(\??):';
+my $NOCHECK         =  '\G\s*<nocheck>';
+my $WARNMK          =  '\G\s*<warn((?::\s*(\d+)\s*)?)>';
+my $HINTMK          =  '\G\s*<hint>';
+my $TRACEBUILDMK    =  '\G\s*<trace_build((?::\s*(\d+)\s*)?)>';
+my $TRACEPARSEMK    =  '\G\s*<trace_parse((?::\s*(\d+)\s*)?)>';
 my $UNCOMMITPROD    = $PROD.'\s*<uncommit';
 my $ERRORPROD       = $PROD.'\s*<error';
-my $LONECOLON       = '\G\s*:';
-my $OTHER       = '\G\s*([^\s]+)';
+my $LONECOLON       =  '\G\s*:';
+my $OTHER           =  '\G\s*([^\s]+)';
 
 my @lines = 0;
 
@@ -2532,7 +2586,7 @@
             _parseunneg("a rule declaration", 0,
                     $lookahead,$line, substr($grammar, $-[0], $+[0] - $-[0]) ) 
or next;
             my $rulename = $1;
-            if ($rulename =~ /Replace|Extend|Precompile|Save/ )
+            if ($rulename =~ 
/Replace|Extend|Precompile|PrecompiledRuntime|Save/ )
             {
                 _warn(2,"Rule \"$rulename\" hidden by method
                        Parse::RecDescent::$rulename",$line)
@@ -3049,14 +3103,17 @@
 sub _code($)
 {
     my $self = shift;
-    my $initial_skip = defined($self->{skip}) ? $self->{skip} : $skip;
+    require Data::Dumper;
+    my $initial_skip = defined($self->{skip}) ?
+      '$skip = ' . $self->{skip} . ';' :
+      Data::Dumper->Dump([$skip],[qw(skip)]);
 
     my $code = qq!
 package $self->{namespace};
 use strict;
 use vars qw(\$skip \$AUTOLOAD $self->{localvars} );
 \@$self->{namespace}\::ISA = ();
-\$skip = '$initial_skip';
+$initial_skip
 $self->{startcode}
 
 {
@@ -3082,7 +3139,9 @@
     $self->{"startcode"} = '';
 
     my $rule;
-    foreach $rule ( values %{$self->{"rules"}} )
+    # sort the rules to ensure the output is reproducible
+    foreach $rule ( sort { $a->{name} cmp $b->{name} }
+                    values %{$self->{"rules"}} )
     {
         if ($rule->{"changed"})
         {
@@ -3427,8 +3486,8 @@
 
 =head1 VERSION
 
-This document describes version 1.967009 of Parse::RecDescent
-released March 16th, 2012.
+This document describes version 1.967012 of Parse::RecDescent
+released September 13th, 2015.
 
 =head1 SYNOPSIS
 
@@ -3881,7 +3940,7 @@
 The results of named subrules are stored in the hash under each
 subrule's name (including the repetition specifier, if any),
 whilst all other items are stored under a "named
-positional" key that indictates their ordinal position within their item
+positional" key that indicates their ordinal position within their item
 type: __STRINGI<n>__, __PATTERNI<n>__, __DIRECTIVEI<n>__, __ACTIONI<n>__:
 
     stuff: /various/ bits 'and' pieces "then" data 'end' { save }
@@ -4407,7 +4466,7 @@
 Normally, if a subrule appears in some production, but no rule of that
 name is ever defined in the grammar, the production which refers to the
 non-existent subrule fails immediately. This typically occurs as a
-result of misspellings, and is a sufficiently common occurance that a
+result of misspellings, and is a sufficiently common occurrence that a
 warning is generated for such situations.
 
 However, when prototyping a grammar it is sometimes useful to be
@@ -4493,7 +4552,7 @@
 
     inner_word: word ...!......!word
 
-is exactly equivalent the the original example above (a warning is issued in
+is exactly equivalent to the original example above (a warning is issued in
 cases like these, since they often indicate something left out, or
 misunderstood).
 
@@ -4660,19 +4719,20 @@
 
     OneLiner: Command <skip:'[ \t]*'> Arg(s) /;/
 
-causes only blanks and tabs to be skipped before terminals in the C<Arg>
-subrule (and any of I<its> subrules>, and also before the final C</;/> 
terminal.
-Once the production is complete, the previous terminal prefix is
-reinstated. Note that this implies that distinct productions of a rule
-must reset their terminal prefixes individually.
+causes only blanks and tabs to be skipped before terminals in the
+C<Arg> subrule (and any of I<its> subrules>, and also before the final
+C</;/> terminal.  Once the production is complete, the previous
+terminal prefix is reinstated. Note that this implies that distinct
+productions of a rule must reset their terminal prefixes individually.
 
-The C<E<lt>skipE<gt>> directive evaluates to the I<previous> terminal prefix,
-so it's easy to reinstate a prefix later in a production:
+The C<E<lt>skipE<gt>> directive evaluates to the I<previous> terminal
+prefix, so it's easy to reinstate a prefix later in a production:
 
     Command: <skip:","> CSV(s) <skip:$item[1]> Modifier
 
-The value specified after the colon is interpolated into a pattern, so all of
-the following are equivalent (though their efficiency increases down the list):
+The value specified after the colon is interpolated into a pattern, so
+all of the following are equivalent (though their efficiency increases
+down the list):
 
     <skip: "$colon|$comma">   # ASSUMING THE VARS HOLD THE OBVIOUS VALUES
 
@@ -4716,10 +4776,15 @@
 C<Rule_with_dynamic_skip> and have it skip whatever you specified.
 
 B<Note: Up to release 1.51 of Parse::RecDescent, an entirely different
-mechanism was used for specifying terminal prefixes. The current method
-is not backwards-compatible with that early approach. The current approach
-is stable and will not to change again.>
-
+mechanism was used for specifying terminal prefixes. The current
+method is not backwards-compatible with that early approach. The
+current approach is stable and will not change again.>
+
+B<Note: the global C<E<lt>skipE<gt>> directive added in 1.967_004 did
+not interpolate the pattern argument, instead the pattern was placed
+inside of single quotes and then interpolated. This behavior was
+changed in 1.967_010 so that all C<E<lt>skipE<gt>> directives behavior
+similarly.>
 
 =item Resynchronization
 
@@ -4953,7 +5018,7 @@
 grammar: C<< <warn> >>. It takes an optional argument, which specifies
 the warning level: C<< <warn: 2> >>.
 
-See F<"DIAGNOSTICS"> for a list of the varous error and warning messages
+See F<"DIAGNOSTICS"> for a list of the various error and warning messages
 that Parse::RecDescent generates when these two variables are defined.
 
 Defining any of the remaining variables (which are not defined by
@@ -5273,7 +5338,7 @@
 In this case, even though the first production of C<sentence> caused
 the subrules C<noun> and C<trans> to match, that production ultimately
 failed and so the deferred actions queued by those subrules were subsequently
-disgarded. The second production then succeeded, causing the entire
+discarded. The second production then succeeded, causing the entire
 parse to succeed, and so the deferred actions queued by the (second) match of
 the C<noun> subrule and the subsequent match of C<intrans> I<are> preserved and
 eventually executed.
@@ -5618,7 +5683,7 @@
 "fruit flies like a banana", then the second production is probably
 the right match.
 
-To cater for such situtations, the C<E<lt>score:...E<gt>> can be used.
+To cater for such situations, the C<E<lt>score:...E<gt>> can be used.
 The directive is equivalent to an unconditional C<E<lt>rejectE<gt>>,
 except that it allows you to specify a "score" for the current
 production. If that score is numerically greater than the best
@@ -5921,7 +5986,7 @@
     $add = "name: 'Jimmy-Bob' | 'Bobby-Jim'\ndesc: colour /necks?/";
     parser->Replace($add);
 
-are are I<only> valid "name"s and the one possible description.
+there are I<only> valid "name"s and the one possible description.
 
 A more interesting use of the C<Extend> and C<Replace> methods is to call them
 inside the action of an executing parser. For example:
@@ -5986,7 +6051,7 @@
 
     use Parse::RecDescent;
 
-    Parse::RecDescent->Precompile([$options_hashref], $grammar, "PreGrammar");
+    Parse::RecDescent->Precompile([$options_hashref], $grammar, "PreGrammar", 
["RuntimeClass"]);
 
 The first required argument is the grammar string, the second is the
 name of the class to be built. The name of the module file is
@@ -5997,10 +6062,14 @@
 
 would produce a module file named Parser.pm.
 
+After the class name, you may specify the name of the runtime_class
+called by the Precompiled parser.  See L</"Precompiled runtimes"> for
+more details.
+
 An optional hash reference may be supplied as the first argument to
 C<Precompile>.  This argument is currently EXPERIMENTAL, and may change
 in a future release of Parse::RecDescent.  The only supported option
-is currently C<-standalone>, see L</"Standalone Precompiled Parsers">.
+is currently C<-standalone>, see L</"Standalone precompiled parsers">.
 
 It is somewhat tedious to have to write a small Perl program just to
 generate a precompiled grammar class, so Parse::RecDescent has some special
@@ -6009,7 +6078,7 @@
 If your grammar is specified in a file named F<grammar>, you can generate
 a class named Yet::Another::Grammar like so:
 
-    > perl -MParse::RecDescent - grammar Yet::Another::Grammar
+    > perl -MParse::RecDescent - grammar Yet::Another::Grammar [Runtime::Class]
 
 This would produce a file named F<Grammar.pm> containing the full
 definition of a class called Yet::Another::Grammar. Of course, to use
@@ -6040,7 +6109,7 @@
 it has no effect on I<parsing> speed. RecDescent 2.0 will address that
 problem.
 
-=head3 Standalone Precompiled Parsers
+=head3 Standalone precompiled parsers
 
 Until version 1.967003 of Parse::RecDescent, parser modules built with
 C<Precompile> were dependent on Parse::RecDescent.  Future
@@ -6051,19 +6120,59 @@
 itself in the resulting .pm file if you pass the boolean option
 C<-standalone> to C<Precompile>:
 
-    Parse::RecDescent->Precompile({ -standalone = 1, },
+    Parse::RecDescent->Precompile({ -standalone => 1, },
         $grammar, "My::New::Parser");
 
-Parse::RecDescent is included as Parse::RecDescent::_Runtime in order
-to avoid conflicts between an installed version of Parse::RecDescent
-and a precompiled, standalone parser made with another version of
-Parse::RecDescent.  This renaming is experimental, and is subject to
-change in future versions.
+Parse::RecDescent is included as C<$class::_Runtime> in order to avoid
+conflicts between an installed version of Parse::RecDescent and other
+precompiled, standalone parser made with Parse::RecDescent.  The name
+of this class may be changed with the C<-runtime_class> option to
+Precompile.  This renaming is experimental, and is subject to change
+in future versions.
 
 Precompiled parsers remain dependent on Parse::RecDescent by default,
 as this feature is still considered experimental.  In the future,
 standalone parsers will become the default.
 
+=head3 Precompiled runtimes
+
+Standalone precompiled parsers each include a copy of
+Parse::RecDescent.  For users who have a family of related precompiled
+parsers, this is very inefficient.  C<Precompile> now supports an
+experimental C<-runtime_class> option.  To build a precompiled parser
+with a different runtime name, call:
+
+    Parse::RecDescent->Precompile({
+            -standalone => 1,
+            -runtime_class => "My::Runtime",
+        },
+        $grammar, "My::New::Parser");
+
+The resulting standalone parser will contain a copy of
+Parse::RecDescent, renamed to "My::Runtime".
+
+To build a set of parsers that C<use> a custom-named runtime, without
+including that runtime in the output, simply build those parsers with
+C<-runtime_class> and without C<-standalone>:
+
+    Parse::RecDescent->Precompile({
+            -runtime_class => "My::Runtime",
+        },
+        $grammar, "My::New::Parser");
+
+The runtime itself must be generated as well, so that it may be
+C<use>d by My::New::Parser.  To generate the runtime file, use one of
+the two folling calls:
+
+    Parse::RecDescent->PrecompiledRuntime("My::Runtime");
+
+    Parse::RecDescent->Precompile({
+            -standalone => 1,
+            -runtime_class => "My::Runtime",
+        },
+        '', # empty grammar
+        "My::Runtime");
+
 =head1 GOTCHAS
 
 This section describes common mistakes that grammar writers seem to
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/Parse-RecDescent-1.967009/t/precompile.t 
new/Parse-RecDescent-1.967012/t/precompile.t
--- old/Parse-RecDescent-1.967009/t/precompile.t        2012-02-09 
04:10:52.000000000 +0100
+++ new/Parse-RecDescent-1.967012/t/precompile.t        2015-09-13 
02:44:06.000000000 +0200
@@ -3,6 +3,9 @@
 use Parse::RecDescent;
 use Test::More tests => 14;
 
+# Turn off the "build a -standalone parser" precompile warning
+our $RD_HINT = 0;
+
 # mask "subroutine element redefined" warnings
 local $^W;
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/Parse-RecDescent-1.967009/t/reproducible.t 
new/Parse-RecDescent-1.967012/t/reproducible.t
--- old/Parse-RecDescent-1.967009/t/reproducible.t      1970-01-01 
01:00:00.000000000 +0100
+++ new/Parse-RecDescent-1.967012/t/reproducible.t      2015-09-13 
16:57:36.000000000 +0200
@@ -0,0 +1,421 @@
+# Ensure that the output of Parse::RecDescent is the same, time after
+# time.  This prevents automated builds with precompiled parsers from
+# registering changes, with no change input.
+
+use strict;
+use warnings;
+use Parse::RecDescent;
+use Test::More tests => 41;
+
+# Turn off the "build a -standalone parser" precompile warning
+our $RD_HINT = 0;
+
+# mask "subroutine element redefined" warnings
+local $^W;
+
+my $grammar = <<'EOGRAMMAR';
+
+
+    translation_unit:
+        external_declaration(s)
+    |   <error>
+
+    external_declaration:
+        function_definition
+    |   declaration
+    |   <resync>
+        {
+            if ($::opt_SKIPPEDLINES || (defined $::opt_VERBOSE and 
$::opt_VERBOSE >= 1 ))
+            {
+                print "Skipping line $thisline\n"   # Try next line if 
possible...
+            }
+         }
+
+    function_definition:
+        declaration_specifiers(?) declarator declaration_list(?) 
compound_statement
+        {
+            if($::opt_FUNCTIONS)
+            {
+                $::functions_output .= ::flatten_list($item[1]);
+                $::functions_output .= ::flatten_list($item[2]);
+                $::functions_output .= ::flatten_list($item[3]) . ";\n";
+            }
+        }
+
+    declaration:
+        declaration_specifiers init_declarator_list(?) ';'
+        {
+            if($::opt_DECLARATIONS)
+            {
+                $::declarations_output .= ::flatten_list($item[1]);
+                $::declarations_output .= ::flatten_list($item[2]);
+                $::declarations_output .= ::flatten_list($item[3]) . "\n";
+            }
+        }
+
+    declaration_list:
+        declaration(s)
+
+    declaration_specifiers:
+        type_qualifier              declaration_specifiers(?)
+    |   storage_class_specifier declaration_specifiers(?)
+    |   type_specifier          declaration_specifiers(?)
+
+    storage_class_specifier:
+          'auto'
+        | 'register'
+        | 'static'
+        | 'extern'
+        | 'typedef'
+
+    type_specifier:
+          'int'
+        | 'double'
+        | 'void'
+        | 'char'
+        | 'long'
+        | 'float'
+        | 'signed'
+        | 'unsigned'
+        | 'short'
+        | struct_or_union_specifier
+        | enum_specifier
+        | typedef_name ...typedef_name_lookahead { [$item[1] ] }
+
+    typedef_name_lookahead:
+        declarator
+#   |   pointer
+#   |   ',' ...parameter_type_list
+#   |   ')'
+
+    type_qualifier:
+          'const'
+        | 'volatile'
+
+    struct_or_union_specifier:
+          struct_or_union IDENTIFIER(?) '{' struct_declaration_list(?) '}'
+          {
+            if($::opt_STRUCTS){
+                $::structs_output .= ::flatten_list($item[1]) . " ";
+                $::structs_output .= ::flatten_list($item[2]);
+                $::structs_output .= ::flatten_list($item[3]) . "\n";
+                $::structs_output .= ::flatten_list_beautified($item[4]);
+                $::structs_output .= ::flatten_list($item[5]) . ";\n\n";
+            }
+          }
+        | struct_or_union IDENTIFIER
+
+    struct_or_union:
+          'struct'
+        | 'union'
+
+
+    struct_declaration_list:
+        struct_declaration(s)
+
+    init_declarator_list:
+        init_declarator(s /(,)/)
+
+    init_declarator:
+        declarator '=' initializer
+    |   declarator
+
+    struct_declaration:
+        specifier_qualifier_list struct_declarator_list ';'
+
+    specifier_qualifier_list:
+        type_specifier specifier_qualifier_list(?)
+    |   type_qualifier specifier_qualifier_list(?)
+
+    struct_declarator_list:
+        struct_declarator(s /(,)/)
+
+    struct_declarator:
+        declarator(?) ':' constant_expression
+    |   declarator
+
+    enum_specifier:
+        'enum' IDENTIFIER(?) '{' enumerator_list '}'
+          {
+            if($::opt_STRUCTS){
+                $::structs_output .= ::flatten_list($item[1]) . " ";
+                $::structs_output .= ::flatten_list($item[2]);
+                $::structs_output .= ::flatten_list($item[3]) . "\n";
+                $::structs_output .= ::flatten_list_beautified($item[4]);
+                $::structs_output .= ::flatten_list($item[5]) . ";\n\n";
+            }
+          }
+    |   'enum' IDENTIFIER
+
+    enumerator_list:
+        enumerator(s /(,)/)
+
+    enumerator:
+        IDENTIFIER ('=' constant_expression)(?)
+
+    declarator:
+        pointer(?) direct_declarator
+
+    function_signature:
+        '[' constant_expression(?) ']'
+    |   '(' parameter_type_list ')'
+    |   '(' identifier_list(?) ')'
+
+    direct_declarator:
+        IDENTIFIER function_signature(s?)
+    |   '(' declarator ')' function_signature(s?)
+
+
+    pointer:
+      '*' type_qualifier_list(?) pointer(?)
+
+    type_qualifier_list:
+        type_qualifier(s)
+
+    parameter_type_list:
+        parameter_list (',' '...')(?)
+
+    parameter_list:
+        parameter_declaration(s /(,)/)
+
+    parameter_declaration:
+        declaration_specifiers declarator
+    |   declaration_specifiers abstract_declarator(?)
+
+    identifier_list:
+        IDENTIFIER(s /(,)/)
+
+    initializer:
+        assignment_expression
+    |   '{' initializer_list (',')(?) '}'
+
+    initializer_list:
+        initializer(s /(,)/)
+
+    type_name:
+        specifier_qualifier_list abstract_declarator(?)
+
+    abstract_declarator:
+        pointer(?) direct_abstract_declarator
+    |   pointer
+
+    abstract_type:
+        '[' constant_expression(?) ']'
+    |   '(' parameter_type_list(?) ')'
+
+    direct_abstract_declarator:
+        '(' abstract_declarator ')' abstract_type(s?)
+    |   abstract_type(s)
+
+    typedef_name:
+        IDENTIFIER
+
+    statement:
+        selection_statement
+    |   expression_statement
+    |   iteration_statement
+    |   compound_statement
+    |   jump_statement
+    |   labeled_statement
+
+
+    labeled_statement:
+        'case' constant_expression ':' statement
+    |   IDENTIFIER ':' statement
+    |   'default' ':' statement
+
+    expression_statement:
+        expression(?) ';'
+
+    compound_statement:
+        '{' declaration_list(?) statement_list(?) '}'
+
+    statement_list:
+        statement(s)
+
+    selection_statement:
+        'if'      '(' expression  ')' statement ('else' statement)(?)
+    |   'switch'  '(' expression  ')' statement
+
+    iteration_statement:
+        'for'   '(' expression(?) ';' expression(?) ';' expression(?) ')' 
statement
+    |   'while' '(' expression ')' statement
+    |   'do' statement 'while' '(' expression ')'
+
+    jump_statement:
+        'return' expression(?) ';'
+    |   'break' ';'
+    |   'continue' ';'
+    |   'goto' IDENTIFIER ';'
+
+    expression:
+        assignment_expression(s /(,)/)
+
+    assignment_expression:
+        unary_expression ASSIGNMENT_OPERATOR assignment_expression
+    |   conditional_expression
+
+
+    conditional_expression:
+         logical_OR_expression  ('?' expression ':' conditional_expression)(?)
+
+    constant_expression:
+        conditional_expression
+
+    logical_OR_expression:
+        logical_AND_expression(s /(\|\|)/)
+
+    logical_AND_expression:
+        inclusive_OR_expression(s /(&&)/)
+
+    inclusive_OR_expression:
+        exclusive_OR_expression(s /(\|)/)
+
+    exclusive_OR_expression:
+        AND_expression(s /(\^)/)
+
+    AND_expression:
+        equality_expression(s /(&)/)
+
+    equality_expression:
+        relational_expression(s /(==|!=)/)
+
+    relational_expression:
+        shift_expression(s /(<=|>=|<|>)/)
+
+    shift_expression:
+        additive_expression(s /(<<|>>)/)
+
+    additive_expression:
+        multiplicative_expression(s /(\+|-)/)
+
+    multiplicative_expression:
+        cast_expression(s /(\*|\/|%)/)
+
+    cast_expression:
+        unary_expression
+    |   '(' type_name ')' cast_expression
+
+    unary_expression:
+        postfix_expression
+    |   '++'  unary_expression
+    |   '--'  unary_expression
+    |   'sizeof' '(' type_name ')'
+    |   UNARY_OPERATOR cast_expression
+    |   'sizeof'    unary_expression
+
+
+    postfix_expression:
+        primary_expression postfix_expression_token(s?)
+
+
+    postfix_expression_token:
+          '[' expression ']'
+        | '(' argument_expression_list(?)')'
+        | '.'  IDENTIFIER
+        | '->' IDENTIFIER
+        | '++'
+        | '--'
+
+
+    primary_expression:
+        IDENTIFIER
+    |   constant
+    |   STRING
+    |   '(' expression ')'
+
+    argument_expression_list:
+        assignment_expression(s /(,)/)
+
+    constant:
+        CHARACTER_CONSTANT
+    |   FLOATING_CONSTANT
+    |   INTEGER_CONSTANT
+    |   ENUMERATION_CONSTANT
+
+
+###     TERMINALS
+
+
+    INTEGER_CONSTANT:
+        /(?:0[xX][\da-fA-F]+)                   # Hexadecimal
+         |(?:0[0-7]*)                           # Octal or Zero
+         |(?:[1-9]\d*)                          # Decimal
+         [uUlL]?                                # Suffix
+         /x
+
+    CHARACTER_CONSTANT:
+        /'([^\\'"]                          # None of these
+         |\\['\\ntvbrfa'"]                  # or a backslash followed by one 
of those
+         |\\[0-7]{1,3}|\\x\d+)'             # or an octal or hex constant
+        /x
+
+    FLOATING_CONSTANT:
+        /(?:\d+|(?=\.\d+))                  # No leading digits only if 
'.moreDigits' follows
+         (?:\.|(?=[eE]))                        # There may be no floating 
point only if an exponent is present
+         \d*                                    # Zero or more floating digits
+         ([eE][+-]?\d+)?                        # expontent
+         [lLfF]?                                # Suffix
+        /x
+
+    ENUMERATION_CONSTANT:
+        INTEGER_CONSTANT
+
+    STRING:
+        /"(([^\\'"])                            # None of these
+        |(\\[\\ntvbrfa'"])                  # or a backslash followed by one 
of those
+        |(\\[0-7]{1,3})|(\\x\d+))*"/x       # or an octal or hex
+
+    IDENTIFIER:
+        
/(?!(auto|break|case|char|const|continue|default|do|double|else|enum|extern|float|for|goto
      # LOOKAHEAD FOR KEYWORDS
+            
|if|int|long|register|return|signed|sizeof|short|static|struct|switch|typedef   
        # NONE OF THE KEYWORDS
+            |union|unsigned|void|volatile|while)[^a-zA-Z_])                    
                         # SHOULD FULLY MATCH!
+            (([a-zA-Z]\w*)|(_\w+))/x                                           
                     # Check for valid identifier
+
+    ASSIGNMENT_OPERATOR:
+        '=' | '*=' | '/=' | '%=' | '+=' | '-=' | '<<=' | '>>=' | '&=' | '^=' | 
'|='
+
+    UNARY_OPERATOR:
+        '&' | '*' | '+' | '-' | '~' | '!'
+
+EOGRAMMAR
+
+
+# Create the reference output
+my $class = "TestParser";
+
+sub CompileParser {
+    my $pm_filename = $class . '.pm';
+
+    eval {
+        Parse::RecDescent->Precompile({-standalone => 1,},
+                                      $grammar,
+                                      $class);
+    };
+    ok(!$@, qq{created a precompiled parser: } . $@);
+    ok(-e $pm_filename, "found the precompiled parser file");
+
+    my $fh;
+    ok((open $fh, '<', $pm_filename), "opened the precompiled parser");
+    my $parser_text;
+
+    local $/;
+    $parser_text = <$fh>;
+    close $fh;
+
+    ok((defined($parser_text) and length($parser_text)),
+       "parser contains data");
+
+    unlink $pm_filename;
+    ok(!-e $pm_filename, "deleted precompiled parser");
+
+    return $parser_text;
+}
+
+my $reference_parser = CompileParser();
+
+for (0..5) {
+    my $new_parser = CompileParser($_);
+
+    ok($new_parser eq $reference_parser, "parsers match");
+}
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/Parse-RecDescent-1.967009/t/skip.t 
new/Parse-RecDescent-1.967012/t/skip.t
--- old/Parse-RecDescent-1.967009/t/skip.t      2012-02-19 20:53:32.000000000 
+0100
+++ new/Parse-RecDescent-1.967012/t/skip.t      2015-09-13 02:44:06.000000000 
+0200
@@ -24,7 +24,7 @@
 
 # Test setting the initial skip via the <skip:> global directive
 RunTests(q{
-<skip:(?mxs: \s+ |\# .*?$)*>
+<skip:'(?mxs: \s+ |\# .*?$)*'>
 });
 
 # Test setting the initial skip via $Parse::RecDescent::skip global

++++++ cpanspec.yml ++++++
---
#description_paragraphs: 3
#no_testing: broken upstream
#sources:
#  - source1
#  - source2
#patches:
#  foo.patch: -p1
#  bar.patch:
#preamble: |-
# BuildRequires:  gcc-c++
#post_prep: |-
# hunspell=`pkg-config --libs hunspell | sed -e 's,-l,,; s,  *,,g'`
# sed -i -e "s,hunspell-X,$hunspell," t/00-prereq.t Makefile.PL 
#post_install: |-
# sed on %{name}.files
#license: SUSE-NonFree
#skip_noarch: 1
#custom_build: |-
#./Build build flags=%{?_smp_mflags} --myflag
#custom_test: |-
#startserver && make test
#ignore_requires: Bizarre::Module

Reply via email to