diff --git a/executablecode/Makefile.src b/executablecode/Makefile.src index bf52322a40962892ad22b1cd85e0aed9852f05b7..da5a5db63ade87f017ff934a92feef1622e8eea2 100755 --- a/executablecode/Makefile.src +++ b/executablecode/Makefile.src @@ -1 +1 @@ -SRCS = generated_src/main.c generated_src/Wallet.c generated_src/CoffeeMachine.c generated_src/CoffeeButton.c generated_src/TeaButton.c \ No newline at end of file +SRCS = generated_src/main.c generated_src/Generator.c generated_src/TestBlock.c \ No newline at end of file diff --git a/src/avatartranslator/AvatarBlock.java b/src/avatartranslator/AvatarBlock.java index e31ce9682c45700542ddd559cb67c656cdae7c21..7f67c3960b450fc57955327b1dc238e34b40ac68 100644 --- a/src/avatartranslator/AvatarBlock.java +++ b/src/avatartranslator/AvatarBlock.java @@ -470,6 +470,77 @@ public class AvatarBlock extends AvatarElement { return cpt; } + public AvatarState removeElseGuards() { + if (asm == null) { + return null; + } + + AvatarStateMachineElement asme0; + AvatarTransition at = null, at0; + int nbOfElse; + String guard, g; + int i; + + for(AvatarStateMachineElement asme :asm.getListOfElements()) { + if (asme instanceof AvatarState) { + // Has only one "else" transition? + if (asme.nbOfNexts() > 0) { + // Search for several "else" + nbOfElse = 0; + for(i=0; i<asme.nbOfNexts(); i++) { + asme0 = asme.getNext(i); + if (asme0 instanceof AvatarTransition) { + if (((AvatarTransition)asme0).hasElseGuard()) { + nbOfElse ++; + at = (AvatarTransition)asme0; + } + } + } + + if ((asme.nbOfNexts() == 1) && (nbOfElse == 1)) { + return (AvatarState)asme; + } + + if (nbOfElse > 2) { + return (AvatarState)asme; + } + + if (nbOfElse == 1) { + // Must compute the new guard + guard = ""; + for(i=0; i<asme.nbOfNexts(); i++) { + asme0 = asme.getNext(i); + if ((asme0 instanceof AvatarTransition) && (asme0 != at)) { + at0 = (AvatarTransition)asme0; + g = at0.getGuard(); + if (g != null) { + if (at0.hasNonDeterministicGuard()) { + guard = "false"; + break; + } else { + if (guard.length() == 0) { + guard = "not(" + at0.getGuard() + ")"; + } else { + guard = guard + " and not(" + at0.getGuard() + ")"; + } + } + } + } + } + guard = Conversion.replaceAllChar(guard, '[', "("); + guard = Conversion.replaceAllChar(guard, ']', ")"); + guard = "[" + guard + "]"; + at.setGuard(guard); + TraceManager.addDev("[ else ] replaced with :" + guard); + } + } + } + } + + return null; + + } + } \ No newline at end of file diff --git a/src/avatartranslator/AvatarSpecification.java b/src/avatartranslator/AvatarSpecification.java index 6405f8816f36783dd91e3e0df90238414fd4036c..0f3dca3249ef867183a20e295ab8687892617015 100644 --- a/src/avatartranslator/AvatarSpecification.java +++ b/src/avatartranslator/AvatarSpecification.java @@ -345,4 +345,27 @@ public class AvatarSpecification extends AvatarElement { return null; } + public AvatarState removeElseGuards() { + AvatarState state; + + for(AvatarBlock block: blocks) { + state = block.removeElseGuards(); + if (state != null) { + return state; + } + } + + return null; + } + + public static boolean isElseGuard(String _guard) { + if (_guard == null) { + return false; + } + + String guard = Conversion.replaceAllChar(_guard, ' ', "").trim(); + + return guard.compareTo("[else]") == 0; + } + } \ No newline at end of file diff --git a/src/avatartranslator/AvatarSyntaxChecker.java b/src/avatartranslator/AvatarSyntaxChecker.java index 57b00f08569c1bf23d7ae06193fab06b57071e90..f7651da2c33c9f2ce88e1cc2a8a9177e4f924a77 100644 --- a/src/avatartranslator/AvatarSyntaxChecker.java +++ b/src/avatartranslator/AvatarSyntaxChecker.java @@ -76,10 +76,10 @@ public class AvatarSyntaxChecker { BoolExpressionEvaluator bee = new BoolExpressionEvaluator(); - TraceManager.addDev("Evaluating:" + act); + //TraceManager.addDev("Evaluating guard:" + act); boolean result = bee.getResultOf(act); if (bee.getError() != null) { - TraceManager.addDev("Error: " + bee.getError()); + //TraceManager.addDev("Error: " + bee.getError()); return -1; } @@ -93,14 +93,52 @@ public class AvatarSyntaxChecker { if (_expr.trim().length() == 0) { return 0; } - return parse(_as, _ab, "actionnat", _expr); + + String tmp = _expr.replaceAll(" ", "").trim(); + String act = tmp; + + for(AvatarAttribute aa: _ab.getAttributes()) { + act = Conversion.putVariableValueInString(AvatarSpecification.ops, act, aa.getName(), aa.getDefaultInitialValue()); + } + + IntExpressionEvaluator iee = new IntExpressionEvaluator(); + + //TraceManager.addDev("Evaluating int:" + act); + double result = iee.getResultOf(act); + if (iee.getError() != null) { + //TraceManager.addDev("Error: " + iee.getError()); + return -1; + } + + return 0; + // OLD return parse(_as, _ab, "actionnat", _expr);*/ + + } public static int isAValidBoolExpr(AvatarSpecification _as, AvatarBlock _ab, String _expr) { if (_expr.trim().length() == 0) { return 0; } - return parse(_as, _ab, "actionbool", _expr); + + String tmp = _expr.replaceAll(" ", "").trim(); + String act = tmp; + + for(AvatarAttribute aa: _ab.getAttributes()) { + act = Conversion.putVariableValueInString(AvatarSpecification.ops, act, aa.getName(), aa.getDefaultInitialValue()); + } + + BoolExpressionEvaluator bee = new BoolExpressionEvaluator(); + + //TraceManager.addDev("Evaluating bool:" + act); + boolean result = bee.getResultOf(act); + if (bee.getError() != null) { + //TraceManager.addDev("Error: " + bee.getError()); + return -1; + } + + return 0; + // OLD return parse(_as, _ab, "actionbool", _expr); } public static int isAValidVariableExpr(AvatarSpecification _as, AvatarBlock _ab, String _expr) { @@ -118,9 +156,11 @@ public class AvatarSyntaxChecker { String action = _expr.substring(index0 + 1, _expr.length()).trim(); if (aa.isInt()) { - return parse(_as, _ab, "actionnat", action); + return isAValidIntExpr(_as, _ab, action); + //return parse(_as, _ab, "actionnat", action); } else if (aa.isBool()) { - return parse(_as, _ab, "actionbool", action); + return isAValidBoolExpr(_as, _ab, action); + //return parse(_as, _ab, "actionbool", action); } return -1; } diff --git a/src/avatartranslator/AvatarTransition.java b/src/avatartranslator/AvatarTransition.java index 41eee5438b0244d637fef0d39f5a67d97beb35d5..d308b00d928e2812347ebbe0bcfab217e8e3b5bb 100644 --- a/src/avatartranslator/AvatarTransition.java +++ b/src/avatartranslator/AvatarTransition.java @@ -117,6 +117,25 @@ public class AvatarTransition extends AvatarStateMachineElement { } return maxCompute; } + + public boolean hasElseGuard() { + if (guard == null) { + return false; + } + + return AvatarSpecification.isElseGuard(guard); + } + + public boolean hasNonDeterministicGuard() { + if (guard == null) { + return false; + } + + String tmp = Conversion.replaceAllChar(guard, ' ', "").trim(); + + return tmp.compareTo("[]") == 0; + + } public AvatarTransition cloneMe() { diff --git a/src/avatartranslator/toexecutable/AVATAR2CPOSIX.java b/src/avatartranslator/toexecutable/AVATAR2CPOSIX.java index 20b7be3290a732b6f9aa974f9d90e896c8ee062c..5153e1ccd8faadd63481a4b101f63b97ea6b8bbd 100755 --- a/src/avatartranslator/toexecutable/AVATAR2CPOSIX.java +++ b/src/avatartranslator/toexecutable/AVATAR2CPOSIX.java @@ -459,7 +459,12 @@ public class AVATAR2CPOSIX { if (at.hasActions()) { ret += " if (__returnRequest == &__req" + i + ") {" + CR; for(int j=0; j<at.getNbOfAction(); j++) { - ret += at.getAction(j) + ";" + CR; + if (at.isAMethodCall(at.getAction(j))) { + ret += modifyMethodName(_block, at.getAction(j)) + ";" + CR; + } else { + ret += at.getAction(j) + ";" + CR; + } + } ret += makeBehaviourFromElement(_block, at.getNext(0), false) + CR + "}"; } else { diff --git a/src/myutil/BoolExpressionEvaluator.java b/src/myutil/BoolExpressionEvaluator.java index 09c464f21c6a1458ea092670983c705b181844c7..5a07cdcc3cbceb8cf1feccd45dd5df6777b531fa 100755 --- a/src/myutil/BoolExpressionEvaluator.java +++ b/src/myutil/BoolExpressionEvaluator.java @@ -74,8 +74,6 @@ public class BoolExpressionEvaluator { private int currentValue; - - public BoolExpressionEvaluator() { } @@ -102,7 +100,7 @@ public class BoolExpressionEvaluator { //TraceManager.addDev("Computing:" + _expr); - tokens = new java.util.StringTokenizer(_expr," \t\n\r+-*/()!=&|<>",true); + tokens = new java.util.StringTokenizer(_expr," \t\n\r+-*/()!=&|<>:;",true); computeNextToken(); int result = (int)(parseExpression()); @@ -117,8 +115,6 @@ public class BoolExpressionEvaluator { errorMessage = "Not a boolean expression: " + _expr; - - return false; } @@ -494,7 +490,7 @@ public class BoolExpressionEvaluator { return; } - if (s.compareTo("<") == 0) { + if (s.compareTo(";") == 0) { currentValue = 0; currentType = LTEQ_TOKEN; //TraceManager.addDev("equal token!"); diff --git a/src/ui/AvatarDesignPanelTranslator.java b/src/ui/AvatarDesignPanelTranslator.java index 25bb4bd99c3be5702803f673511bf292f02386d6..d254f2026681fe2ea1ded8e6792f4f037e8a60da 100644 --- a/src/ui/AvatarDesignPanelTranslator.java +++ b/src/ui/AvatarDesignPanelTranslator.java @@ -100,6 +100,9 @@ public class AvatarDesignPanelTranslator { createRelationsBetweenBlocks(as, blocks); makeBlockStateMachines(as); createPragmas(as, blocks); + TraceManager.addDev("Removing else guards"); + as.removeElseGuards(); + TraceManager.addDev("Removing else guards ... done"); return as; } @@ -1003,11 +1006,16 @@ public class AvatarDesignPanelTranslator { // Guard tmp = modifyString(asmdco.getGuard()); - error = AvatarSyntaxChecker.isAValidGuard(_as, _ab, tmp); - if (error < 0) { - makeError(error, tdp, _ab, tgc, "transition guard", tmp); - } else { + + if (AvatarSpecification.isElseGuard(tmp)) { at.setGuard(tmp); + } else { + error = AvatarSyntaxChecker.isAValidGuard(_as, _ab, tmp); + if (error < 0) { + makeError(error, tdp, _ab, tgc, "transition guard", tmp); + } else { + at.setGuard(tmp); + } } // Delays @@ -1308,53 +1316,6 @@ public class AvatarDesignPanelTranslator { return !(TAttribute.isAValidId(tmp, false, false)); } - /*private String makeTIFActionOnParam(String _s) { - String ret = _s.trim(); - int index0 = ret.indexOf("="); - if (index0 == -1) { - return ret; - } - - return ret.substring(index0+1, ret.length()).trim(); - - } - - private String makeTIFAction(String _s, String _replace) { - String ret = _s.trim(); - int index0 = ret.indexOf("("); - if (index0 == -1) { - return ""; - } - - int index1 = ret.indexOf(")"); - if (index1 == -1) { - return ""; - } - - ret = ret.substring(index0, index1); - - ret = Conversion.replaceAllString(ret, "(", _replace); - ret = Conversion.replaceAllString(ret, ",", _replace); - ret = Conversion.replaceAllString(ret, " ", ""); - - return ret; - } - - // Checks whether all states with internal state machines have at most one start state - private TGComponent checkForStartStateOfCompositeStates(AvatarSMDPanel _panel) { - TGComponent tgc; - ListIterator iterator = _panel.getComponentList().listIterator(); - while(iterator.hasNext()) { - tgc = (TGComponent)(iterator.next()); - if (tgc instanceof AvatarSMDState) { - tgc = (((AvatarSMDState)(tgc)).checkForStartStateOfCompositeStates()); - if (tgc != null) { - return tgc; - } - } - } - return null; - }*/ - + } diff --git a/src/ui/GTMLModeling.java b/src/ui/GTMLModeling.java index 91eee97346a149f4cee199b4e7b166ec47784b8e..0901f0b8ff284a21086f3d4e018e9f87a8e3c43f 100755 --- a/src/ui/GTMLModeling.java +++ b/src/ui/GTMLModeling.java @@ -2047,7 +2047,7 @@ public class GTMLModeling { if (task != null) { tmp.add(task); } else { - CheckingError ce = new CheckingError(CheckingError.STRUCTURE_ERROR, "Task " + artifact.getTaskName() + " referenced by artifact " + artifact.getValue() + "is unknown"); + CheckingError ce = new CheckingError(CheckingError.STRUCTURE_ERROR, "Task " + artifact.getTaskName() + " referenced by artifact " + artifact.getValue() + " is unknown"); //ce.setTMLTask(tmltask); ce.setTDiagramPanel(tmlap.tmlap); ce.setTGComponent(tgc); @@ -2072,7 +2072,7 @@ public class GTMLModeling { tmp.add(pc); allcomp.add(pc); } else { - CheckingError ce = new CheckingError(CheckingError.STRUCTURE_ERROR, "Component " + artifact.getTaskName() + " referenced by artifact " + artifact.getValue() + "is unknown"); + CheckingError ce = new CheckingError(CheckingError.STRUCTURE_ERROR, "Component " + artifact.getTaskName() + " referenced by artifact " + artifact.getValue() + " is unknown"); //ce.setTMLTask(tmltask); ce.setTDiagramPanel(tmlap.tmlap); ce.setTGComponent(tgc);