package astvisitor;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import main.TaZQLBaseVisitor;
import main.TaZQLParser;
import org.antlr.v4.runtime.misc.NotNull;
import ast.AST;
import ast.expression.Binary;
import ast.expression.Brackets;
import ast.expression.Expression;
import ast.expression.arithmetic.Addition;
import ast.expression.arithmetic.Division;
import ast.expression.arithmetic.Multiplication;
import ast.expression.arithmetic.Substraction;
import ast.expression.comparison.Equal;
import ast.expression.comparison.GreaterEqual;
import ast.expression.comparison.GreaterThan;
import ast.expression.comparison.LessEqual;
import ast.expression.comparison.LessThan;
import ast.expression.comparison.NotEqual;
import ast.expression.logical.And;
import ast.expression.logical.Or;
import ast.expression.variables.BooleanVariable;
import ast.expression.variables.Id;
import ast.expression.variables.IntegerVariable;
import ast.expression.variables.StringVariable;
import ast.form.Form;
import ast.question.ComputationQuestion;
import ast.question.IfElseStatement;
import ast.question.IfStatement;
import ast.question.Question;
import ast.question.SimpleQuestion;
import ast.type.ChoiceType;
import ast.type.IntegerType;
import ast.type.TextType;
import ast.type.Type;
import ast.unary.Minus;
import ast.unary.Not;
import ast.unary.Plus;
import ast.unary.Unary;
public class MyBaseVisitor extends TaZQLBaseVisitor<AST> {
public MyBaseVisitor() {}
@Override
public Form visitForm(@NotNull TaZQLParser.FormContext ctx) {
ArrayList<Question> questions = new ArrayList<Question>();
for ( TaZQLParser.QuestionContext q : ctx.question() ) {
questions.add((Question) q.accept(this));
}
return new Form(ctx.ID().getText(), questions);
}
// QUESTION
@Override
public SimpleQuestion visitSimpleQuestion(@NotNull TaZQLParser.SimpleQuestionContext ctx) {
Type type = (Type) ctx.type().accept(this);
Id id = new Id(ctx.ID().getText(), type);
this.putIdType(id.getID(), type);
return new SimpleQuestion(
id,
ctx.TEXT().getText().replaceAll("^\"|\"$", ""),
(Type) ctx.type().accept(this)
);
}
@Override
public ComputationQuestion visitComputationQuestion(@NotNull TaZQLParser.ComputationQuestionContext ctx) {
Type type = (Type) ctx.type().accept(this);
Id id = new Id(ctx.ID().getText(), type);
this.putIdType(id.getID(), type);
return new ComputationQuestion(
id,
ctx.TEXT().getText().replaceAll("^\"|\"$", ""),
(Type) ctx.type().accept(this),
(Expression) ctx.expression().accept(this)
);
}
@Override
public IfStatement visitIfStatement(@NotNull TaZQLParser.IfStatementContext ctx) {
List<Question> questions = new ArrayList<Question>();
for ( TaZQLParser.QuestionContext q : ctx.question() ) {
questions.add((Question) q.accept(this));
}
return new IfStatement((Expression) ctx.expression().accept(this), questions);
}
@Override
public IfElseStatement visitIfelseStatement(@NotNull TaZQLParser.IfelseStatementContext ctx) {
List<Question> ifQuestions = new ArrayList<Question>();
for ( TaZQLParser.QuestionContext q : ctx.thenBranch ) {
ifQuestions.add((Question) q.accept(this));
}
List<Question> elseQuestions = new ArrayList<Question>();
for ( TaZQLParser.QuestionContext q : ctx.elseBranch ) {
elseQuestions.add((Question) q.accept(this));
}
return new IfElseStatement(
(Expression) ctx.cond.accept(this),
ifQuestions, elseQuestions);
}
// EXPRESSIONS
@Override
public Brackets visitBracketsExpression(@NotNull TaZQLParser.BracketsExpressionContext ctx) {
return new Brackets((Expression) ctx.expression().accept(this));
}
@Override
public Binary visitAddSubExpression(@NotNull TaZQLParser.AddSubExpressionContext ctx) {
if (ctx.op.getText().equals("+")) {
return new Addition(
(Expression) ctx.expression(0).accept(this),
(Expression) ctx.expression(1).accept(this));
}
if (ctx.op.getText().equals("-")) {
return new Substraction(
(Expression) ctx.expression(0).accept(this),
(Expression) ctx.expression(1).accept(this));
}
return null;
}
@Override
public Binary visitMultDivExpression(@NotNull TaZQLParser.MultDivExpressionContext ctx) {
if (ctx.op.getText().equals("*")) {
return new Multiplication(
(Expression) ctx.expression(0).accept(this),
(Expression) ctx.expression(1).accept(this));
}
if (ctx.op.getText().equals("/")) {
return new Division(
(Expression) ctx.expression(0).accept(this),
(Expression) ctx.expression(1).accept(this));
}
return null;
}
@Override
public Binary visitComparissionExpression(@NotNull TaZQLParser.ComparissionExpressionContext ctx) {
if (ctx.op.getText().equals(">=")) {
return new GreaterEqual(
(Expression) ctx.expression(0).accept(this),
(Expression) ctx.expression(1).accept(this));
}
if (ctx.op.getText().equals(">")) {
return new GreaterThan(
(Expression) ctx.expression(0).accept(this),
(Expression) ctx.expression(1).accept(this));
}
if (ctx.op.getText().equals("<=")) {
return new LessEqual(
(Expression) ctx.expression(0).accept(this),
(Expression) ctx.expression(1).accept(this));
}
if (ctx.op.getText().equals("<")) {
return new LessThan(
(Expression) ctx.expression(0).accept(this),
(Expression) ctx.expression(1).accept(this));
}
return null;
}
@Override
public Binary visitEquationExpression(@NotNull TaZQLParser.EquationExpressionContext ctx) {
if (ctx.op.getText().equals("!=")) {
return new NotEqual(
(Expression) ctx.expression(0).accept(this),
(Expression) ctx.expression(1).accept(this));
}
if (ctx.op.getText().equals("==")) {
return new Equal(
(Expression) ctx.expression(0).accept(this),
(Expression) ctx.expression(1).accept(this));
}
return null;
}
@Override public Binary visitAndExpression(@NotNull TaZQLParser.AndExpressionContext ctx) {
return new And(
(Expression) ctx.expression(0).accept(this),
(Expression) ctx.expression(1).accept(this));
}
@Override public Binary visitOrExpression(@NotNull TaZQLParser.OrExpressionContext ctx) {
return new Or(
(Expression) ctx.expression(0).accept(this),
(Expression) ctx.expression(1).accept(this));
}
@Override public Unary visitUnaryExpression(@NotNull TaZQLParser.UnaryExpressionContext ctx) {
if (ctx.op.getText().equals("!")) {
return new Not((Expression) ctx.expression().accept(this));
}
if (ctx.op.getText().equals("+")) {
return new Plus( (Expression) ctx.expression().accept(this));
}
if (ctx.op.getText().equals("-")) {
return new Minus((Expression) ctx.expression().accept(this));
}
return null;
}
//
private final HashMap<String, Type> idType = new HashMap<>();
private void putIdType(String id, Type type) {
idType.put(id, type);
}
private Type getIdType(String id) {
return idType.containsKey(id) ? idType.get(id) : null;
}
// *** expression variables ***
@Override
public Id visitId(@NotNull TaZQLParser.IdContext ctx) {
String id = ctx.ID().getText();
Type type = this.getIdType(id);
return new Id(ctx.ID().getText(), type);
}
@Override
public StringVariable visitText(@NotNull TaZQLParser.TextContext ctx) {
return new StringVariable(ctx.TEXT().getText().replaceAll("^\"|\"$", ""));
}
@Override
public IntegerVariable visitNumber(@NotNull TaZQLParser.NumberContext ctx) {
return new IntegerVariable(Integer.valueOf(ctx.NUMBER().getText()));
}
@Override
public BooleanVariable visitBooleanExpression(@NotNull TaZQLParser.BooleanExpressionContext ctx) {
return new BooleanVariable(Boolean.valueOf(ctx.BOOLEAN().getText()));
}
// *** Question types ***
@Override
public ChoiceType visitBooleanType(@NotNull TaZQLParser.BooleanTypeContext ctx) {
return new ChoiceType();
}
@Override
public IntegerType visitIntegerType(@NotNull TaZQLParser.IntegerTypeContext ctx) {
return new IntegerType();
}
@Override
public TextType visitStringType(@NotNull TaZQLParser.StringTypeContext ctx) {
return new TextType();
}
}