/* * JCircusControllerFrame.java */ package jcircus; import java.util.ArrayList; import java.util.List; import jcircus.exceptions.FailParsingException; import jcircus.exceptions.FailTranslationException; import jcircus.exceptions.FailTypeCheckingException; import jcircus.exceptions.JCircusException; import jcircus.exceptions.TranslationCancelledException; import jcircus.gui.JCircusFrame; import jcircus.translator.ProcInfoUpdater; import jcircus.translator.Translator2Java; import jcircus.util.Constants; import jcircus.util.MathToolkitConstants; import jcircus.util.ProcInfo; import jcircus.util.Error; import net.sourceforge.czt.base.ast.Term; import net.sourceforge.czt.circus.util.Factory; import net.sourceforge.czt.z.ast.Expr; import net.sourceforge.czt.z.ast.RefExpr; import net.sourceforge.czt.z.ast.Spec; import net.sourceforge.czt.typecheck.z.ErrorAnn; public class JCircusControllerFrame extends JCircusController { /* GUI */ private JCircusFrame _jCircusFrame; /** * Constructor. */ public JCircusControllerFrame() { javax.swing.SwingUtilities.invokeLater(new Runnable() { public void run() { _jCircusFrame = new JCircusFrame(JCircusControllerFrame.this); _jCircusFrame.showGui(); } }); } protected void translate2Java (String projectDir, String projectName, Spec spec, String compl, boolean useBarriers, boolean parallelism, boolean bench) throws FailTranslationException, TranslationCancelledException, JCircusException { List procInfoList = new ArrayList (); ProcInfoUpdater.initProcInfoAndCreateMainEnv (_jCircusFrame.getProcCreateMainEnv(), procInfoList, spec, parallelism, true); _jCircusFrame.promptForMainProcessesPCME (procInfoList); _translator = new Translator2Java(projectDir, projectName, spec, compl, useBarriers, parallelism, bench, _jCircusFrame, false); _translator.translate(true); // Prompt for the processes for each we want a main and // prompt for the parameters, in case of parameterised processes procInfoList = _translator.getProcInfoList(); //_jCircusFrame.promptForMainProcesses(procInfoList); for (int i = 0; i < procInfoList.size(); i++) { ProcInfo procInfo = procInfoList.get(i); if (procInfo.getCreateMain() == true && procInfo.getParameters() != null && !procInfo.getParameters().isEmpty()) { _jCircusFrame.promptForParameters(procInfo); } } // Create the source code files _translator.createSources(); } protected void reportMessage (String message) { _jCircusFrame.reportMessage(message); } /** * */ protected void reportParsingErrors(List errors) { String message = parsingErrorMessage(errors); reportMessage(message); } /** * */ protected void reportTypeCheckingErrors(List errors) { String message = typeCheckingErrorMessage(errors); reportMessage(message); } /** * */ protected void reportTranslationErrors(List errors) { String message = translationErrorMessage(errors); reportMessage(message); } /** * Receives the expression that was entered in the text field and the type * that it should correspond. This method is a gambi... It is okay, * because of the restrictions on the format of a declaration (the expression * must be always a RefExpr). This method performs >>fake<< parsing, typechecking * and translation to Java. Come back here in the future, when we will be dealing * with more kinds of types and expressions, and change the respective bits * of code for calls to the real parser, type checker and translator. * */ public String codeForParameter(String expression, Expr typeExpr) throws FailParsingException, FailTypeCheckingException { String code = ""; // For the moment, typeExpr will be always a reference. This will be // changed in the future. Probably this method will receive the actual // Type, instead of the type expression. assert(typeExpr instanceof RefExpr); String typeExprSt = ((RefExpr) typeExpr).getName().toString(); if (typeExprSt.equals(MathToolkitConstants.NAT) || typeExprSt.equals(MathToolkitConstants.NUM) || typeExprSt.equals(MathToolkitConstants.ARITHMOS)) { // Number try { // Simulate parsing/typeChecking here int number = Integer.parseInt(expression); code = "new " + Constants.CLS_CIRCNUM + "(" + number + ")"; } catch (NumberFormatException nfe) { // Error List errors = new Factory().list("Expression is not a number."); throw new FailParsingException(errors); } } else { // Free type if (_translator.getEnvironment().isElementFreeType(typeExprSt, expression)) { // Simulate parsing/typeChecking here code = "new " + typeExprSt + "(" + typeExprSt + "." + expression + ")"; } else { // Error List errors = new Factory().list("Expression is not an element of free type."); throw new FailParsingException(errors); } } return code; } /** * Cancel the translation. */ public void cancelTranslation () throws TranslationCancelledException { throw new TranslationCancelledException(); } }