package org.overture.interpreter.util; import java.io.File; import java.util.List; import org.overture.ast.definitions.SClassDefinition; import org.overture.ast.lex.Dialect; import org.overture.ast.modules.AModuleModules; import org.overture.ast.node.INode; import org.overture.interpreter.runtime.ClassInterpreter; import org.overture.interpreter.runtime.Interpreter; import org.overture.interpreter.runtime.ModuleInterpreter; import org.overture.interpreter.values.Value; import org.overture.typechecker.util.TypeCheckerUtil; import org.overture.typechecker.util.TypeCheckerUtil.TypeCheckResult; public class InterpreterUtil { public static Interpreter getInterpreter(ModuleListInterpreter modules) throws Exception { return new ModuleInterpreter(modules); } public static Interpreter getInterpreter(ClassListInterpreter classes) throws Exception { return new ClassInterpreter(classes); } public static Value interpret(List<INode> ast, String entry, Dialect dialect) throws Exception { if (dialect == Dialect.VDM_SL) { ModuleListInterpreter list = new ModuleListInterpreter(); for (INode n : ast) { list.add((AModuleModules) n); } Interpreter interpreter = getInterpreter(list); interpreter.init(null); interpreter.setDefaultName(list.get(0).getName().getName()); Value val = interpreter.execute(entry, null); return val; } else { ClassListInterpreter list = new ClassListInterpreter(); for (INode n : ast) { list.add((SClassDefinition) n); } Interpreter interpreter = getInterpreter(list); interpreter.init(null); interpreter.setDefaultName(list.get(0).getName().getName()); Value val = interpreter.execute(entry, null); return val; } } public static Value interpret(String content) throws Exception { Interpreter interpreter = getInterpreter(new ModuleListInterpreter()); interpreter.init(null); Value val = interpreter.execute(content, null); return val; } public static Value interpret(Dialect dialect, String entry, File file) throws Exception { switch (dialect) { case VDM_SL: { TypeCheckResult<List<AModuleModules>> result = TypeCheckerUtil.typeCheckSl(file); if (result.errors.isEmpty()) { ModuleListInterpreter list = new ModuleListInterpreter(); list.addAll(result.result); Interpreter interpreter = getInterpreter(list); interpreter.init(null); interpreter.setDefaultName(list.get(0).getName().getName()); Value val = interpreter.execute(entry, null); return val; } } case VDM_PP: { TypeCheckResult<List<SClassDefinition>> result = TypeCheckerUtil.typeCheckPp(file); if (result.errors.isEmpty()) { ClassListInterpreter list = new ClassListInterpreter(); list.addAll(result.result); Interpreter interpreter = getInterpreter(list); interpreter.init(null); interpreter.setDefaultName(list.get(0).getName().getName()); Value val = interpreter.execute(entry, null); return val; } } case VDM_RT: { TypeCheckResult<List<SClassDefinition>> result = TypeCheckerUtil.typeCheckRt(file); if (result.errors.isEmpty()) { ClassListInterpreter list = new ClassListInterpreter(); list.addAll(result.result); Interpreter interpreter = getInterpreter(list); interpreter.init(null); interpreter.setDefaultName(list.get(0).getName().getName()); Value val = interpreter.execute(entry, null); return val; } } case CML: return null; } return null; } }