package uva.TaxForm.AST.Visitors; import org.antlr.v4.runtime.misc.NotNull; import uva.TaxForm.AST.Node; import uva.TaxForm.AST.NodeForm; import uva.TaxForm.AST.NodeCondition.NodeConditionIf; import uva.TaxForm.AST.NodeExp.Expression; import uva.TaxForm.AST.NodeExp.Operations.OpAssign; import uva.TaxForm.AST.NodeQuestion.Question; import uva.TaxForm.AST.NodeVar.Var; import uva.TaxForm.AST.Utils.UtilsNode; import uva.TaxForm.Utils.StringUtils; import uva.TaxForm.antlr4.TaxFormBaseVisitor; import uva.TaxForm.antlr4.TaxFormParser; import uva.TaxForm.antlr4.TaxFormParser.AddExpressionContext; import uva.TaxForm.antlr4.TaxFormParser.AllMightyContext; import uva.TaxForm.antlr4.TaxFormParser.AndExpressionContext; import uva.TaxForm.antlr4.TaxFormParser.ComputedContext; import uva.TaxForm.antlr4.TaxFormParser.DivideExpressionContext; import uva.TaxForm.antlr4.TaxFormParser.EqualExpressionContext; import uva.TaxForm.antlr4.TaxFormParser.LowerEqualExpressionContext; import uva.TaxForm.antlr4.TaxFormParser.LowerExpressionContext; import uva.TaxForm.antlr4.TaxFormParser.MinusExpressionContext; import uva.TaxForm.antlr4.TaxFormParser.MultiplyExpressionContext; import uva.TaxForm.antlr4.TaxFormParser.NotEqualExpressionContext; import uva.TaxForm.antlr4.TaxFormParser.NotExpressionContext; import uva.TaxForm.antlr4.TaxFormParser.OrExpressionContext; import uva.TaxForm.antlr4.TaxFormParser.SingleExpressionContext; import uva.TaxForm.antlr4.TaxFormParser.UpperEqualExpressionContext; import uva.TaxForm.antlr4.TaxFormParser.UpperExpressionContext; import uva.TaxForm.antlr4.TaxFormParser.VarTypeContext; public class CommonTaxFormVisitor extends TaxFormBaseVisitor<Object> { private NodeForm form = new NodeForm(); /*public NodeForm getAST( TaxFormParser.FormContext ctx ) { return this.visitForm( ctx ); }*/ //Set the name of the form and continue visit... with VisitForm.visit(this, FormContext, NodeForm); public NodeForm visitForm( @NotNull TaxFormParser.FormContext ctx ) { this.form.setName(ctx.varName().getText()); System.out.println( StringUtils.repeat("\t", form.getLevel()) + form.getName() ); VisitorForm.visit(this, ctx, this.form); return this.form; } //Visit Question, check if result is computed and define the type(Boolean/Money/Integer/String) of the question public void visitQuestion( @NotNull TaxFormParser.QuestionContext ctx, Node node ) { VarTypeContext varCTX = null; if (ctx.varType() != null) { varCTX = ctx.varType(); } else if (ctx.computed().varType() != null) { varCTX = ctx.computed().varType(); } //Set NodeQuestionType if (varCTX != null) { //Check for computed question Boolean computed = varCTX.getParent().getClass().equals(uva.TaxForm.antlr4.TaxFormParser.ComputedContext.class); Question<?> question = null; //Boolean if (varCTX.BOOLEAN() != null) { question = new Question<Boolean>(); } //Money else if (varCTX.MONEY() != null) { question = new Question<Float>(); } //Integer else if (varCTX.INT() != null) { question = new Question<Integer>(); } //String else if (varCTX.STRING() != null){ question = new Question<String>(); } question = UtilsNode.setQuestionValues(ctx, node); System.out.println( StringUtils.repeat("\t", question.getLevel()) + question.getVar().getName() + " " + question.getVar().toString() ); if (computed) this.visitComputed((ComputedContext) varCTX.getParent(), question, form); } } //Visit Computed question, define the expression used e.g. money = (sellingPrice - privateDebt) public <T> void visitComputed( @NotNull TaxFormParser.ComputedContext ctx, Question<?> question, NodeForm form ) { Expression<? extends Expression<String>> exp = new Expression<>(); question.setExpression(exp); exp.setLevel(question.getLevel() + 1); exp.add(question.getVar()); OpAssign assign = new OpAssign(); exp.add(assign); assign.setOperator("="); for (int i=0; i<ctx.allMighty().size(); i++) { CommonTaxFormVisitor.visitAllMighty((AllMightyContext) ctx.allMighty().get(i), question, form); } /* System.out.println( StringUtils.repeat("\t", question.getLevel()) + question.getVar().getName() + " " + question.getExpression().getNodes().toString());*/ for (Node n : question.getExpression().getNodes()) { System.out.println( StringUtils.repeat("\t", n.getLevel()) + n.toString()); } } //AllMighty is recursively checking the expression(s) public static void visitAllMighty( @NotNull TaxFormParser.AllMightyContext ctx, Question<?> question, NodeForm form ) { Class<?> expClass = ctx.expression().getClass(); //Single if (expClass.equals(uva.TaxForm.antlr4.TaxFormParser.SingleExpressionContext.class)) visitSingleExpression((SingleExpressionContext) ctx.expression(), question, form); /* Arithmetic */ //Minus if (expClass.equals(uva.TaxForm.antlr4.TaxFormParser.MinusExpressionContext.class)) VisitorArithmetic.visitMinus((MinusExpressionContext) ctx.expression(), question, form); //Add if (expClass.equals(uva.TaxForm.antlr4.TaxFormParser.AddExpressionContext.class)) VisitorArithmetic.visitAdd((AddExpressionContext) ctx.expression(), question, form); //Multiply if (expClass.equals(uva.TaxForm.antlr4.TaxFormParser.MultiplyExpressionContext.class)) VisitorArithmetic.visitMultiply((MultiplyExpressionContext) ctx.expression(), question, form); //Divide if (expClass.equals(uva.TaxForm.antlr4.TaxFormParser.DivideExpressionContext.class)) VisitorArithmetic.visitDivide((DivideExpressionContext) ctx.expression(), question, form); /* Boolean */ //And if (expClass.equals(uva.TaxForm.antlr4.TaxFormParser.AndExpressionContext.class)) VisitorBoolean.visitAnd((AndExpressionContext) ctx.expression(), question, form); //Or if (expClass.equals(uva.TaxForm.antlr4.TaxFormParser.OrExpressionContext.class)) VisitorBoolean.visitOr((OrExpressionContext) ctx.expression(), question, form); //Not if (expClass.equals(uva.TaxForm.antlr4.TaxFormParser.NotExpressionContext.class)) VisitorBoolean.visitNot((NotExpressionContext) ctx.expression(), question, form); /* Comparison */ //Lower if (expClass.equals(uva.TaxForm.antlr4.TaxFormParser.LowerExpressionContext.class)) VisitorComparison.visitLower((LowerExpressionContext) ctx.expression(), question, form); //Upper if (expClass.equals(uva.TaxForm.antlr4.TaxFormParser.UpperExpressionContext.class)) VisitorComparison.visitUpper((UpperExpressionContext) ctx.expression(), question, form); //LowerEqual if (expClass.equals(uva.TaxForm.antlr4.TaxFormParser.LowerEqualExpressionContext.class)) VisitorComparison.visitLowerEqual((LowerEqualExpressionContext) ctx.expression(), question, form); //UpperEqual if (expClass.equals(uva.TaxForm.antlr4.TaxFormParser.UpperEqualExpressionContext.class)) VisitorComparison.visitUpperEqual((UpperEqualExpressionContext) ctx.expression(), question, form); //Equal if (expClass.equals(uva.TaxForm.antlr4.TaxFormParser.EqualExpressionContext.class)) VisitorComparison.visitEqual((EqualExpressionContext) ctx.expression(), question, form); //NotEqual if (expClass.equals(uva.TaxForm.antlr4.TaxFormParser.NotEqualExpressionContext.class)) VisitorComparison.visitNotEqual((NotEqualExpressionContext) ctx.expression(), question, form); } public static void visitSingleExpression( @NotNull TaxFormParser.SingleExpressionContext ctx, Question<?> question, NodeForm form ) { Expression<?> exp = question.getExpression(); Var<?> var = new Var<>(); var = UtilsNode.getVarInTree(ctx.getText(), form); exp.add(var); //System.out.println("expVar: " + var.getName()); } public Integer visitIfCondition( @NotNull TaxFormParser.IfConditionContext ctx, Node node ) { NodeConditionIf condition = new NodeConditionIf(); condition.setLevel(node.getLevel() + 1); node.add(condition); VisitorCondition.ifVisit(this, ctx, condition); return ctx.getRuleIndex(); } public Integer visitLabel( @NotNull TaxFormParser.LabelContext ctx ) { System.out.println(ctx.getParent().invokingState + " - " + ctx.invokingState + " - " + ctx.getText()); return ctx.getRuleIndex(); } public Integer visitVarName( @NotNull TaxFormParser.VarNameContext ctx ) { System.out.println(ctx.getParent().invokingState + " - " + ctx.invokingState + " - " + ctx.getText()); return ctx.getRuleIndex(); } public Integer visitVarType( @NotNull TaxFormParser.VarTypeContext ctx ) { System.out.println(ctx.getParent().invokingState + " - " + ctx.invokingState + " - " + ctx.getText()); return ctx.getRuleIndex(); } }