[antlr-interest] Recommend a Document for TreeAdaptors?
    Mark Wright 
    markwright at internode.on.net
       
    Sat Jan 26 02:47:26 PST 2008
    
    
  
On Thu, 24 Jan 2008 14:57:10 -0600
"Dejas Ninethousand" <dejas9000 at gmail.com> wrote:
> I have my first parse tree (default) horray!  Of course now I want to
> build parse trees
Hello Dejas,
I guess you mean Abstract Syntax Trees.
> using classes of my own design instead of relying
> on the default ITree implementation.  Poking around a bit I get the
> notion that this is done by providing a custom TreeAdaptor
> implementation; however, I am having trouble finding clear and
> expressive documentation on antlr.org related to custom tree
> construction.  Could anyone recommend a url that is more instructive
> on this topic?  Thanks.
> 
> -- Dejas
I guess I should ask which target are you using.
With the Java target an alternative approach is to ask
ANTLR to build tokens of your own class:
options {
        output=AST;
        TokenLabelType=MyToken;
        ASTLabelType=CommonTree;
}
// ...
@lexer::members {
    // ANTLR 3.0.1
    // public Token emit() {
    //     MyToken t = new MyToken(input, type, channel, tokenStartCharIndex, getCharIndex()-1);
    //     t.setLine(tokenStartLine);
    //     t.setText(text);
    //     t.setCharPositionInLine(tokenStartCharPositionInLine);
    //     emit(t);
    //     return t;
    // }
    // ANTLR 3.1 beta
    public Token emit() {
        Token t = new MyToken(input, state.type, state.channel, state.tokenStartCharIndex, getCharIndex()-1);
        t.setLine(state.tokenStartLine);
        t.setText(state.text);
        t.setCharPositionInLine(state.tokenStartCharPositionInLine);
        emit(t);
        return t;
    }
}
Then you can add your own field that can contain a pointer to
a class in your symbol table heirarchy:
public class MyToken extends CommonToken {
  protected Symbol symbol;
  public MyToken(CharStream input, int type, int channel, int start, int stop) {
    super(input, type, channel, start, stop);
    symbol = (Symbol)null;
  }
  public MyToken(int type, String text) {
    super(type, text);
    symbol = (Symbol)null;
  }
  public final Symbol getSymbol() {
    return symbol;
  }
  public void setSymbol(Symbol value) {
    symbol = value;
  }
}
With the C target Jim explained in an email a while ago
that there is a void* field already in the token struct
for this purpose.
Thanks, Mark
-- 
    
    
More information about the antlr-interest
mailing list