package qlProject.grammar; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; import qlProject.ast.Questionnaire; import qlProject.ast.expression.IExpression; import qlProject.ast.expression.Id; import qlProject.ast.expression.ParenthesisExpr; import qlProject.ast.expression.StringExpr.ConcatenationExpr; import qlProject.ast.expression.StringExpr.StringLiteral; import qlProject.ast.expression.arithmeticExpr.AdditionExpr; import qlProject.ast.expression.arithmeticExpr.DivisionExpr; import qlProject.ast.expression.arithmeticExpr.IntLiteral; import qlProject.ast.expression.arithmeticExpr.MultiplicationExpr; import qlProject.ast.expression.arithmeticExpr.NegationExpr; import qlProject.ast.expression.arithmeticExpr.SubtractionExpr; import qlProject.ast.expression.booleanExpr.BoolLiteral; import qlProject.ast.expression.booleanExpr.comparisonExpression.BiggerEqExpr; import qlProject.ast.expression.booleanExpr.comparisonExpression.BiggerThanExpr; import qlProject.ast.expression.booleanExpr.comparisonExpression.EqualExpr; import qlProject.ast.expression.booleanExpr.comparisonExpression.SmallerEqExpr; import qlProject.ast.expression.booleanExpr.comparisonExpression.SmallerThanExpr; import qlProject.ast.expression.booleanExpr.comparisonExpression.UnequalExpr; import qlProject.ast.expression.booleanExpr.logicalExpression.AndExpr; import qlProject.ast.expression.booleanExpr.logicalExpression.NotExpr; import qlProject.ast.expression.booleanExpr.logicalExpression.OrExpr; import qlProject.ast.statement.IStatement; import qlProject.ast.statement.IfStatement; import qlProject.ast.statement.assignment.Assignment; import qlProject.ast.statement.assignment.ComputedAssignment; import qlProject.ast.statement.assignment.DirectAssignment; import qlProject.ast.type.BooleanType; import qlProject.ast.type.IntType; import qlProject.ast.type.StringType; import qlProject.ast.type.Type; public class ParserToASTVisitor extends qlGrammarBaseVisitor<Object>{ private final Map<String, Object> map = new HashMap<String, Object>(); @Override public Object visitForm(qlGrammarParser.FormContext ctx) { List<IStatement> statementsList = new ArrayList<IStatement>(); for (qlGrammarParser.StatementContext statementContext: ctx.statement()) { statementsList.add((IStatement)statementContext.accept(this)); } return new Questionnaire(statementsList); } @Override public Object visitConditionalQuestionsList(qlGrammarParser.ConditionalQuestionsListContext ctx) { List<IStatement> isTrueList = new ArrayList<IStatement>(); List<IStatement> isFalseList = new ArrayList<IStatement>(); for (qlGrammarParser.StatementContext statementContext: ctx.ifPart){ isTrueList.add((IStatement)statementContext.accept(this)); } for (qlGrammarParser.StatementContext statementContext: ctx.elsePart){ isFalseList.add((Assignment)statementContext.accept(this)); } return new IfStatement((IExpression) ctx.expr().accept(this), isTrueList, isFalseList);} @Override public Object visitIntLiteral(qlGrammarParser.IntLiteralContext ctx) { return new IntLiteral(Integer.parseInt(ctx.INT().getText())); } @Override public Object visitStringLiteral(qlGrammarParser.StringLiteralContext ctx){ return new StringLiteral(ctx.STRING().getText().substring(1, ctx.STRING().getText().length()-1)); } @Override public Object visitBoolLiteral(qlGrammarParser.BoolLiteralContext ctx) { if (ctx.bLiteral.getType() == qlGrammarParser.TRUE) return new BoolLiteral(true); return new BoolLiteral(false); } @Override public Object visitIntType(qlGrammarParser.IntTypeContext ctx) { return new IntType();} @Override public Object visitParens(qlGrammarParser.ParensContext ctx) { return new ParenthesisExpr((IExpression)ctx.expr().accept(this)); } @Override public Object visitAnd (qlGrammarParser.AndContext ctx) { return new AndExpr((IExpression)ctx.expr(0).accept(this), (IExpression)ctx.expr(1).accept(this)); } @Override public Object visitOr (qlGrammarParser.OrContext ctx) { return new OrExpr((IExpression)ctx.expr(0).accept(this), (IExpression)ctx.expr(1).accept(this)); } @Override public Object visitNot (qlGrammarParser.NotContext ctx) { return new NotExpr((IExpression)ctx.expr().accept(this)); } @Override public Object visitGreaterThan(qlGrammarParser.GreaterThanContext ctx) { return new BiggerThanExpr((IExpression)ctx.expr(0).accept(this), (IExpression)ctx.expr(1).accept(this)); } @Override public Object visitGreaterOrEq(qlGrammarParser.GreaterOrEqContext ctx) { return new BiggerEqExpr((IExpression)ctx.expr(0).accept(this), (IExpression)ctx.expr(1).accept(this)); } @Override public Object visitUnequal(qlGrammarParser.UnequalContext ctx) { return new UnequalExpr((IExpression)ctx.expr(0).accept(this), (IExpression)ctx.expr(1).accept(this)); } @Override public Object visitEqual(qlGrammarParser.EqualContext ctx) { return new EqualExpr((IExpression)ctx.expr(0).accept(this), (IExpression)ctx.expr(1).accept(this)); } @Override public Object visitLessThan(qlGrammarParser.LessThanContext ctx) { return new SmallerThanExpr((IExpression)ctx.expr(0).accept(this), (IExpression)ctx.expr(1).accept(this)); } @Override public Object visitLessOrEq(qlGrammarParser.LessOrEqContext ctx) { return new SmallerEqExpr((IExpression)ctx.expr(0).accept(this), (IExpression)ctx.expr(1).accept(this)); } @Override public Object visitId(qlGrammarParser.IdContext ctx) { return new Id(ctx.ID().getText()); } @Override public Object visitBoolType(qlGrammarParser.BoolTypeContext ctx) { return new BooleanType();} @Override public Object visitStrType(qlGrammarParser.StrTypeContext ctx) { return new StringType();} @Override public Object visitBasicQuestion(qlGrammarParser.BasicQuestionContext ctx) { map.put(ctx.ID().getText(), (Type) ctx.type().accept(this)); return new DirectAssignment(ctx.ID().getText(), ctx.STRING().getText().substring(1, ctx.STRING().getText().length()-1) ,(Type) ctx.type().accept(this)); } @Override public Object visitComputedQuestion(qlGrammarParser.ComputedQuestionContext ctx) { map.put(ctx.ID().getText(), (Type) ctx.type().accept(this)); return new ComputedAssignment(ctx.ID().getText(), ctx.STRING().getText().substring(1, ctx.STRING().getText().length()-1), (Type) ctx.type().accept(this), (IExpression) ctx.expr().accept(this)); } @Override public Object visitNegate(qlGrammarParser.NegateContext ctx) { return new NegationExpr((IExpression)ctx.expr().accept(this)); } @Override public Object visitAddSubtract(qlGrammarParser.AddSubtractContext ctx) { if (ctx.op.getType() == qlGrammarParser.ADD){ return new AdditionExpr((IExpression)ctx.expr(0).accept(this), (IExpression)ctx.expr(1).accept(this)); } return new SubtractionExpr((IExpression)ctx.expr(0).accept(this), (IExpression)ctx.expr(1).accept(this)); } @Override public Object visitMultiplyDivide(qlGrammarParser.MultiplyDivideContext ctx) { if (ctx.op.getType() == qlGrammarParser.MUL){ return new MultiplicationExpr((IExpression)ctx.expr(0).accept(this), (IExpression)ctx.expr(1).accept(this)); } return new DivisionExpr((IExpression)ctx.expr(0).accept(this), (IExpression)ctx.expr(1).accept(this)); } @Override public Object visitConcatenationExpression(qlGrammarParser.ConcatenationExpressionContext ctx) { return new ConcatenationExpr((IExpression)ctx.expr(0).accept(this), (IExpression)ctx.expr(1).accept(this)); } }