package eu.wietsevenema.lang.oberon.ast.visitors.interpreter; import java.util.Map; import java.util.Map.Entry; import java.util.TreeMap; import xtc.tree.Visitor; import eu.wietsevenema.lang.oberon.ast.expressions.Identifier; import eu.wietsevenema.lang.oberon.ast.types.ArrayType; import eu.wietsevenema.lang.oberon.ast.types.BooleanType; import eu.wietsevenema.lang.oberon.ast.types.IntegerType; import eu.wietsevenema.lang.oberon.ast.types.RecordType; import eu.wietsevenema.lang.oberon.ast.types.TypeAlias; import eu.wietsevenema.lang.oberon.ast.types.VarType; import eu.wietsevenema.lang.oberon.exceptions.TypeNotDeclaredException; import eu.wietsevenema.lang.oberon.exceptions.ValueUndefinedException; import eu.wietsevenema.lang.oberon.interpreter.InterpreterScope; import eu.wietsevenema.lang.oberon.interpreter.ValueReference; import eu.wietsevenema.lang.oberon.interpreter.values.ArrayValue; import eu.wietsevenema.lang.oberon.interpreter.values.BooleanValue; import eu.wietsevenema.lang.oberon.interpreter.values.IntegerValue; import eu.wietsevenema.lang.oberon.interpreter.values.RecordValue; import eu.wietsevenema.lang.oberon.interpreter.values.Value; public class ValueBuilder extends Visitor { private InterpreterScope scope; public ValueBuilder(InterpreterScope scope) { this.scope = scope; } public IntegerValue visit(IntegerType integerType) { return new IntegerValue(null); } public BooleanValue visit(BooleanType booleanType) { return new BooleanValue(null); } public Value visit(TypeAlias typeAlias) throws TypeNotDeclaredException { VarType type = scope.lookupType(typeAlias.getIdentifier().getName()); return (Value) dispatch(type); } public RecordValue visit(RecordType recordType ){ Map<Identifier, ValueReference> values = new TreeMap<Identifier, ValueReference>(); for(Entry<Identifier, VarType> entry: recordType.entrySet()){ Value dispatch = (Value)dispatch(entry.getValue()); dispatch.init(); ValueReference ref = new ValueReference(dispatch); values.put(entry.getKey(), ref); } return new RecordValue(values); } public ArrayValue visit(ArrayType arrayType) throws ValueUndefinedException { ExpressionEvaluator exprEval = new ExpressionEvaluator(scope); IntegerValue sizeValue = (IntegerValue) exprEval.dispatch(arrayType.getExpression()); Integer size = sizeValue.getValue(); Value template = (Value) this.dispatch(arrayType.getType()); template.init(); ArrayValue result = new ArrayValue(template, size); return result; } }