How do I get detailed tree parser error messages?

Debugging tree grammars can be a bitch. I like to override standard messaging to spew lots of stuff. E.g., i like this kind of thing:

ASTVerifier.g: node from after line 150:17 [grammarSpec, rules, rule, altListAsBlock, altList,
 alternative, elements, element, ebnf, block, altList, alternative]
 no viable alt; token=[@-1,0:0='ALT',<84>,0:-1] (decision=24 state 3) decision=<<>>
 context=...DOWN BLOCK DOWN >>>ALT<<< DOWN DOC_COMMENT...

Here's my code that I put into tree grammar in "@headers" section:

    public String getErrorMessage(RecognitionException e,
                                  String[] tokenNames)
    {
        List stack = getRuleInvocationStack(e, this.getClass().getName());
        String msg = null;
        String inputContext =
            input.LT(-3) == null ? "" : ((Tree)input.LT(-3)).getText()+" "+
            input.LT(-2) == null ? "" : ((Tree)input.LT(-2)).getText()+" "+
            input.LT(-1) == null ? "" : ((Tree)input.LT(-1)).getText()+" >>>"+
            ((Tree)input.LT(1)).getText()+"<<< "+
            ((Tree)input.LT(2)).getText()+" "+
            ((Tree)input.LT(3)).getText();
        if ( e instanceof NoViableAltException ) {
           NoViableAltException nvae = (NoViableAltException)e;
           msg = " no viable alt; token="+e.token+
              " (decision="+nvae.decisionNumber+
              " state "+nvae.stateNumber+")"+
              " decision=<<"+nvae.grammarDecisionDescription+">>";
        }
        else {
           msg = super.getErrorMessage(e, tokenNames);
        }
        return stack+" "+msg+" context=..."+inputContext+"...";
    }
    public String getTokenErrorDisplay(Token t) {
        return t.toString();
    }