To solve Dave's particular problem, you don't need any new features. Just:

    rule indentation {
        ^^ $<token>:=(\h*)
          { state @indents = 0;
            my $new_indent = expand_tabs($<token>).chars;
            let @indents = @indents;
            pop @indents while @indents && $new_indent <= @indents[-1];
            push @indents, $new_indent;
            $/<nesting> = [EMAIL PROTECTED];
          }
    }

where every line has an <indentation> and the subsequent $<indentation><nesting> value tells you how deep it is.

Alternatively, you could define separate rules for the three cases:

    {
        state @indents = 0;

        rule indent {
            ^^ $<token>:=(\h*)
            { $<new_indent> = expand_tabs($<token>).chars }
            <( $<new_indent> > @indents[-1] )>
            { let @indents = (@indents, $<new_indent>) }
        }

        rule outdent {
            ^^ $<token>:=(\h*)
            { $<new_indent> = expand_tabs($<token>).chars }
            <( $<new_indent> < @indents[-1] )>
            { pop @indents while @indents && $<new_indent> < @indents[-1];
              let @indents = (@indents, $<new_indent>);
            }
        }

        rule samedent {
            ^^ $<token>:=(\h*)
            { $<new_indent> = expand_tabs($<token>).chars }
            <( $<new_indent> == @indents[-1] )>
        }
    }


Damian

Reply via email to