I have a trivial antlr grammar for expressions like a.b.c + d.e.f:
grammar Test;
options {
    output=AST;
}
tokens {
    VARIABLE_ID;
    QUALIFIER_ID;
}
ID  : ('a'..'z'|'A'..'Z'|'_') ('a'..'z'|'A'..'Z'|'0'..'9'|'_')*;
DOT : '.';
WS : ( ' ' | '\t' | '\r' | '\n' ) {$channel=HIDDEN;} ;
variable_id  : id=ID   -> VARIABLE_ID[$id];
qualifier_id  : id=ID   -> QUALIFIER_ID[$id];
expr_start : expr EOF;
expr : var (options {greedy=true;} : '+' expr)*;
var : variable_id (DOT qualifier_id)*;
Now I want to define a pattern matcher over this grammar that turns a.b.c into 0.1.2, so I define a Tree Pattern Matcher as follows
tree grammar TestWalker;
options {
    tokenVocab=Test;
    ASTLabelType=CommonTree;
    filter=true;
    backtrack=true;
}
@members {
    TokenRewriteStream tokens;
    public void setTreeNodeStream(TreeNodeStream input) {
        super.setTreeNodeStream(input);
        tokens = (TokenRewriteStream)input.getTokenStream(); 
    }
}
topdown : var;
variable_id [int i] : id=VARIABLE_ID {
    tokens.replace($id.getToken(), "" + $i);
};
qualifier_id [int i] : id=QUALIFIER_ID {
    tokens.replace($id.getToken(), "" + $i);
};
var 
@init { int index = 0; }
: variable_id[index] 
(   DOT 
    { ++index; }
    qualifier_id[index]
)*;
Then I put together a small test program:
import org.antlr.runtime.*;
import org.antlr.runtime.tree.*;
public class Main {
    public static void main(String[] args) throws Exception {
        TestLexer lex = new TestLexer(new ANTLRInputStream(System.in));
        TokenStream tokens = new TokenRewriteStream(lex);
        TestParser parser = new TestParser(tokens);
        TestParser.expr_return expr = parser.expr();
        CommonTreeNodeStream nodes = new CommonTreeNodeStream((Tree)expr.getTree());
        nodes.setTokenStream(tokens);
        TestWalker walker = new TestWalker(nodes);
        walker.downup(expr.getTree());
        System.out.println(tokens.toString());
    }
}
When I run this program with basic input, I see surprising results:
a.b.c -> 0.b.c
a.b + d.e -> 0.b + 0.e
and so on.  It appears that the (DOT qualifier_id)* portion of my rule never matches and I cannot figure out why.  I have tried adding my rules to the topdown and the bottomup portions of the Tree Pattern Match.  If I switch from a filter matcher to a whole tree matcher and add rules to branch for the '+' case appropriately it works, but when the rewrite is just a smaller fragment of a much larger grammar this becomes untenable.  Any pointers would be greatly appreciated.
Update: Using antlr 3.3
 