Changeset 22534

Show
Ignore:
Timestamp:
10/08/08 18:38:14 (6 weeks ago)
Author:
lwall
Message:

[STD] improve error messages based on dba

Location:
src/perl6
Files:
3 modified

Legend:

Unmodified
Added
Removed
  • src/perl6/Cursor.pmc

    r22498 r22534  
    254254        my %lexer; 
    255255        $lexer{NAME} = $name; 
     256        $lexer{DBA} = $retree->{$key}{dba} // $name; 
    256257        $lexer{FILE} = "$dir/$file"; 
    257258        $lexer{PATS} = \@pat; 
     
    265266        $AUTOLEXED{$key} = $fakepos; 
    266267        my $ast = $retree->{$key}; 
    267         if ($ast) { 
     268        if ($ast and ref $ast ne 'HASH') { 
    268269            @pat = $ast->longest($self->cursor_peek()); 
    269270        } 
     
    306307        $AUTOLEXED{$key} = $oldfakepos; 
    307308 
    308         $lexer = { "NAME" => $name, "FILE" => "$dir/$file", "PATS" => [@pat] }; 
     309        $lexer = { "NAME" => $name, "FILE" => "$dir/$file", "PATS" => [@pat], "DBA" => $retree->{$key}{dba} // $name}; 
    309310 
    310311        if (not -d $dir) { 
     
    428429        $self->_AUTOLEXpeek($key,$retree); 
    429430    }; 
    430     $self->highwater($lexer->{NAME}) if $self->{_pos} >= $::HIGHWATER; 
     431    $self->highwater($lexer->{DBA}) if $self->{_pos} >= $::HIGHWATER; 
    431432    my $buf = $self->{_orig}; 
    432433    my $P = $self->{_pos}; 
  • src/perl6/STD.pm

    r22532 r22534  
    453453    :my $startpos = self.pos; 
    454454 
    455     :dba<simple whitespace> 
     455    :dba('whitespace') 
    456456    [ 
    457457        | \h+ <![#\s\\]> { $¢.<_>[$¢.pos]<ws> = $startpos; }    # common case 
     
    461461    ] 
    462462    || 
    463     :dba<complicated whitespace> 
    464463    [ 
    465464    | <.unsp> 
     
    478477token unsp { 
    479478    \\ <?before [\s|'#'] > 
     479    :dba('unspace') 
    480480    [ 
    481481    | <.vws>                     {*}                             #= vwhite 
     
    486486 
    487487token vws { 
     488    :dba('vertical whitespace') 
    488489    \v 
    489490    { $COMPILING::LINE++ } # XXX wrong several ways, use self.lineof($¢.pos) 
     
    499500 
    500501token unv { 
     502   :dba('horizontal whitespace') 
     503   [ 
    501504   | \h+                 {*}                                    #= hwhite 
    502505   | <?before '='> ^^ <.pod_comment>  {*}                    #= pod 
     
    507510         | {} \N*            {*}                                 #= end 
    508511         ] 
     512    ] 
    509513} 
    510514 
     
    573577 
    574578token pblock { 
     579    :dba('parameterized block') 
    575580    [ <lambda> <signature> ]? <block> 
    576581} 
     
    595600    | <.unv>? $$ <.ws> 
    596601        { $¢.<_>[$¢.pos]<endstmt> = 2; } {*}                    #= endstmt complex 
    597     | { $¢.<_>[$¢.pos]<endargs> = 1; } <.ws> {*}                #= endargs 
     602    | <.unsp>? { $¢.<_>[$¢.pos]<endargs> = 1; } {*}             #= endargs 
    598603    ] 
    599604} 
     
    621626    | <.unv>? $$ <.ws> 
    622627        { $¢.<_>[$¢.pos]<endstmt> = 2; } {*}                    #= endstmt complex 
    623     | { $¢.<_>[$¢.pos]<endargs> = 1; } <.ws>  {*}               #= endargs 
     628    | <.unsp>? { $¢.<_>[$¢.pos]<endargs> = 1; }   {*}           #= endargs 
    624629    ] 
    625630} 
     
    628633rule statementlist { 
    629634    :my $PARSER is context<rw> = self; 
     635    :dba('statement list') 
    630636    [ 
    631637    | $ 
     
    637643# embedded semis, context-dependent semantics 
    638644rule semilist { 
     645    :dba('semicolon list') 
    639646    [ 
    640647    | <?before <[\)\]\}]> > 
     
    669676    | <statement_control>                        {*}            #= control 
    670677    | <EXPR> {*}                                                #= expr 
    671         :dba<statement end> 
     678        :dba('statement end') 
    672679        [ 
    673680        || <?{ ($¢.<_>[$¢.pos]<endstmt> // 0) == 2 }>   # no mod after end-line curly 
    674681        || 
    675             :dba<statement modifier> 
     682            :dba('statement modifier') 
    676683            [ 
    677684            | <statement_mod_loop> {*}                              #= mod loop 
    678685            | <statement_mod_cond> {*}                              #= mod cond 
    679                 :dba<statement modifier loop> 
     686                :dba('statement modifier loop') 
    680687                [ 
    681688                || <?{ ($¢.<_>[$¢.pos]<endstmt> // 0) == 2 }> 
     
    848855 
    849856token pre { 
     857    :dba('prefix or meta-prefix') 
    850858    [ 
    851859    | <prefix> 
     
    869877 
    870878token nulltermish { 
     879    :dba('null term') 
    871880    [ 
    872881    | <?stdstopper> 
     
    876885 
    877886token termish { 
     887    :dba('prefix or noun') 
    878888    [ 
    879889    | <pre>+ <noun> 
     
    882892 
    883893    # also queue up any postfixes, since adverbs could change things 
     894    :dba('postfix') 
    884895    [ <?stdstopper> || 
    885896        <post>* 
     
    930941 
    931942    ':' 
     943    :dba('colon pair') 
    932944    [ 
    933945    | '!' <identifier> 
     
    941953        ] 
    942954        {*}                                                     #= value 
    943     | :dba<signature> '(' ~ ')' <signature> 
     955    | :dba('signature') '(' ~ ')' <signature> 
    944956    | <postcircumfix> 
    945957        { $key = ""; $value = $<postcircumfix>; } 
     
    957969 
    958970    ':' 
     971    :dba('colon pair (restricted)') 
    959972    [ 
    960973    | '!' <identifier> 
     
    978991    <!stdstopper> 
    979992    <!infixstopper> 
     993    :dba('infix or meta-infix') 
    980994    [ 
    981995    | <infix> 
     
    10101024 
    10111025token dottyop { 
     1026    :dba('dotty method or postfix') 
    10121027    [ 
    10131028    | <methodop> 
     
    10291044    [ ['.' <.unsp>?]? <postfix_prefix_meta_operator> <.unsp>? ]* 
    10301045 
     1046    :dba('postfix') 
    10311047    [ 
    10321048    | <dotty>  { $<O> = $<dotty><O> } 
     
    11141130 
    11151131token postcircumfix:sym<( )> ( --> Methodcall) 
    1116     { :dba<argument list> '(' ~ ')' <semilist> } 
     1132    { :dba('argument list') '(' ~ ')' <semilist> } 
    11171133 
    11181134token postcircumfix:sym<[ ]> ( --> Methodcall) 
    1119     { :dba<subscript> '[' ~ ']' <semilist> } 
     1135    { :dba('subscript') '[' ~ ']' <semilist> } 
    11201136 
    11211137token postcircumfix:sym<{ }> ( --> Methodcall) 
    1122     { :dba<subscript> '{' ~ '}' <semilist> } 
     1138    { :dba('subscript') '{' ~ '}' <semilist> } 
    11231139 
    11241140token postcircumfix:sym«< >» ( --> Methodcall) 
     
    11441160    ] <.unsp>?  
    11451161 
     1162    :dba('method arguments') 
    11461163    [ 
    11471164    | '.'? <.unsp>? '(' ~ ')' <semilist> 
     
    11521169token arglist { 
    11531170    :my StrPos $endargs is context<rw> = 0; 
     1171    :my $GOAL is context = 'endargs'; 
    11541172    <.ws> 
     1173    :dba('argument list') 
    11551174    [ 
    11561175    | <?stdstopper> 
     
    11721191        [ 
    11731192        | '(' ~ ')' <signature> 
    1174         | :dba<shape definition> '[' ~ ']' <semilist> 
    1175         | :dba<shape definition> '{' ~ '}' <semilist> 
     1193        | :dba('shape definition') '[' ~ ']' <semilist> 
     1194        | :dba('shape definition') '{' ~ '}' <semilist> 
    11761195        | <?before '<'> <postcircumfix> 
    11771196        ]* 
     
    11831202    <post_constraint>* 
    11841203 
     1204    # XXX generalize to any assignment operator? 
     1205    :dba('variable initializer') 
    11851206    [ 
    11861207    | '=' <.ws> <EXPR( ($<sigil> // '') eq '$' ?? item %item_assignment !! item %list_prefix )> 
     
    11901211 
    11911212rule scoped { 
     1213    :dba('scoped declarator') 
    11921214    [ 
    11931215    | <declarator> 
     
    16301652 
    16311653token deflongname { 
     1654    :dba('name to be defined') 
    16321655    <name> 
    16331656    # XXX too soon 
     
    16531676        [ 
    16541677        | <identifier> 
    1655         | :dba<indirect name> '(' ~ ')' <EXPR> 
     1678        | :dba('indirect name') '(' ~ ')' <EXPR> 
    16561679        ] 
    16571680    ]? 
     
    17491772# careful to distinguish from both integer and 42.method 
    17501773token dec_number { 
     1774    :dba('decimal number') 
    17511775    [ 
    17521776    | $<coeff> = [           '.' \d+[_\d+]* ] <escale>? 
     
    17591783    ':' $<radix> = [\d+] <.unsp>?      # XXX optional dot here? 
    17601784    {}           # don't recurse in lexer 
     1785    :dba('number in radix notation') 
    17611786    [ 
    17621787    || '<' 
     
    24842509    | '!'?<longname> [ <multisig> | <trait> ]* 
    24852510    | <sigil> '.' 
     2511        :dba('subscript signature') 
    24862512        [ 
    24872513        | '(' ~ ')' <signature> 
     
    27772803 
    27782804token circumfix:sigil ( --> Term) 
    2779     { :dba<contextualizer> <sigil> '(' ~ ')' <semilist> } 
     2805    { :dba('contextualizer') <sigil> '(' ~ ')' <semilist> } 
    27802806 
    27812807#token circumfix:typecast ( --> Term) 
     
    27832809 
    27842810token circumfix:sym<( )> ( --> Term) 
    2785     { :dba<parenthesized expression> '(' ~ ')' <semilist> } 
     2811    { :dba('parenthesized expression') '(' ~ ')' <semilist> } 
    27862812 
    27872813token circumfix:sym<[ ]> ( --> Term) 
    2788     { :dba<array composer> '[' ~ ']' <semilist> } 
     2814    { :dba('array composer') '[' ~ ']' <semilist> } 
    27892815 
    27902816## methodcall 
     
    32103236    :my $listopish = 0; 
    32113237    [ 
    3212     | :dba<argument list> '.(' ~ ')' <semilist> {*}             #= func args 
    3213     | :dba<argument list> '(' ~ ')' <semilist> {*}              #= func args 
    3214     | :dba<argument list> <.unsp> '.'? '(' ~ ')' <semilist> {*} #= func args 
     3238    | :dba('argument list') '.(' ~ ')' <semilist> {*}             #= func args 
     3239    | :dba('argument list') '(' ~ ')' <semilist> {*}              #= func args 
     3240    | :dba('argument list') <.unsp> '.'? '(' ~ ')' <semilist> {*} #= func args 
    32153241    | {} [<?before \s> <!{ $istype }> <.ws> <!infixstopper> <arglist> { $listopish = 1 }]? 
    32163242    ] 
    32173243 
     3244    :dba('extra arglist after (...):') 
    32183245    [ 
    32193246    || <?{ $listopish }> 
     
    32343261        # parametric type? 
    32353262        <.unsp>? [ <?before '['> <postcircumfix> ]? 
     3263        :dba('type parameter') 
    32363264        [ 
    32373265            '::' 
     
    33273355 
    33283356regex infixstopper { 
     3357    :dba('infix stopper') 
     3358    [ 
    33293359    | <?before <stopper> > 
    33303360    | <?before '!!' > <?{ $+GOAL eq '!!' }> 
    33313361    | <?before '{' | <lambda> > <?{ $+GOAL eq '{' and $¢.<_>[$¢.pos]<ws> }> 
     3362    | <?{ $+GOAL eq 'endargs' and $¢.<_>[$¢.pos]<endargs> }> 
     3363    ] 
    33323364} 
    33333365 
     
    33383370regex stdstopper { 
    33393371    :my @stub = return self if self.<_>[self.pos].:exists<endstmt>; 
     3372    :dba('standard stopper') 
    33403373    [ 
    33413374    | <?terminator> 
     
    36323665    token rxinfix:sym<|> ( --> Junctive_or ) { <sym> } 
    36333666    token rxinfix:sym<&> ( --> Junctive_and ) { <sym> } 
     3667    token rxinfix:sym<~> ( --> Additive ) { <sym> } 
    36343668 
    36353669    token quantified_atom { 
     
    36453679 
    36463680    token atom { 
     3681        :dba('regex atom') 
    36473682        [ 
    36483683        | \w 
     
    37533788        $<binding> = ( <.ws> '=' <.ws> <quantified_atom> )? 
    37543789        { $<sym> = $<variable>.item; } 
    3755     } 
    3756  
    3757     token metachar:sym<~> { 
    3758         <sym> 
    37593790    } 
    37603791 
     
    38503881    token cclass_elem { 
    38513882        <.ws> 
     3883        :dba('character class element') 
    38523884        [ 
    38533885        | <name> 
     
    38573889    } 
    38583890 
    3859     token mod_arg { :dba<modifier argument> '(' ~ ')' <semilist> } 
     3891    token mod_arg { :dba('modifier argument') '(' ~ ')' <semilist> } 
    38603892 
    38613893    token mod_internal:sym<:my>    { ':' <?before 'my' \s > [:lang($¢.cursor_fresh($+LANG)) <statement> <eat_terminator> ] } 
  • src/perl6/gimme5

    r22532 r22534  
    457457                $args =~ s/\s+$//; 
    458458            } 
    459             warn "ARGSTUFF: ", $argstuff if $argstuff =~ /\S/; 
     459            warn "ARGSTUFF in $NAME: ", $argstuff if $argstuff =~ /\S/; 
    460460            my $p = ""; 
    461461 
     
    10471047    return $kids[0] if @kids == 1; 
    10481048 
    1049     return bless { zyg => [@kids], min => $min, altname => $ALTNAME, name => $name }, 
     1049    return bless { zyg => [@kids], min => $min, altname => $ALTNAME, name => $name, %adverbs }, 
    10501050              "RE_any"; 
    10511051} 
     
    12571257                $code = "my \$newlang = $code;  \$C = \$C->cursor_fresh(\$newlang); "; 
    12581258                return bless { text => $code, min => 0, max => 0, noquant => 1, %adverbs }, "RE_decl"; 
     1259            } 
     1260            elsif ($adverb eq 'dba') { 
     1261                $adverbs{$adverb} = eval $code; 
    12591262            } 
    12601263        }