¿Cómo hago un TreeParser en ANTLR3?

Estoy intentando aprender el lenguaje analizando por diversión ...

He creado una gramática ANTLR que creo que coincidirá con un lenguaje simple que espero implementar. Tendrá la siguiente sintaxis:

<FunctionName> ( <OptionalArguments>+) {
     <OptionalChildFunctions>+
 }

Ejemplo actual:

ForEach(in:[1,2,3,4,5] as:"nextNumber") {
   Print(message:{nextNumber})
}

Creo que tengo la gramática funcionando correctamente para coincidir con esta construcción, y ahora estoy intentando construir un árbol de sintaxis abstracta para el idioma.

En primer lugar, debo admitir que no estoy exactamente seguro de CÓMO debe verse este árbol. En segundo lugar, no sé cómo hacerlo en mi gramática de Antlr ... Lo he intentado sin mucho éxito durante horas.

Esta es la idea actual con la que voy para el árbol:

                   FunctionName
                  /          \
           Attributes         \
               / \          /  \ 
            ID    /\    ChildFunctions
           / \   ID etc
          /   \
  Attribute  AttributeValue
        Type

Este es mi archivo de gramática actual de Antlr:

grammar Test;

options {output=AST;ASTLabelType=CommonTree;}

program : function ;
function : ID (OPEN_BRACKET (attribute (COMMA? attribute)*)? CLOSE_BRACKET)? (OPEN_BRACE function* CLOSE_BRACE)?;

attribute : ID COLON datatype;

datatype : NUMBER | STRING | BOOLEAN | array | lookup ;
array  :  OPEN_BOX (datatype (COMMA datatype)* )? CLOSE_BOX ;
lookup  : OPEN_BRACE (ID (PERIOD ID)*) CLOSE_BRACE;

NUMBER
 : ('+' | '-')? (INTEGER | FLOAT)
 ;

STRING
    :  '"' ( ESC_SEQ | ~('\\'|'"') )* '"'
    ;

BOOLEAN
 : 'true' | 'TRUE' | 'false' | 'FALSE'
 ;

ID  : (LETTER|'_') (LETTER | INTEGER |'_')*
    ;

COMMENT
    :   '//' ~('\n'|'\r')* '\r'? '\n' {$channel=HIDDEN;}
    |   '/*' ( options {greedy=false;} : . )* '*/' {$channel=HIDDEN;}
    ;

WHITESPACE : (' ' | '\t' | '\r' | '\n') {$channel=HIDDEN;} ;

COLON : ':' ;
COMMA : ',' ;
PERIOD  :  '.' ;

OPEN_BRACKET : '(' ;
CLOSE_BRACKET : ')' ;

OPEN_BRACE : '{' ; 
CLOSE_BRACE : '}' ;

OPEN_BOX : '[' ;
CLOSE_BOX : ']' ;

fragment
LETTER
 : 'a'..'z' | 'A'..'Z' 
 ;

fragment
INTEGER
 : '0'..'9'+
 ;

fragment
FLOAT
 : INTEGER+ '.' INTEGER*
 ;

fragment
ESC_SEQ
    :   '\\' ('b'|'t'|'n'|'f'|'r'|'\"'|'\''|'\\')
    ;

CUALQUIER ayuda / consejo sería genial. He intentado leer docenas de tutoriales y nada de la generación AST parece mantenerse :(

Respuestas a la pregunta(1)

Su respuesta a la pregunta