AktkAst võimaliku lahenduse struktuur
Mugavad import'id
import week7.AktkParser.*; import week7.ast.*;
Lahenduse struktuur
Järgnev koodijupp näitab, kuidas saab avaldiste ja lausete AST-i loomiseks kasutada eraldi visitor klasse, millel on erinevad tagastustüübid. Nii saab vältida seda, et avaldiste AST-i loomisel peab igal pool AstNode-sid Expression-iteks cast-ima.
 Muidugi pead visitVariable, VariableContext, Identifier, visitExpression ja ExpressionContext asemel kasutama neid nimesid, mis sinu kirjutatud grammatikas vastavatel konstruktsioonidel on.
private static AstNode parseTreeToAst(ParseTree tree) {
    AktkAstStatementVisitor statementVisitor = new AktkAstStatementVisitor();
    return statementVisitor.visit(tree);
}
private static class AktkAstExpressionVisitor extends AktkBaseVisitor<Expression> {
    @Override
    public Expression visitVariable(VariableContext ctx) {
        return new Variable(ctx.Identifier().getText());
    }
    // ...
}
private static class AktkAstStatementVisitor extends AktkBaseVisitor<Statement> {
    private final AktkAstExpressionVisitor expressionVisitor = new AktkAstExpressionVisitor();
    @Override
    public Statement visitExpression(ExpressionContext ctx) {
        // Kui lause koosneb avaldisest, siis selleks, et temast saaks ikkagi lause,
        // tuleb ta avaldise visitoriga töödelda ja pakendada ExpressionStatement'i sisse
        Expression expression = expressionVisitor.visit(ctx);
        return new ExpressionStatement(expression);
    }
    // ...
}