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);
}
// ...
}