This is an automated email from the git hooks/post-receive script.

js pushed a commit to tag PEVANS
in repository libparser-mgc-perl.

commit 6cecc60f0a808c2c097a3a91fbc02e672a3cc04e
Author: Paul Evans <leon...@leonerd.org.uk>
Date:   Wed Jan 5 13:38:33 2011 +0000

    Import of PEVANS/Parser-MGC-0.04 from CPAN.
    
    gitpan-cpan-distribution: Parser-MGC
    gitpan-cpan-version:      0.04
    gitpan-cpan-path:         PEVANS/Parser-MGC-0.04.tar.gz
    gitpan-cpan-author:       PEVANS
    gitpan-cpan-maturity:     released
---
 Changes                                  |  9 ++++++
 LICENSE                                  |  6 ++--
 MANIFEST                                 |  8 +++--
 META.yml                                 |  4 +--
 README                                   | 15 +++++++++
 examples/synopsis.pl                     | 26 ++++++++++++++++
 lib/Parser/MGC.pm                        | 53 +++++++++++++++++++++++++++++---
 t/10token_int.t                          |  6 +++-
 t/11token_float.t                        | 45 +++++++++++++++++++++++++++
 t/{11token_string.t => 12token_string.t} | 12 +++++++-
 t/{12token_ident.t => 13token_ident.t}   |  0
 t/{13token_kw.t => 14token_kw.t}         |  0
 12 files changed, 170 insertions(+), 14 deletions(-)

diff --git a/Changes b/Changes
index 58675b5..18985a7 100644
--- a/Changes
+++ b/Changes
@@ -1,5 +1,14 @@
 Revision history for Parser-MGC
 
+0.04    CHANGES:
+         * Added ->token_float
+         * Optionally parse 0o... ad octal integers
+
+        BUGFIXES:
+         * Match strings non-greedily
+         * Correct exception printing when line indent includes tabs (thanks
+           to Khisanth/#perl)
+
 0.03    CHANGES:
          * Expanded documentation, more examples
         
diff --git a/LICENSE b/LICENSE
index bed175a..c441828 100644
--- a/LICENSE
+++ b/LICENSE
@@ -1,4 +1,4 @@
-This software is copyright (c) 2010 by Paul Evans <leon...@leonerd.org.uk>.
+This software is copyright (c) 2011 by Paul Evans <leon...@leonerd.org.uk>.
 
 This is free software; you can redistribute it and/or modify it under
 the same terms as the Perl 5 programming language system itself.
@@ -12,7 +12,7 @@ b) the "Artistic License"
 
 --- The GNU General Public License, Version 1, February 1989 ---
 
-This software is Copyright (c) 2010 by Paul Evans <leon...@leonerd.org.uk>.
+This software is Copyright (c) 2011 by Paul Evans <leon...@leonerd.org.uk>.
 
 This is free software, licensed under:
 
@@ -270,7 +270,7 @@ That's all there is to it!
 
 --- The Artistic License 1.0 ---
 
-This software is Copyright (c) 2010 by Paul Evans <leon...@leonerd.org.uk>.
+This software is Copyright (c) 2011 by Paul Evans <leon...@leonerd.org.uk>.
 
 This is free software, licensed under:
 
diff --git a/MANIFEST b/MANIFEST
index eedbeb7..af37bd3 100644
--- a/MANIFEST
+++ b/MANIFEST
@@ -1,6 +1,7 @@
 Build.PL
 Changes
 examples/eval-expr.pl
+examples/synopsis.pl
 lib/Parser/MGC.pm
 LICENSE
 Makefile.PL
@@ -13,9 +14,10 @@ t/02expect.t
 t/03where.t
 t/04comment.t
 t/10token_int.t
-t/11token_string.t
-t/12token_ident.t
-t/13token_kw.t
+t/11token_float.t
+t/12token_string.t
+t/13token_ident.t
+t/14token_kw.t
 t/20maybe.t
 t/21scope_of.t
 t/22list_of.t
diff --git a/META.yml b/META.yml
index cb085ae..912d436 100644
--- a/META.yml
+++ b/META.yml
@@ -15,9 +15,9 @@ name: Parser-MGC
 provides:
   Parser::MGC:
     file: lib/Parser/MGC.pm
-    version: 0.03
+    version: 0.04
 requires:
   File::Slurp: 0
 resources:
   license: http://dev.perl.org/licenses/
-version: 0.03
+version: 0.04
diff --git a/README b/README
index 5130c07..4024ed1 100644
--- a/README
+++ b/README
@@ -50,6 +50,10 @@ CONSTRUCTOR
             references, to override the default patterns used to match
             tokens. See "PATTERNS" below
 
+    accept_0o_oct => BOOL
+            If true, the "token_int" method will also accept integers with a
+            "0o" prefix as octal.
+
 PATTERNS
     The following pattern names are recognised. They may be passed to the
     constructor in the "patterns" hash, or provided as a class method under
@@ -64,6 +68,12 @@ PATTERNS
 
         Pattern used to skip comments between tokens. Undefined by default.
 
+    *   int
+
+        Pattern used to parse an integer by "token_int". Defaults to
+        "/0x[[:xdigit:]]+|[[:digit:]]+/". If "accept_0o_oct" is given, then
+        this will be expanded to match "/0o[0-7]+/" as well.
+
     *   ident
 
         Pattern used to parse an identifier by "token_ident". Defaults to
@@ -228,6 +238,11 @@ TOKEN PARSING METHODS
     and consumes it. Negative integers, preceeded by "-", are also
     recognised.
 
+  $int = $parser->token_float
+    Expects to find a number expressed in floating-point notation; a
+    sequence of digits possibly prefixed by "-", possibly containing a
+    decimal point.
+
   $str = $parser->token_string
     Expects to find a quoted string, and consumes it. The string should be
     quoted using """ or "'" quote marks.
diff --git a/examples/synopsis.pl b/examples/synopsis.pl
new file mode 100644
index 0000000..4c1cbb4
--- /dev/null
+++ b/examples/synopsis.pl
@@ -0,0 +1,26 @@
+use strict;
+use warnings;
+
+package LispParser;
+use base qw( Parser::MGC );
+
+use constant pattern_ident => qr{[[:alnum:]+*/._:-]+};
+
+sub parse
+{
+   my $self = shift;
+
+   $self->sequence_of( sub {
+      $self->one_of(
+         sub { $self->token_int },
+         sub { $self->token_string },
+         sub { \$self->token_ident },
+         sub { $self->scope_of( "(", \&parse, ")" ) }
+      );
+   } );
+}
+
+my $parser = LispParser->new;
+
+use Data::Dump qw( pp );
+print pp( $parser->from_file( $ARGV[0] ) );
diff --git a/lib/Parser/MGC.pm b/lib/Parser/MGC.pm
index fc4039b..73d442f 100644
--- a/lib/Parser/MGC.pm
+++ b/lib/Parser/MGC.pm
@@ -8,7 +8,7 @@ package Parser::MGC;
 use strict;
 use warnings;
 
-our $VERSION = '0.03';
+our $VERSION = '0.04';
 
 use Carp;
 
@@ -76,6 +76,11 @@ Takes the following named arguments
 Keys in this hash should map to quoted regexp (C<qr//>) references, to
 override the default patterns used to match tokens. See C<PATTERNS> below
 
+=item accept_0o_oct => BOOL
+
+If true, the C<token_int> method will also accept integers with a C<0o> prefix
+as octal.
+
 =back
 
 =cut
@@ -96,6 +101,12 @@ Pattern used to skip whitespace between tokens. Defaults to 
C</[\s\n\t]+/>
 
 Pattern used to skip comments between tokens. Undefined by default.
 
+=item * int
+
+Pattern used to parse an integer by C<token_int>. Defaults to
+C</0x[[:xdigit:]]+|[[:digit:]]+/>. If C<accept_0o_oct> is given, then this
+will be expanded to match C</0o[0-7]+/> as well.
+
 =item * ident
 
 Pattern used to parse an identifier by C<token_ident>. Defaults to
@@ -112,6 +123,7 @@ Pattern used to delimit a string by C<token_string>. 
Defaults to C</["']/>.
 my @patterns = qw(
    ws
    comment
+   int
    ident
    string_delim
 );
@@ -119,6 +131,7 @@ my @patterns = qw(
 use constant {
    pattern_ws      => qr/[\s\n\t]+/,
    pattern_comment => undef,
+   pattern_int     => qr/0x[[:xdigit:]]+|[[:digit:]]+/,
    pattern_ident   => qr/[[:alpha:]_]\w*/,
    pattern_string_delim => qr/["']/,
 };
@@ -137,6 +150,10 @@ sub new
 
    $self->{patterns}{$_} = $args{patterns}{$_} || $self->${\"pattern_$_"} for 
@patterns;
 
+   if( $args{accept_0o_oct} ) {
+      $self->{patterns}{int} = qr/0o[0-7]+|$self->{patterns}{int}/;
+   }
+
    return $self;
 }
 
@@ -542,16 +559,37 @@ sub token_int
 
    $self->fail( "Expected integer" ) if $self->at_eos;
 
-   $self->{str} =~ m/\G(-?)(0x[[:xdigit:]]+|[[:digit:]]+)/gc or
+   $self->{str} =~ m/\G(-?)($self->{patterns}{int})/gc or
       $self->fail( "Expected integer" );
 
    my $sign = $1 ? -1 : 1;
    my $int = $2;
 
+   $int =~ s/^0o/0/;
+
    return $sign * oct $int if $int =~ m/^0/;
    return $sign * $int;
 }
 
+=head2 $int = $parser->token_float
+
+Expects to find a number expressed in floating-point notation; a sequence of
+digits possibly prefixed by C<->, possibly containing a decimal point.
+
+=cut
+
+sub token_float
+{
+   my $self = shift;
+
+   $self->fail( "Expected float" ) if $self->at_eos;
+
+   $self->{str} =~ m/\G(-?(?:\d*\.\d+|\d+\.)(?:e-?\d+)?|-?\d+e-?\d+)/gci or
+      $self->fail( "Expected float" );
+
+   return $1 + 0;
+}
+
 =head2 $str = $parser->token_string
 
 Expects to find a quoted string, and consumes it. The string should be quoted
@@ -572,7 +610,7 @@ sub token_string
 
    my $delim = $1;
 
-   $self->{str} =~ m/\G((?:\\.|[^\\])*)$delim/gc or
+   $self->{str} =~ m/\G((?:\\.|[^\\])*?)$delim/gc or
       pos($self->{str}) = $pos, $self->fail( "Expected contents of string" );
 
    my $string = $1;
@@ -641,9 +679,16 @@ sub STRING
 {
    my $self = shift;
 
+   # Column number only counts characters. There may be tabs in there.
+   # Rather than trying to calculate the visual column number, just print the
+   # indentation as it stands.
+
+   my $indent = substr( $self->{text}, 0, $self->{col} );
+   $indent =~ s/[^ \t]/ /g; # blank out all the non-whitespace
+
    return "$self->{message} on line $self->{linenum} at:\n" . 
           "$self->{text}\n" . 
-          ( " " x $self->{col} . "^" ) . "\n";
+          "$indent^\n";
 }
 
 # Provide fallback operators for cmp, eq, etc...
diff --git a/t/10token_int.t b/t/10token_int.t
index cec027d..943f219 100644
--- a/t/10token_int.t
+++ b/t/10token_int.t
@@ -2,7 +2,7 @@
 
 use strict;
 
-use Test::More tests => 6;
+use Test::More tests => 8;
 
 package TestParser;
 use base qw( Parser::MGC );
@@ -22,7 +22,11 @@ is( $parser->from_string( "123" ), 123, 'Decimal integer' );
 is( $parser->from_string( "0" ),     0, 'Zero' );
 is( $parser->from_string( "0x20" ), 32, 'Hexadecimal integer' );
 is( $parser->from_string( "010" ),   8, 'Octal integer' );
+ok( !eval { $parser->from_string( "0o20" ) }, '0o prefix fails' );
 
 is( $parser->from_string( "-4" ), -4, 'Negative decimal' );
 
 ok( !eval { $parser->from_string( "hello" ) }, '"hello" fails' );
+
+$parser = TestParser->new( accept_0o_oct => 1 );
+is( $parser->from_string( "0o20" ), 16, 'Octal integer with 0o prefix' );
diff --git a/t/11token_float.t b/t/11token_float.t
new file mode 100644
index 0000000..3746f6b
--- /dev/null
+++ b/t/11token_float.t
@@ -0,0 +1,45 @@
+#!/usr/bin/perl -w
+
+use strict;
+
+use Test::More tests => 13;
+
+package TestParser;
+use base qw( Parser::MGC );
+
+sub parse
+{
+   my $self = shift;
+
+   return $self->token_float;
+}
+
+package main;
+
+my $parser = TestParser->new;
+
+# We're going to be testing floating point values.
+sub approx
+{
+   my ( $got, $exp, $name ) = @_;
+
+   ok( abs( $got - $exp ) < 1E-12, $name ) or
+      diag( "Expected approximately $exp, got $got" );
+}
+
+approx( $parser->from_string( "123.0" ), 123,    'Decimal integer' );
+approx( $parser->from_string( "0.0" ),     0,    'Zero' );
+approx( $parser->from_string( "12." ),    12,    'Trailing DP' );
+approx( $parser->from_string( ".34" ),     0.34, 'Leading DP' );
+approx( $parser->from_string( "8.9" ),     8.9,  'Infix DP' );
+
+approx( $parser->from_string( "-4.0" ),   -4,    'Negative decimal' );
+
+approx( $parser->from_string( "1E0" ),     1, 'Scientific without DP' );
+approx( $parser->from_string( "2.0E0" ),   2, 'Scientific with DP' );
+approx( $parser->from_string( "3.E0" ),    3, 'Scientific with trailing DP' );
+approx( $parser->from_string( ".4E1" ),    4, 'Scientific with leading DP' );
+approx( $parser->from_string( "50E-1" ),   5, 'Scientific with negative 
exponent without DP' );
+approx( $parser->from_string( "60.0E-1" ), 6, 'Scientific with DP with 
negative exponent' );
+
+approx( $parser->from_string( "1e0" ), 1, 'Scientific with lowercase e' );
diff --git a/t/11token_string.t b/t/12token_string.t
similarity index 73%
rename from t/11token_string.t
rename to t/12token_string.t
index 8c164c1..f57b560 100644
--- a/t/11token_string.t
+++ b/t/12token_string.t
@@ -2,7 +2,7 @@
 
 use strict;
 
-use Test::More tests => 6;
+use Test::More tests => 7;
 
 package TestParser;
 use base qw( Parser::MGC );
@@ -30,3 +30,13 @@ $parser = TestParser->new(
 
 is( $parser->from_string( q["double"] ), "double", 'Double quoted string still 
passes' );
 ok( !eval { $parser->from_string( q['single'] ) }, 'Single quoted string now 
fails' );
+
+no warnings 'redefine';
+local *TestParser::parse = sub {
+   my $self = shift;
+   return [ $self->token_string, $self->token_string ];
+};
+
+is_deeply( $parser->from_string( q["foo" "bar"] ),
+           [ "foo", "bar" ],
+           'String-matching pattern is non-greedy' );
diff --git a/t/12token_ident.t b/t/13token_ident.t
similarity index 100%
rename from t/12token_ident.t
rename to t/13token_ident.t
diff --git a/t/13token_kw.t b/t/14token_kw.t
similarity index 100%
rename from t/13token_kw.t
rename to t/14token_kw.t

-- 
Alioth's /usr/local/bin/git-commit-notice on 
/srv/git.debian.org/git/pkg-perl/packages/libparser-mgc-perl.git

_______________________________________________
Pkg-perl-cvs-commits mailing list
Pkg-perl-cvs-commits@lists.alioth.debian.org
http://lists.alioth.debian.org/cgi-bin/mailman/listinfo/pkg-perl-cvs-commits

Reply via email to