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