revised attribute syntax: C<my $foo :a :b :c>, C<my $foo : a b c>
Gurusamy Sarathy [Wed, 26 Jan 2000 21:45:41 +0000 (21:45 +0000)]
and C<my $foo : a : b : c> are all valid (from Spider Boardman)

p4raw-id: //depot/perl@4907

lib/AutoSplit.pm
lib/SelfLoader.pm
lib/attributes.pm
pod/perldelta.pod
pod/perldiag.pod
pod/perlsub.pod
t/op/attrs.t
toke.c

index 936edc4..41d5489 100644 (file)
@@ -10,7 +10,7 @@ use strict;
 our($VERSION, @ISA, @EXPORT, @EXPORT_OK, $Verbose, $Keep, $Maxlen,
     $CheckForAutoloader, $CheckModTime);
 
-$VERSION = "1.0304";
+$VERSION = "1.0305";
 @ISA = qw(Exporter);
 @EXPORT = qw(&autosplit &autosplit_lib_modules);
 @EXPORT_OK = qw($Verbose $Keep $Maxlen $CheckForAutoloader $CheckModTime);
@@ -149,7 +149,7 @@ my $Is_VMS = ($^O eq 'VMS');
 # allow checking for valid ': attrlist' attachments
 my $nested;
 $nested = qr{ \( (?: (?> [^()]+ ) | (?p{ $nested }) )* \) }x;
-my $one_attr = qr{ (?> (?! \d) \w+ (?:$nested)? ) [\s,]* }x;
+my $one_attr = qr{ (?> (?! \d) \w+ (?:$nested)? ) (?:\s*\:\s*|\s+(?!\:)) }x;
 my $attr_list = qr{ \s* : \s* (?: $one_attr )* }x;
 
 
@@ -468,5 +468,5 @@ package Yet::Another::AutoSplit;
 sub testtesttesttest4_1 ($)  { "another test 4\n"; }
 sub testtesttesttest4_2 ($$) { "another duplicate test 4\n"; }
 package Yet::More::Attributes;
-sub test_a1 ($) : locked { 1; }
+sub test_a1 ($) : locked :locked { 1; }
 sub test_a2 : locked { 1; }
index 4672ac4..2aa2930 100644 (file)
@@ -3,7 +3,7 @@ package SelfLoader;
 require Exporter;
 @ISA = qw(Exporter);
 @EXPORT = qw(AUTOLOAD);
-$VERSION = "1.09";
+$VERSION = "1.0901";
 sub Version {$VERSION}
 $DEBUG = 0;
 
@@ -12,7 +12,7 @@ my %Cache;      # private cache for all SelfLoader's client packages
 # allow checking for valid ': attrlist' attachments
 my $nested;
 $nested = qr{ \( (?: (?> [^()]+ ) | (?p{ $nested }) )* \) }x;
-my $one_attr = qr{ (?> (?! \d) \w+ (?:$nested)? ) [\s,]* }x;
+my $one_attr = qr{ (?> (?! \d) \w+ (?:$nested)? ) (?:\s*\:\s*|\s+(?!\:)) }x;
 my $attr_list = qr{ \s* : \s* (?: $one_attr )* }x;
 
 sub croak { require Carp; goto &Carp::croak }
index 09f3551..bbbb8b7 100644 (file)
@@ -1,6 +1,6 @@
 package attributes;
 
-$VERSION = 0.02;
+$VERSION = 0.03;
 
 @EXPORT_OK = qw(get reftype);
 @EXPORT = ();
@@ -54,7 +54,7 @@ sub import {
                my $s = ((@pkgattrs == 1) ? '' : 's');
                carp "$svtype package attribute$s " .
                    "may clash with future reserved word$s: " .
-                   join(' , ' , @pkgattrs);
+                   join(' : ' , @pkgattrs);
            }
        }
     }
@@ -65,7 +65,7 @@ sub import {
        croak "Invalid $svtype attribute" .
            (( @badattrs == 1 ) ? '' : 's') .
            ": " .
-           join(' , ', @badattrs);
+           join(' : ', @badattrs);
     }
 }
 
@@ -267,7 +267,8 @@ will use that package name.
 =head2 Syntax of Attribute Lists
 
 An attribute list is a sequence of attribute specifications, separated by
-whitespace, commas, or both.  Each attribute specification is a simple
+whitespace or a colon (with optional whitespace).
+Each attribute specification is a simple
 name, optionally followed by a parenthesised parameter list.
 If such a parameter list is present, it is scanned past as for the rules
 for the C<q()> operator.  (See L<perlop/"Quote and Quote-like Operators">.)
@@ -275,8 +276,8 @@ The parameter list is passed as it was found, however, and not as per C<q()>.
 
 Some examples of syntactically valid attribute lists:
 
-    switch(10,foo(7,3)) , ,  expensive
-    Ugly('\(") , Bad
+    switch(10,foo(7,3))  :  expensive
+    Ugly('\(") :Bad
     _5x5
     locked method
 
@@ -286,7 +287,7 @@ Some examples of syntactically invalid attribute lists (with annotation):
     Ugly('(')                  # ()-string not balanced
     5x5                                # "5x5" not a valid identifier
     Y2::north                  # "Y2::north" not a simple identifier
-    foo + bar                  # "+" neither a comma nor whitespace
+    foo + bar                  # "+" neither a colon nor whitespace
 
 =head1 EXPORTS
 
index 495e2ff..f61ee69 100644 (file)
@@ -679,9 +679,9 @@ as requiring an automatic lock() when it is entered, you had to declare
 that with a C<use attrs> pragma in the body of the subroutine.
 That can now be accomplished with a declaration syntax, like this:
 
-    sub mymethod : locked, method ;
+    sub mymethod : locked method ;
     ...
-    sub mymethod : locked, method {
+    sub mymethod : locked :method {
        ...
     }
 
@@ -1914,14 +1914,14 @@ The offending range is now explicitly displayed.
 
 =item Invalid separator character %s in attribute list
 
-(F) Something other than a comma or whitespace was seen between the
+(F) Something other than a colon or whitespace was seen between the
 elements of an attribute list.  If the previous attribute
 had a parenthesised parameter list, perhaps that list was terminated
 too soon.  See L<attributes>.
 
 =item Invalid separator character %s in subroutine attribute list
 
-(F) Something other than a comma or whitespace was seen between the
+(F) Something other than a colon or whitespace was seen between the
 elements of a subroutine attribute list.  If the previous attribute
 had a parenthesised parameter list, perhaps that list was terminated
 too soon.
index f3d7260..b7e115f 100644 (file)
@@ -1745,7 +1745,7 @@ See L<perlfunc/sprintf>.
 
 =item Invalid separator character %s in attribute list
 
-(F) Something other than a comma or whitespace was seen between the
+(F) Something other than a colon or whitespace was seen between the
 elements of an attribute list.  If the previous attribute
 had a parenthesised parameter list, perhaps that list was terminated
 too soon.  See L<attributes>.
index ebb9e55..927e944 100644 (file)
@@ -1230,7 +1230,7 @@ functions to Perl code in L<perlxs>.
 
 A subroutine declaration or definition may have a list of attributes
 associated with it.  If such an attribute list is present, it is
-broken up at space or comma boundaries and treated as though a
+broken up at space or colon boundaries and treated as though a
 C<use attributes> had been seen.  See L<attributes> for details
 about what attributes are currently supported.
 Unlike the limitation with the obsolescent C<use attrs>, the
@@ -1244,8 +1244,8 @@ nest properly.
 
 Examples of valid syntax (even though the attributes are unknown):
 
-    sub fnord (&\%) : switch(10,foo(7,3)) , ,  expensive ;
-    sub plugh () : Ugly('\(") , Bad ;
+    sub fnord (&\%) : switch(10,foo(7,3))  :  expensive ;
+    sub plugh () : Ugly('\(") :Bad ;
     sub xyzzy : _5x5 { ... }
 
 Examples of invalid syntax:
@@ -1254,7 +1254,7 @@ Examples of invalid syntax:
     sub snoid : Ugly('(') ;      # ()-string not balanced
     sub xyzzy : 5x5 ;            # "5x5" not a valid identifier
     sub plugh : Y2::north ;      # "Y2::north" not a simple identifier
-    sub snurt : foo + bar ;      # "+" not a comma or space
+    sub snurt : foo + bar ;      # "+" not a colon or space
 
 The attribute list is passed as a list of constant strings to the code
 which associates them with the subroutine.  In particular, the second example
index e89c2cb..615e4d3 100644 (file)
@@ -63,12 +63,12 @@ mytest;
 BEGIN {++$ntests}
 
 my $anon1;
-eval '$anon1 = sub ($) : locked,,method { $_[0]++ }';
+eval '$anon1 = sub ($) : locked:method { $_[0]++ }';
 mytest;
 BEGIN {++$ntests}
 
 my $anon2;
-eval '$anon2 = sub : locked , method { $_[0]++ }';
+eval '$anon2 = sub : locked : method { $_[0]++ }';
 mytest;
 BEGIN {++$ntests}
 
diff --git a/toke.c b/toke.c
index f2f8fa5..e7e2174 100644 (file)
--- a/toke.c
+++ b/toke.c
@@ -2797,8 +2797,10 @@ Perl_yylex(pTHX)
                                                newSVpvn(s, len)));
                }
                s = skipspace(d);
-               while (*s == ',')
+               if (*s == ':' && s[1] != ':')
                    s = skipspace(s+1);
+               else if (s == d)
+                   break;      /* require real whitespace or :'s */
            }
            tmp = (PL_expect == XOPERATOR ? '=' : '{'); /*'}(' for vi */
            if (*s != ';' && *s != tmp && (tmp != '=' || *s != ')')) {