Changeset 21437 for perl5

Show
Ignore:
Timestamp:
07/22/08 16:49:57 (4 months ago)
Author:
fglock
Message:

[PCR] fixed character-class name rule

Location:
perl5/Pugs-Compiler-Rule
Files:
5 modified

Legend:

Unmodified
Added
Removed
  • perl5/Pugs-Compiler-Rule/Changes

    r21435 r21437  
    11- added unicode property 'isLr' 
     2- fixed character-class name rule 
    23 
    340.32  2008-07-21 
  • perl5/Pugs-Compiler-Rule/examples/Grammar.grammar

    r18715 r21437  
    129129 
    130130token char_class { 
    131     |  <.alpha>+ 
     131    |  <.alpha> [ <.alpha> | _ ] * 
    132132    |  \[  <.char_range>  \] 
    133133} 
  • perl5/Pugs-Compiler-Rule/lib/Pugs/Emitter/Rule/Perl5/CharClass.pm

    r21436 r21437  
    55use Data::Dumper; 
    66 
    7 use vars qw( %char_class ); 
     7use vars qw( %char_class %extra_unicode ); 
    88BEGIN { 
    99    %char_class = map { $_ => 1 } qw( 
     
    1212        print punct space upper 
    1313        word  xdigit 
     14    ); 
     15    # XXX this list is broken!!! 
     16    %extra_unicode = ( 
     17        'isLr'       => '(?:\p{isLl}|\p{isLu}|\p{isLt})', 
     18        'isBidiL'    => '(?:\p{isLatin})', 
     19        'isBidiR'    => '(?:\p{isHebrew}|\p{isArabic})', 
     20        'isBidiEN'   => '(?:\p{isHebrew}|\p{isArabic})', 
     21        'isBidiES'   => '(?:\p{isHebrew}|\p{isArabic})', 
     22        'isBidiET'   => '(?:\p{isHebrew}|\p{isArabic})', 
     23        'isBidiWS'   => '(?:\p{isHebrew}|\p{isArabic})', 
     24        'isID_Start' => '(?:\p{isHebrew}|\p{isArabic})', 
    1425    ); 
    1526} 
     
    8192           my $name = $1; 
    8293           $cmd = ( exists $char_class{$name} ) 
    83                 ? "[[:$name:]]" 
    84                 : "\\p{$name}"; 
     94                    ? "[[:$name:]]" 
     95                    : exists $extra_unicode{$name} 
     96                        ? $extra_unicode{$name}  
     97                        : "\\p{$name}"; 
    8598        } 
    8699 
  • perl5/Pugs-Compiler-Rule/lib/Pugs/Grammar/Base.pm

    r21435 r21437  
    169169        # is it a Unicode property? "isL" 
    170170        { 
    171           local $@; 
    172           my $p5 = '\p{' . $meth . '}'; 
    173              $p5 = '(?:\p{isLl}|\p{isLu}|\p{isLt})' if $meth eq 'isLr'; 
    174           eval ' my $s="a"; $s =~ /$p5/ '; 
    175           unless ( $@ ) { 
    176             *{$meth} = Pugs::Compiler::RegexPerl5->compile($p5)->code; 
    177             return $meth->( @_ ); 
    178           } 
     171            local $@; 
     172            my $p5; 
     173            if ( exists $Pugs::Emitter::Rule::Perl5::CharClass::extra_unicode{$meth} ) { 
     174                $p5 = $Pugs::Emitter::Rule::Perl5::CharClass::extra_unicode{$meth}; 
     175            } 
     176            else { 
     177                $p5 = '\p{' . $meth . '}'; 
     178                eval ' my $s="a"; $s =~ /' . $p5 . '/ '; 
     179            } 
     180            unless ( $@ ) { 
     181                *{$meth} = Pugs::Compiler::RegexPerl5->compile($p5)->code; 
     182                return $meth->( @_ ); 
     183            } 
    179184        } 
    180185         
  • perl5/Pugs-Compiler-Rule/lib/Pugs/Grammar/Rule.pmc

    r18715 r21437  
    11# !!! DO NOT EDIT !!! 
    22# This file was generated by Pugs::Compiler::Rule's compile_p6grammar.pl 
    3 # script from examples/Grammar.grammar at Tue Oct 30 11:29:45 2007 
     3# script from examples/Grammar.grammar at Tue Jul 22 16:47:05 2008 
    44 
    55use strict; 
     
    6868           ## pos: 632 675 
    6969           ( 
    70                ( $pad{I1170} = $pos or 1 ) 
     70               ( $pad{I1686} = $pos or 1 ) 
    7171               && ( 
    7272               ## <concat> 
     
    7676                 ## <group> 
    7777                 ## pos: 633 639 
    78                   (   ( $pad{I1171} = $pos or 1 ) && 
     78                  (   ( $pad{I1687} = $pos or 1 ) && 
    7979                   ## <perl5> 
    8080                   ( ( substr( $s, $pos ) =~ m/^((?:\n\r?|\r\n?))/ ) 
     
    8383                   ) 
    8484                   ## </perl5> 
    85      ||    ( ( $pos = $pad{I1171} ) && 0 ) ) 
     85     ||    ( ( $pos = $pad{I1687} ) && 0 ) ) 
    8686                 ## </group> 
    8787     
     
    120120                 ## <group> 
    121121                 ## pos: 642 644 
    122                   (   ( $pad{I1172} = $pos or 1 ) && 
     122                  (   ( $pad{I1688} = $pos or 1 ) && 
    123123     
    124124                   ## <constant> 
     
    129129                   ) 
    130130                   ## </constant> 
    131      ||    ( ( $pos = $pad{I1172} ) && 0 ) ) 
     131     ||    ( ( $pos = $pad{I1688} ) && 0 ) ) 
    132132                 ## </group> 
    133133     
     
    136136                 ## pos: 644 652 
    137137                 do { while ( 
    138                   (   ( $pad{I1173} = $pos or 1 ) && 
     138                  (   ( $pad{I1689} = $pos or 1 ) && 
    139139                     ## <perl5> 
    140140                     ( ( substr( $s, $pos ) =~ m/^((?!\n\r?|\r\n?).)/ ) 
     
    143143                     ) 
    144144                     ## </perl5> 
    145      ||    ( ( $pos = $pad{I1173} ) && 0 ) )) {}; $bool = 1 } 
     145     ||    ( ( $pos = $pad{I1689} ) && 0 ) )) {}; $bool = 1 } 
    146146                 ## </quant> 
    147147     
     
    151151               ) 
    152152             || ( 
    153                ( ( $bool = 1 ) && ( $pos = $pad{I1170} ) or 1 ) 
     153               ( ( $bool = 1 ) && ( $pos = $pad{I1686} ) or 1 ) 
    154154               &&            ## <concat> 
    155155               ## pos: 653 675 
     
    158158                 ## <group> 
    159159                 ## pos: 653 658 
    160                   (   ( $pad{I1174} = $pos or 1 ) && 
     160                  (   ( $pad{I1690} = $pos or 1 ) && 
    161161     
    162162                   ## <dot> 
     
    164164                   ( substr( $s, $pos++, 1 ) ne '' ) 
    165165                   ## </dot> 
    166      ||    ( ( $pos = $pad{I1174} ) && 0 ) ) 
     166     ||    ( ( $pos = $pad{I1690} ) && 0 ) ) 
    167167                 ## </group> 
    168168     
     
    171171                 ## pos: 658 662 
    172172                 do { while ( 
    173                   (   ( $pad{I1175} = $pos or 1 ) && 
     173                  (   ( $pad{I1691} = $pos or 1 ) && 
    174174                     ## <perl5> 
    175175                     ( ( substr( $s, $pos ) =~ m/^((?!\n\r?|\r\n?).)/ ) 
     
    178178                     ) 
    179179                     ## </perl5> 
    180      ||    ( ( $pos = $pad{I1175} ) && 0 ) )) {}; $bool = 1 } 
     180     ||    ( ( $pos = $pad{I1691} ) && 0 ) )) {}; $bool = 1 } 
    181181                 ## </quant> 
    182182     
     
    185185                 ## <group> 
    186186                 ## pos: 662 675 
    187                   (   ( $pad{I1176} = $pos or 1 ) && 
     187                  (   ( $pad{I1692} = $pos or 1 ) && 
    188188                   ## <metasyntax> 
    189189                   ## pos: 662 674 
     
    198198                   } 
    199199                   ## </metasyntax> 
    200      ||    ( ( $pos = $pad{I1176} ) && 0 ) ) 
     200     ||    ( ( $pos = $pad{I1692} ) && 0 ) ) 
    201201                 ## </group> 
    202202     
     
    265265           ## pos: 700 743 
    266266           ( 
    267                ( $pad{I1177} = $pos or 1 ) 
     267               ( $pad{I1693} = $pos or 1 ) 
    268268               && ( 
    269269               ## <concat> 
     
    273273                 ## <group> 
    274274                 ## pos: 701 707 
    275                   (   ( $pad{I1178} = $pos or 1 ) && 
     275                  (   ( $pad{I1694} = $pos or 1 ) && 
    276276                   ## <perl5> 
    277277                   ( ( substr( $s, $pos ) =~ m/^((?:\n\r?|\r\n?))/ ) 
     
    280280                   ) 
    281281                   ## </perl5> 
    282      ||    ( ( $pos = $pad{I1178} ) && 0 ) ) 
     282     ||    ( ( $pos = $pad{I1694} ) && 0 ) ) 
    283283                 ## </group> 
    284284     
     
    317317                 ## <group> 
    318318                 ## pos: 710 712 
    319                   (   ( $pad{I1179} = $pos or 1 ) && 
     319                  (   ( $pad{I1695} = $pos or 1 ) && 
    320320     
    321321                   ## <constant> 
     
    326326                   ) 
    327327                   ## </constant> 
    328      ||    ( ( $pos = $pad{I1179} ) && 0 ) ) 
     328     ||    ( ( $pos = $pad{I1695} ) && 0 ) ) 
    329329                 ## </group> 
    330330     
     
    333333                 ## pos: 712 720 
    334334                 do { while ( 
    335                   (   ( $pad{I1180} = $pos or 1 ) && 
     335                  (   ( $pad{I1696} = $pos or 1 ) && 
    336336                     ## <perl5> 
    337337                     ( ( substr( $s, $pos ) =~ m/^((?!\n\r?|\r\n?).)/ ) 
     
    340340                     ) 
    341341                     ## </perl5> 
    342      ||    ( ( $pos = $pad{I1180} ) && 0 ) )) {}; $bool = 1 } 
     342     ||    ( ( $pos = $pad{I1696} ) && 0 ) )) {}; $bool = 1 } 
    343343                 ## </quant> 
    344344     
     
    348348               ) 
    349349             || ( 
    350                ( ( $bool = 1 ) && ( $pos = $pad{I1177} ) or 1 ) 
     350               ( ( $bool = 1 ) && ( $pos = $pad{I1693} ) or 1 ) 
    351351               &&            ## <concat> 
    352352               ## pos: 721 743 
     
    355355                 ## <group> 
    356356                 ## pos: 721 726 
    357                   (   ( $pad{I1181} = $pos or 1 ) && 
     357                  (   ( $pad{I1697} = $pos or 1 ) && 
    358358     
    359359                   ## <dot> 
     
    361361                   ( substr( $s, $pos++, 1 ) ne '' ) 
    362362                   ## </dot> 
    363      ||    ( ( $pos = $pad{I1181} ) && 0 ) ) 
     363     ||    ( ( $pos = $pad{I1697} ) && 0 ) ) 
    364364                 ## </group> 
    365365     
     
    368368                 ## pos: 726 730 
    369369                 do { while ( 
    370                   (   ( $pad{I1182} = $pos or 1 ) && 
     370                  (   ( $pad{I1698} = $pos or 1 ) && 
    371371                     ## <perl5> 
    372372                     ( ( substr( $s, $pos ) =~ m/^((?!\n\r?|\r\n?).)/ ) 
     
    375375                     ) 
    376376                     ## </perl5> 
    377      ||    ( ( $pos = $pad{I1182} ) && 0 ) )) {}; $bool = 1 } 
     377     ||    ( ( $pos = $pad{I1698} ) && 0 ) )) {}; $bool = 1 } 
    378378                 ## </quant> 
    379379     
     
    382382                 ## <group> 
    383383                 ## pos: 730 743 
    384                   (   ( $pad{I1183} = $pos or 1 ) && 
     384                  (   ( $pad{I1699} = $pos or 1 ) && 
    385385                   ## <metasyntax> 
    386386                   ## pos: 730 742 
     
    395395                   } 
    396396                   ## </metasyntax> 
    397      ||    ( ( $pos = $pad{I1183} ) && 0 ) ) 
     397     ||    ( ( $pos = $pad{I1699} ) && 0 ) ) 
    398398                 ## </group> 
    399399     
     
    462462           ## pos: 761 1059 
    463463           ( 
    464             (   ( $pad{I1184} = $pos or 1 ) && 
     464            (   ( $pad{I1700} = $pos or 1 ) && 
    465465               ## <alt> 
    466466               ## pos: 762 1056 
    467467               ( 
    468                    ( $pad{I1185} = $pos or 1 ) 
     468                   ( $pad{I1701} = $pos or 1 ) 
    469469                   && ( 
    470470                   ## <concat> 
     
    474474                     ## <group> 
    475475                     ## pos: 768 775 
    476                       (   ( $pad{I1186} = $pos or 1 ) && 
     476                      (   ( $pad{I1702} = $pos or 1 ) && 
    477477     
    478478                       ## <constant> 
     
    483483                       ) 
    484484                       ## </constant> 
    485      ||    ( ( $pos = $pad{I1186} ) && 0 ) ) 
     485     ||    ( ( $pos = $pad{I1702} ) && 0 ) ) 
    486486                     ## </group> 
    487487     
     
    490490                     ## pos: 775 783 
    491491                     do { while ( 
    492                       (   ( $pad{I1187} = $pos or 1 ) && 
     492                      (   ( $pad{I1703} = $pos or 1 ) && 
    493493                         ## <perl5> 
    494494                         ( ( substr( $s, $pos ) =~ m/^((?!\n\r?|\r\n?).)/ ) 
     
    497497                         ) 
    498498                         ## </perl5> 
    499      ||    ( ( $pos = $pad{I1187} ) && 0 ) )) {}; $bool = 1 } 
     499     ||    ( ( $pos = $pad{I1703} ) && 0 ) )) {}; $bool = 1 } 
    500500                     ## </quant> 
    501501     
     
    505505                   ) 
    506506                 || ( 
    507                    ( ( $bool = 1 ) && ( $pos = $pad{I1185} ) or 1 ) 
     507                   ( ( $bool = 1 ) && ( $pos = $pad{I1701} ) or 1 ) 
    508508                   &&                ## <concat> 
    509509                   ## pos: 784 1044 
     
    512512                     ## <group> 
    513513                     ## pos: 784 791 
    514                       (   ( $pad{I1188} = $pos or 1 ) && 
     514                      (   ( $pad{I1704} = $pos or 1 ) && 
    515515                       ## <perl5> 
    516516                       ( ( substr( $s, $pos ) =~ m/^((?:\n\r?|\r\n?))/ ) 
     
    519519                       ) 
    520520                       ## </perl5> 
    521      ||    ( ( $pos = $pad{I1188} ) && 0 ) ) 
     521     ||    ( ( $pos = $pad{I1704} ) && 0 ) ) 
    522522                     ## </group> 
    523523     
     
    526526                     ## pos: 791 1044 
    527527                     ( 
    528                       (   ( $pad{I1189} = $pos or 1 ) && 
     528                      (   ( $pad{I1705} = $pos or 1 ) && 
    529529                         ## <concat> 
    530530                         ## pos: 792 1037 
     
    533533                           ## <group> 
    534534                           ## pos: 792 795 
    535                             (   ( $pad{I1190} = $pos or 1 ) && 
     535                            (   ( $pad{I1706} = $pos or 1 ) && 
    536536     
    537537                             ## <constant> 
     
    542542                             ) 
    543543                             ## </constant> 
    544      ||    ( ( $pos = $pad{I1190} ) && 0 ) ) 
     544     ||    ( ( $pos = $pad{I1706} ) && 0 ) ) 
    545545                           ## </group> 
    546546     
     
    549549                           ## pos: 795 1037 
    550550                           ( 
    551                             (   ( $pad{I1191} = $pos or 1 ) && 
     551                            (   ( $pad{I1707} = $pos or 1 ) && 
    552552                               ## <alt> 
    553553                               ## pos: 796 1022 
    554554                               ( 
    555                                    ( $pad{I1192} = $pos or 1 ) 
     555                                   ( $pad{I1708} = $pos or 1 ) 
    556556                                   && ( 
    557557                                   ## <concat> 
     
    561561                                     ## <group> 
    562562                                     ## pos: 810 813 
    563                                       (   ( $pad{I1193} = $pos or 1 ) && 
     563                                      (   ( $pad{I1709} = $pos or 1 ) && 
    564564     
    565565                                       ## <constant> 
     
    570570                                       ) 
    571571                                       ## </constant> 
    572      ||    ( ( $pos = $pad{I1193} ) && 0 ) ) 
     572     ||    ( ( $pos = $pad{I1709} ) && 0 ) ) 
    573573                                     ## </group> 
    574574     
     
    607607                                     ## <group> 
    608608                                     ## pos: 816 818 
    609                                       (   ( $pad{I1194} = $pos or 1 ) && 
     609                                      (   ( $pad{I1710} = $pos or 1 ) && 
    610610     
    611611                                       ## <constant> 
     
    616616                                       ) 
    617617                                       ## </constant> 
    618      ||    ( ( $pos = $pad{I1194} ) && 0 ) ) 
     618     ||    ( ( $pos = $pad{I1710} ) && 0 ) ) 
    619619                                     ## </group> 
    620620     
     
    623623                                     ## <group> 
    624624                                     ## pos: 818 824 
    625                                       (   ( $pad{I1195} = $pos or 1 ) && 
     625                                      (   ( $pad{I1711} = $pos or 1 ) && 
    626626                                       ## <metasyntax> 
    627627                                       ## pos: 818 823 
     
    636636                                       } 
    637637                                       ## </metasyntax> 
    638      ||    ( ( $pos = $pad{I1195} ) && 0 ) ) 
     638     ||    ( ( $pos = $pad{I1711} ) && 0 ) ) 
    639639                                     ## </group> 
    640640     
     
    663663                                     ## <group> 
    664664                                     ## pos: 826 828 
    665                                       (   ( $pad{I1196} = $pos or 1 ) && 
     665                                      (   ( $pad{I1712} = $pos or 1 ) && 
    666666     
    667667                                       ## <constant> 
     
    672672                                       ) 
    673673                                       ## </constant> 
    674      ||    ( ( $pos = $pad{I1196} ) && 0 ) ) 
     674     ||    ( ( $pos = $pad{I1712} ) && 0 ) ) 
    675675                                     ## </group> 
    676676     
     
    679679                                     ## pos: 828 832 
    680680                                     do { while ( 
    681                                       (   ( $pad{I1197} = $pos or 1 ) && 
     681                                      (   ( $pad{I1713} = $pos or 1 ) && 
    682682                                         ## <perl5> 
    683683                                         ( ( substr( $s, $pos ) =~ m/^((?!\n\r?|\r\n?).)/ ) 
     
    686686                                         ) 
    687687                                         ## </perl5> 
    688      ||    ( ( $pos = $pad{I1197} ) && 0 ) )) {}; $bool = 1 } 
     688     ||    ( ( $pos = $pad{I1713} ) && 0 ) )) {}; $bool = 1 } 
    689689                                     ## </quant> 
    690690     
     
    693693                                     ## pos: 832 847 
    694694                                     do { while ( 
    695                                       (   ( $pad{I1198} = $pos or 1 ) && 
     695                                      (   ( $pad{I1714} = $pos or 1 ) && 
    696696     
    697697                                         ## <dot> 
     
    699699                                         ( substr( $s, $pos++, 1 ) ne '' ) 
    700700                                         ## </dot> 
    701      ||    ( ( $pos = $pad{I1198} ) && 0 ) )) {}; $bool = 1 } 
     701     ||    ( ( $pos = $pad{I1714} ) && 0 ) )) {}; $bool = 1 } 
    702702                                     ## </quant> 
    703703     
     
    707707                                   ) 
    708708                                 || ( 
    709                                    ( ( $bool = 1 ) && ( $pos = $pad{I1192} ) or 1 ) 
     709                                   ( ( $bool = 1 ) && ( $p