package org.uva.sea.ql.interpreter;
import java.util.LinkedHashMap;
import java.util.Map;
import org.uva.sea.ql.ast.form.Form;
import org.uva.sea.ql.ast.stmt.AnswerableQuestion;
import org.uva.sea.ql.ast.stmt.Block;
import org.uva.sea.ql.ast.stmt.ComputedQuestion;
import org.uva.sea.ql.ast.stmt.IfThenElseStatement;
import org.uva.sea.ql.ast.stmt.IfThenStatement;
import org.uva.sea.ql.ast.stmt.Stmt;
import org.uva.sea.ql.checker.visitor.IStmtVisitor;
import org.uva.sea.ql.interpreter.value.Undefined;
import org.uva.sea.ql.interpreter.value.Value;
import org.uva.sea.ql.interpreter.visitor.ExprEvaluator;
public class Results implements IStmtVisitor {
private Map<String, Value<?>> values;
public Results(){
values = new LinkedHashMap<String, Value<?>>();
}
public void setValue(String ident, Value<?> value) {
values.put(ident, value);
}
public Map<String, Value<?>> getValues() {
return values;
}
public void fixResults(Form form) {
form.getBlock().accept(this);
}
@Override
public void visit(AnswerableQuestion stmt) {
if(!values.containsKey(stmt.getIdent().getName())){
setValue(stmt.getIdent().getName(), new Undefined().parse(stmt.getType()));
}
}
@Override
public void visit(ComputedQuestion stmt) {
Value<?> computation = stmt.getComputation().accept(new ExprEvaluator(values));
if(computation.getValue() != null){
setValue(stmt.getIdent().getName(), computation);
}
}
@Override
public void visit(IfThenStatement stmt) {
Value<?> condition = stmt.getCondition().accept(new ExprEvaluator(values));
if(condition.getValue().equals(true)){
stmt.getBody().accept(this);
}
}
@Override
public void visit(IfThenElseStatement stmt) {
Value<?> condition = stmt.getCondition().accept(new ExprEvaluator(values));
if(condition.getValue().equals(true)){
stmt.getBody().accept(this);
}
if(condition.getValue().equals(false)){
stmt.getBody().accept(this);
}
}
@Override
public void visit(Block stmt) {
for(Stmt s : stmt.getStatements()){
s.accept(this);
}
}
}