package ql.gui.expression_interpreter; import ql.ast.expression.IExpression; import ql.ast.expression_evaluator.ExpressionEvaluatorVisitor; import ql.ast.expression_evaluator.ValueEnvironment; import ql.ast.expression_value.IValue; import ql.ast.expression_value.NullValue; import ql.gui.QuestionnaireFrame; import ql.gui.widget.IWidget; /** * @author orosu */ public class ExpressionInterpreter { private final QuestionnaireFrame _questionnaireFrame; // used to set and clear header error messages private final ValueEnvironment _valueEnvironment; // used by InputListener to set value private final IExpression _expression; private final ValueInterpreterVisitor _valueInterpreterVisitor; public ExpressionInterpreter(QuestionnaireFrame questionnaireFrame, ValueEnvironment valueEnvironment, IExpression expression, IWidget widget) { this._questionnaireFrame = questionnaireFrame; this._valueEnvironment = valueEnvironment; this._expression = expression; this._valueInterpreterVisitor = new ValueInterpreterVisitor(widget); this.evaluateAndInterpret(); } public void setValue(String id, IValue value) { this._valueEnvironment.setValue(id, value); } public IValue evaluate() { IValue value; try { //TODO maybe implement a smarter way to clear header messages this._questionnaireFrame.clearHeaderMessages(); value = this._expression.accept(new ExpressionEvaluatorVisitor(this._valueEnvironment)); } catch (Exception exception) { value = new NullValue(); this._questionnaireFrame.setHeaderMessage( exception.getClass().getSimpleName() + "! " + exception.getMessage()); } return value; } public void interpret(IValue value) { value.accept(this._valueInterpreterVisitor); } public void evaluateAndInterpret() { this.interpret(this.evaluate()); } }