次のような非常に単純な式の文法定義は、ANTLR で既に作成しています(a + b) * c。
grammar SimpleCalc;
options {
    language=CSharp2;
    output=AST;
}
tokens {
    PLUS  = '+' ;
    MINUS = '-' ;
    MULT = '*' ;
    DIV = '/' ;
}
/*------------------------------------------------------------------
 * LEXER RULES
 *------------------------------------------------------------------*/
ID  : ('a'..'z' | 'A' .. 'Z' | '0' .. '9')+ ;
WHITESPACE : ( '\t' | ' ' | '\r' | '\n'| '\u000C' )+    { Skip(); } ;
/*------------------------------------------------------------------
 * PARSER RULES
 *------------------------------------------------------------------*/
expr : multExpr ((PLUS | MINUS)^ multExpr)*;
multExpr : atom ((MULT | DIV)^ atom )*;
atom : ID
     | '(' expr ')' -> expr;
これで、ツリー構造を作成するための定義済みのタイプがいくつかあります。
public class Expr { }
public class SimpleExpr : Expr
{
    public SimpleExpr(string name) { ... }
}
public enum BinaryExprType
{
    Plus,
    Minus,
    Multiply,
    Divide
}
public class BinaryExpr : Expr
{
    public BinaryExpr(Expr left, BinaryExprType op, Expr right) { ... }
}
CommonTreeをツリーに変換するコードを記述できることはわかっていますがExpr、次のようなカスタム型に直接書き直したいと思います。
atom returns [Expr e]
    : ID { $e = new SimpleExpr($ID.text); }
    | '(' expr ')' { $e = $expr.e; };
expr returns [Expr e]
    : /* ??? */;
multExpr returns [Expr e]
    : /* ??? */;
しかし、適切なを使用exprしmultExprて作成するにはどうすればよいですか?BinaryExprBinaryExprType