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