package ql.semantics;
import ql.ast.expression.Expr;
import ql.ast.form.Form;
import ql.ast.form.FormVisitor;
import ql.ast.statement.*;
/**
* Created by Nik on 10-3-15.
*/
public class CondQuestionTableBuilder implements FormVisitor<Void>, StatVisitor<Void>
{
private final CondQuestionTable condQuestionTable;
private final ConditionStack conditionStack;
public static CondQuestionTable build(Form f)
{
CondQuestionTableBuilder builder = new CondQuestionTableBuilder(f.getId());
f.accept(builder);
return builder.condQuestionTable;
}
private CondQuestionTableBuilder(String title)
{
this.condQuestionTable = new CondQuestionTable(title);
this.conditionStack = new ConditionStack();
}
@Override
public Void visit(Form f)
{
for (Statement s : f.getBody())
{
s.accept(this);
}
return null;
}
@Override
public Void visit(IfCondition c)
{
this.conditionStack.push(c.getCondition());
for (Statement s : c.getBody())
{
s.accept(this);
}
this.conditionStack.pop();
return null;
}
@Override
public Void visit(Question q)
{
this.addQuestionToFlat(q);
return null;
}
@Override
public Void visit(CalculatedQuestion q)
{
this.addQuestionToFlat(q);
return null;
}
private void addQuestionToFlat(Question q)
{
Expr c = this.conditionStack.peek();
this.condQuestionTable.addQuestion(c, q);
}
}