package edu.uva.softwarecons.grammar; import edu.uva.softwarecons.model.Form; import edu.uva.softwarecons.model.expression.Expression; import edu.uva.softwarecons.model.expression.arithmetic.AddExpression; import edu.uva.softwarecons.model.expression.arithmetic.DivExpression; import edu.uva.softwarecons.model.expression.arithmetic.MulExpression; import edu.uva.softwarecons.model.expression.arithmetic.SubExpression; import edu.uva.softwarecons.model.expression.comparison.EqualExpression; import edu.uva.softwarecons.model.expression.comparison.GreaterEqualExpression; import edu.uva.softwarecons.model.expression.comparison.GreaterExpression; import edu.uva.softwarecons.model.expression.comparison.LessEqualExpression; import edu.uva.softwarecons.model.expression.comparison.LessExpression; import edu.uva.softwarecons.model.expression.comparison.NotEqualExpression; import edu.uva.softwarecons.model.expression.literal.BoolExpression; import edu.uva.softwarecons.model.expression.literal.IdExpression; import edu.uva.softwarecons.model.expression.literal.IntExpression; import edu.uva.softwarecons.model.expression.literal.StringExpression; import edu.uva.softwarecons.model.expression.logical.AndExpression; import edu.uva.softwarecons.model.expression.logical.NotExpression; import edu.uva.softwarecons.model.expression.logical.OrExpression; import edu.uva.softwarecons.model.question.BasicQuestion; import edu.uva.softwarecons.model.question.ComputedQuestion; import edu.uva.softwarecons.model.question.ElseQuestion; import edu.uva.softwarecons.model.question.IfQuestion; import edu.uva.softwarecons.model.question.Question; import edu.uva.softwarecons.model.type.BooleanType; import edu.uva.softwarecons.model.type.DateType; import edu.uva.softwarecons.model.type.DecimalType; import edu.uva.softwarecons.model.type.IntegerType; import edu.uva.softwarecons.model.type.MoneyType; import edu.uva.softwarecons.model.type.StringType; import edu.uva.softwarecons.model.type.Type; import edu.uva.softwarecons.visitor.QuestionnaireElement; import edu.uva.softwarecons.visitor.form.FormElement; import org.antlr.v4.runtime.misc.NotNull; import java.util.ArrayList; import java.util.List; /** * Falconlabs * * @author Santiago Carrillo * Date: 2/26/14 */ public class QuestionnaireBuilderVisitor extends QuestionnaireBaseVisitor<QuestionnaireElement> { @Override public FormElement visitQuestionnaire( @NotNull QuestionnaireParser.QuestionnaireContext ctx ) { List<Question> questions = new ArrayList<Question>(); for ( QuestionnaireParser.QuestionContext question : ctx.question() ) { questions.add( (Question) question.accept( this ) ); } return new Form( ctx.ID().getText(), questions ); } @Override public BasicQuestion visitSimpleQuestion( @NotNull QuestionnaireParser.SimpleQuestionContext ctx ) { return new BasicQuestion( ctx.ID().getText(), ctx.STRING().getText(), (Type) ctx.type().accept( this ) ); } @Override public ComputedQuestion visitComputedQuestion( @NotNull QuestionnaireParser.ComputedQuestionContext ctx ) { return new ComputedQuestion( ctx.ID().getText(), ctx.STRING().getText(), (Type) ctx.type().accept( this ), (Expression) ctx.expr().accept( this ) ); } @Override public IfQuestion visitIf( @NotNull QuestionnaireParser.IfContext ctx ) { List<Question> questions = new ArrayList<Question>(); for ( QuestionnaireParser.QuestionContext q : ctx.question() ) { questions.add( (Question) q.accept( this ) ); } ElseQuestion elseQuestion = null; if ( null != ctx.elsestat() ) { elseQuestion = (ElseQuestion) ctx.elsestat().accept( this ); } return new IfQuestion( (Expression) ctx.expr().accept( this ), questions, elseQuestion, ctx.expr().getText() ); } @Override public ElseQuestion visitElse( @NotNull QuestionnaireParser.ElseContext ctx ) { List<Question> questions = new ArrayList<Question>(); for ( QuestionnaireParser.QuestionContext q : ctx.question() ) { questions.add( (BasicQuestion) q.accept( this ) ); } return new ElseQuestion( questions ); } @Override public BooleanType visitBooleanType( @NotNull QuestionnaireParser.BooleanTypeContext ctx ) { return new BooleanType(); } @Override public DateType visitDateType( @NotNull QuestionnaireParser.DateTypeContext ctx ) { return new DateType(); } @Override public DecimalType visitDecimalType( @NotNull QuestionnaireParser.DecimalTypeContext ctx ) { return new DecimalType(); } @Override public IntegerType visitIntType( @NotNull QuestionnaireParser.IntTypeContext ctx ) { return new IntegerType(); } @Override public MoneyType visitMoneyType( @NotNull QuestionnaireParser.MoneyTypeContext ctx ) { return new MoneyType(); } @Override public StringType visitStringType( @NotNull QuestionnaireParser.StringTypeContext ctx ) { return new StringType(); } @Override public Expression visitMulDiv( @NotNull QuestionnaireParser.MulDivContext ctx ) { if ( null != ctx.MUL() ) { return new MulExpression( (Expression) ctx.expr().get( 0 ).accept( this ), (Expression) ctx.expr().get( 1 ).accept( this ) ); } if ( null != ctx.DIV() ) { return new DivExpression( (Expression) ctx.expr().get( 0 ).accept( this ), (Expression) ctx.expr().get( 1 ).accept( this ) ); } assert false : "BUG: unknown MulDiv argument"; return null; } @Override public Expression visitAddSub( @NotNull QuestionnaireParser.AddSubContext ctx ) { if ( null != ctx.SUB() ) { return new SubExpression( (Expression) ctx.expr().get( 0 ).accept( this ), (Expression) ctx.expr().get( 1 ).accept( this ) ); } if ( null != ctx.SUB() ) { return new AddExpression( (Expression) ctx.expr().get( 0 ).accept( this ), (Expression) ctx.expr().get( 1 ).accept( this ) ); } assert false : "BUG: unknown AddSub argument"; return null; } //TODO fix bad smell !! @Override public Expression visitCompare( @NotNull QuestionnaireParser.CompareContext ctx ) { if ( null != ctx.Eq() ) { return new EqualExpression( (Expression) ctx.expr().get( 0 ).accept( this ), (Expression) ctx.expr().get( 1 ).accept( this ) ); } if ( null != ctx.GEq() ) { return new GreaterEqualExpression( (Expression) ctx.expr().get( 0 ).accept( this ), (Expression) ctx.expr().get( 1 ).accept( this ) ); } if ( null != ctx.GT() ) { return new GreaterExpression( (Expression) ctx.expr().get( 0 ).accept( this ), (Expression) ctx.expr().get( 1 ).accept( this ) ); } if ( null != ctx.LEq() ) { return new LessEqualExpression( (Expression) ctx.expr().get( 0 ).accept( this ), (Expression) ctx.expr().get( 1 ).accept( this ) ); } if ( null != ctx.LT() ) { return new LessExpression( (Expression) ctx.expr().get( 0 ).accept( this ), (Expression) ctx.expr().get( 1 ).accept( this ) ); } if ( null != ctx.NEq() ) { return new NotEqualExpression( (Expression) ctx.expr().get( 0 ).accept( this ), (Expression) ctx.expr().get( 1 ).accept( this ) ); } assert false : "BUG: unknown compare argument"; return null; } @Override public AndExpression visitAnd( @NotNull QuestionnaireParser.AndContext ctx ) { return new AndExpression( (Expression) ctx.expr().get( 0 ).accept( this ), (Expression) ctx.expr().get( 1 ).accept( this ) ); } @Override public NotExpression visitNot( @NotNull QuestionnaireParser.NotContext ctx ) { return new NotExpression( (Expression) ctx.expr().accept( this ) ); } @Override public OrExpression visitOr( @NotNull QuestionnaireParser.OrContext ctx ) { return new OrExpression( (Expression) ctx.expr().get( 0 ).accept( this ), (Expression) ctx.expr().get( 1 ).accept( this ) ); } @Override public BoolExpression visitBoolean( @NotNull QuestionnaireParser.BooleanContext ctx ) { return new BoolExpression( Boolean.valueOf( ctx.getText() ) ); } @Override public IdExpression visitId( @NotNull QuestionnaireParser.IdContext ctx ) { return new IdExpression( ctx.ID().getText() ); } @Override public IntExpression visitInteger( @NotNull QuestionnaireParser.IntegerContext ctx ) { return new IntExpression( Integer.parseInt( ctx.getText() ) ); } @Override public StringExpression visitString( @NotNull QuestionnaireParser.StringContext ctx ) { return new StringExpression( ctx.getText() ); } @Override public Expression visitParenthesis( @NotNull QuestionnaireParser.ParenthesisContext ctx ) { return (Expression) ctx.expr().accept( this ); } }