diff --git a/src/main/java/avatartranslator/AvatarGuard.java b/src/main/java/avatartranslator/AvatarGuard.java index b4941240b296aa19ebb33c04453c9ff077fe9a9b..3f6bd6966ecf3c5b21264dbb5df995b1e434fb14 100644 --- a/src/main/java/avatartranslator/AvatarGuard.java +++ b/src/main/java/avatartranslator/AvatarGuard.java @@ -1,26 +1,26 @@ /* Copyright or (C) or Copr. GET / ENST, Telecom-Paris, Ludovic Apvrille - * + * * ludovic.apvrille AT enst.fr - * + * * This software is a computer program whose purpose is to allow the * edition of TURTLE analysis, design and deployment diagrams, to * allow the generation of RT-LOTOS or Java code from this diagram, * and at last to allow the analysis of formal validation traces * obtained from external tools, e.g. RTL from LAAS-CNRS and CADP * from INRIA Rhone-Alpes. - * + * * This software is governed by the CeCILL license under French law and * abiding by the rules of distribution of free software. You can use, * modify and/ or redistribute the software under the terms of the CeCILL * license as circulated by CEA, CNRS and INRIA at the following URL * "http://www.cecill.info". - * + * * As a counterpart to the access to the source code and rights to copy, * modify and redistribute granted by the license, users are provided only * with a limited warranty and the software's author, the holder of the * economic rights, and the successive licensors have only limited * liability. - * + * * In this respect, the user's attention is drawn to the risks associated * with loading, using, modifying and/or developing or reproducing the * software by the user in light of its specific status of free software, @@ -31,174 +31,183 @@ * requirements in conditions enabling the security of their systems and/or * data to be ensured and, more generally, to use and operate it in the * same conditions as regards security. - * + * * The fact that you are presently reading this means that you have had * knowledge of the CeCILL license and that you accept its terms. */ package avatartranslator; -import java.util.Map; - import myutil.Conversion; import myutil.TraceManager; +import java.util.Map; + /** * Class AvatarGuard * Creation: 16/09/2015 - * @version 1.0 16/09/2015 + * * @author Florian LUGOU + * @version 1.0 16/09/2015 */ public abstract class AvatarGuard { - public static int getMatchingRParen (String s, int indexLParen) { + public static int getMatchingRParen(String s, int indexLParen) { int index, n; n = 1; - for (index = indexLParen+1; index < s.length (); index++) { - if (s.charAt (index) == '(') - n ++; - else if (s.charAt (index) == ')') + for (index = indexLParen + 1; index < s.length(); index++) { + if (s.charAt(index) == '(') + n++; + else if (s.charAt(index) == ')') n--; if (n == 0) - break; + return index; } - return index; + return -1; } - public static AvatarGuard createFromString (AvatarStateMachineOwner block, String _guard) { + public static AvatarGuard createFromString(AvatarStateMachineOwner block, String _guard) { if (_guard == null) - return new AvatarGuardEmpty (); + return new AvatarGuardEmpty(); - String sane = AvatarGuard.sanitizeString (_guard); - if (sane.isEmpty ()) - return new AvatarGuardEmpty (); + String sane = AvatarGuard.sanitizeString(_guard); + if (sane.isEmpty()) + return new AvatarGuardEmpty(); - if (sane.toLowerCase ().equals ("else")) - return new AvatarGuardElse (); + if (sane.toLowerCase().equals("else")) + return new AvatarGuardElse(); int indexRParen = 0; AvatarTuple tuple = null; AvatarGuard first = null; - if (sane.startsWith ("not(")) { - indexRParen = AvatarGuard.getMatchingRParen (sane, 3); - first = AvatarGuard.createFromString (block, sane.substring (4, indexRParen)); + if (sane.startsWith("not(")) { + indexRParen = AvatarGuard.getMatchingRParen(sane, 3); + if (indexRParen < 0) { + TraceManager.addDev("Invalid guard expression with tuple " + sane); + return new AvatarGuardEmpty(); + } + first = AvatarGuard.createFromString(block, sane.substring(4, indexRParen)); - if (indexRParen >= sane.length ()-1) { + if (indexRParen >= sane.length() - 1) { if (first instanceof AvatarComposedGuard) - return new AvatarUnaryGuard ("not", "(", ")", (AvatarComposedGuard) first); + return new AvatarUnaryGuard("not", "(", ")", (AvatarComposedGuard) first); else { - TraceManager.addDev("Could not create unary guard "+ sane); - return new AvatarGuardEmpty (); + TraceManager.addDev("Could not create unary guard " + sane); + return new AvatarGuardEmpty(); } } } - if (sane.startsWith ("(")) { - indexRParen = AvatarGuard.getMatchingRParen (sane, 0); - tuple = AvatarTuple.createFromString (block, sane.substring (0, indexRParen)); + if (sane.startsWith("(")) { + indexRParen = AvatarGuard.getMatchingRParen(sane, 0); + if (indexRParen < 0) { + TraceManager.addDev("Invalid guard expression with tuple " + sane); + return new AvatarGuardEmpty(); + } + tuple = AvatarTuple.createFromString(block, sane.substring(0, indexRParen)); if (tuple == null) { - first = AvatarGuard.createFromString (block, sane.substring (1, indexRParen)); + first = AvatarGuard.createFromString(block, sane.substring(1, indexRParen)); - if (indexRParen == sane.length ()-1) { + if (indexRParen == sane.length() - 1) { if (first instanceof AvatarComposedGuard) - return new AvatarUnaryGuard ("", "(", ")", (AvatarComposedGuard) first); + return new AvatarUnaryGuard("", "(", ")", (AvatarComposedGuard) first); else { - TraceManager.addDev("Unary guard "+ sane + " does not contain guard"); - return new AvatarGuardEmpty (); + TraceManager.addDev("Unary guard " + sane + " does not contain guard"); + return new AvatarGuardEmpty(); } } else { - int indexLParen = sane.indexOf ("(", indexRParen); + int indexLParen = sane.indexOf("(", indexRParen); if (indexLParen == -1) indexLParen = indexRParen; - for (String delim: new String[] {"and", "or"}) { + for (String delim : new String[]{"and", "or"}) { - int indexBinaryOp = sane.substring (0, indexLParen).indexOf (delim, indexRParen+1); + int indexBinaryOp = sane.substring(0, indexLParen).indexOf(delim, indexRParen + 1); if (indexBinaryOp != -1) { - first = AvatarGuard.createFromString (block, sane.substring (0, indexBinaryOp)); - AvatarGuard second = AvatarGuard.createFromString (block, sane.substring (indexBinaryOp + delim.length ())); + first = AvatarGuard.createFromString(block, sane.substring(0, indexBinaryOp)); + AvatarGuard second = AvatarGuard.createFromString(block, sane.substring(indexBinaryOp + delim.length())); if (first instanceof AvatarComposedGuard && second instanceof AvatarComposedGuard) - return new AvatarBinaryGuard ((AvatarComposedGuard) first, (AvatarComposedGuard) second, delim); - TraceManager.addDev("Binary guard "+ sane + "does not contain 2 guards"); - return new AvatarGuardEmpty (); + return new AvatarBinaryGuard((AvatarComposedGuard) first, (AvatarComposedGuard) second, delim); + TraceManager.addDev("Binary guard " + sane + "does not contain 2 guards"); + return new AvatarGuardEmpty(); } } - TraceManager.addDev("Invalid guard "+ sane); - return new AvatarGuardEmpty (); + TraceManager.addDev("Invalid guard " + sane); + return new AvatarGuardEmpty(); } - } else if (tuple.getComponents().size()==1){ - first = AvatarGuard.createFromString (block, sane.substring (1, indexRParen)); - if (indexRParen == sane.length ()-1) { + } else if (tuple.getComponents().size() == 1) { + first = AvatarGuard.createFromString(block, sane.substring(1, indexRParen)); + if (indexRParen == sane.length() - 1) { if (first instanceof AvatarComposedGuard) - return new AvatarUnaryGuard ("", "(", ")", (AvatarComposedGuard) first); + return new AvatarUnaryGuard("", "(", ")", (AvatarComposedGuard) first); else { - TraceManager.addDev("Unary guard "+ sane + " does not contain guard"); - return new AvatarGuardEmpty (); + TraceManager.addDev("Unary guard " + sane + " does not contain guard"); + return new AvatarGuardEmpty(); } } - int indexLParen = sane.indexOf ("(", indexRParen); + int indexLParen = sane.indexOf("(", indexRParen); if (indexLParen == -1) indexLParen = indexRParen; - for (String delim: new String[] {"and", "or", "&&", "||"}) { + for (String delim : new String[]{"and", "or", "&&", "||"}) { - int indexBinaryOp = sane.substring (0, indexLParen).indexOf (delim, indexRParen+1); + int indexBinaryOp = sane.substring(0, indexLParen).indexOf(delim, indexRParen + 1); if (indexBinaryOp != -1) { - first = AvatarGuard.createFromString (block, sane.substring (0, indexBinaryOp)); - AvatarGuard second = AvatarGuard.createFromString (block, sane.substring (indexBinaryOp + delim.length ())); + first = AvatarGuard.createFromString(block, sane.substring(0, indexBinaryOp)); + AvatarGuard second = AvatarGuard.createFromString(block, sane.substring(indexBinaryOp + delim.length())); if (first instanceof AvatarComposedGuard && second instanceof AvatarComposedGuard) - return new AvatarBinaryGuard ((AvatarComposedGuard) first, (AvatarComposedGuard) second, delim); - TraceManager.addDev("Binary guard "+ sane + "does not contain 2 guards"); - return new AvatarGuardEmpty (); + return new AvatarBinaryGuard((AvatarComposedGuard) first, (AvatarComposedGuard) second, delim); + TraceManager.addDev("Binary guard " + sane + "does not contain 2 guards"); + return new AvatarGuardEmpty(); } } - TraceManager.addDev("Invalid guard "+ sane); - return new AvatarGuardEmpty (); + TraceManager.addDev("Invalid guard " + sane); + return new AvatarGuardEmpty(); } else { - int indexLParen = sane.indexOf ("(", indexRParen); + int indexLParen = sane.indexOf("(", indexRParen); if (indexLParen == -1) indexLParen = indexRParen; - for (String delim: new String[] {"==", "!="}) { - int indexBinaryOp = sane.substring (0, indexLParen).indexOf (delim, indexRParen+1); + for (String delim : new String[]{"==", "!="}) { + int indexBinaryOp = sane.substring(0, indexLParen).indexOf(delim, indexRParen + 1); if (indexBinaryOp != -1) { - AvatarTerm secondTerm = AvatarTerm.createFromString (block, sane.substring (indexBinaryOp + delim.length ())); + AvatarTerm secondTerm = AvatarTerm.createFromString(block, sane.substring(indexBinaryOp + delim.length())); if (secondTerm != null) - return new AvatarSimpleGuardDuo (tuple, secondTerm, delim); - TraceManager.addDev("Could not find term in guard "+ sane); - return new AvatarGuardEmpty (); + return new AvatarSimpleGuardDuo(tuple, secondTerm, delim); + TraceManager.addDev("Could not find term in guard " + sane); + return new AvatarGuardEmpty(); } } - TraceManager.addDev("Invalid guard expression with tuple "+ sane); - return new AvatarGuardEmpty (); + TraceManager.addDev("Invalid guard expression with tuple " + sane); + return new AvatarGuardEmpty(); } } - for (String delim: new String[] {"==", "!=", "<=", ">=", "<", ">"}) { - int indexBinaryOp = sane.indexOf (delim); + for (String delim : new String[]{"==", "!=", "<=", ">=", "<", ">"}) { + int indexBinaryOp = sane.indexOf(delim); if (indexBinaryOp != -1) { - AvatarTerm firstTerm = AvatarTerm.createFromString (block, sane.substring (0, indexBinaryOp)); - AvatarTerm secondTerm = AvatarTerm.createFromString (block, sane.substring (indexBinaryOp + delim.length ())); + AvatarTerm firstTerm = AvatarTerm.createFromString(block, sane.substring(0, indexBinaryOp)); + AvatarTerm secondTerm = AvatarTerm.createFromString(block, sane.substring(indexBinaryOp + delim.length())); if (secondTerm != null && firstTerm != null) - return new AvatarSimpleGuardDuo (firstTerm, secondTerm, delim); + return new AvatarSimpleGuardDuo(firstTerm, secondTerm, delim); // TraceManager.addDev("Term in guard does not exist " +sane.substring (0, indexBinaryOp) + " "+ sane.substring (indexBinaryOp + delim.length ())); - return new AvatarGuardEmpty (); + return new AvatarGuardEmpty(); } } - AvatarTerm term = AvatarTerm.createFromString (block, sane); + AvatarTerm term = AvatarTerm.createFromString(block, sane); if (term != null) - return new AvatarSimpleGuardMono (term); + return new AvatarSimpleGuardMono(term); // TODO: add warning TraceManager.addDev("Could not parse guard '" + sane + "'. Replacing by an empty guard."); - return new AvatarGuardEmpty (); + return new AvatarGuardEmpty(); } - private static String sanitizeString (String s) { + private static String sanitizeString(String s) { String result = Conversion.replaceAllChar(s, ' ', "").trim(); result = Conversion.replaceAllChar(result, '[', ""); result = Conversion.replaceAllChar(result, ']', ""); @@ -207,31 +216,31 @@ public abstract class AvatarGuard { } public static AvatarGuard addGuard(AvatarGuard _guard, AvatarGuard _g, String _binaryOp) { - if (_g == null || ! (_g instanceof AvatarComposedGuard) || ! (_guard instanceof AvatarComposedGuard)) + if (_g == null || !(_g instanceof AvatarComposedGuard) || !(_guard instanceof AvatarComposedGuard)) return _guard; - return new AvatarBinaryGuard (new AvatarUnaryGuard ("", "(", ")", (AvatarComposedGuard) _guard), - new AvatarUnaryGuard ("", "(", ")", (AvatarComposedGuard) _g), + return new AvatarBinaryGuard(new AvatarUnaryGuard("", "(", ")", (AvatarComposedGuard) _guard), + new AvatarUnaryGuard("", "(", ")", (AvatarComposedGuard) _g), _binaryOp); } - public AvatarGuard getRealGuard (AvatarStateMachineElement precedent) { + public AvatarGuard getRealGuard(AvatarStateMachineElement precedent) { return this; } - public boolean isElseGuard () { + public boolean isElseGuard() { return false; } - public boolean isGuarded () { + public boolean isGuarded() { return true; } - public abstract String getAsString (AvatarSyntaxTranslator translator); + public abstract String getAsString(AvatarSyntaxTranslator translator); @Override - public String toString () { - return this.getAsString (new AvatarSyntaxTranslator ()); + public String toString() { + return this.getAsString(new AvatarSyntaxTranslator()); } /** @@ -239,13 +248,12 @@ public abstract class AvatarGuard { * * @return A clone of the guard. */ - public abstract AvatarGuard clone (); + public abstract AvatarGuard clone(); /** * Replaces attributes in this guard according to the provided mapping. * - * @param attributesMapping - * The mapping used to replace the attributes of the guard. All the attributes of the block should be present as keys. + * @param attributesMapping The mapping used to replace the attributes of the guard. All the attributes of the block should be present as keys. */ - public abstract void replaceAttributes( Map<AvatarAttribute, AvatarAttribute> attributesMapping); + public abstract void replaceAttributes(Map<AvatarAttribute, AvatarAttribute> attributesMapping); } diff --git a/src/main/java/avatartranslator/AvatarTuple.java b/src/main/java/avatartranslator/AvatarTuple.java index d5d716c10e57dcaaf84919b7839edee86ea9f9a7..dd5e4cad31b907858dcf575631b8bf5a02e150ce 100644 --- a/src/main/java/avatartranslator/AvatarTuple.java +++ b/src/main/java/avatartranslator/AvatarTuple.java @@ -64,12 +64,14 @@ public class AvatarTuple extends AvatarLeftHand { if (toParse.trim().startsWith("(")) { int indexLParen = toParse.indexOf ("("); int indexRParen = AvatarGuard.getMatchingRParen (toParse, indexLParen); + if (indexRParen < 0) + return null; String[] components = toParse.substring (indexLParen+1, indexRParen).trim().split (","); boolean illFormed = false; AvatarTuple argsTuple = new AvatarTuple (block); for (String arg: components) { if (!arg.isEmpty()) { - TraceManager.addDev("In for with arg=" + arg+"|"); + //TraceManager.addDev("In for with arg=" + arg+"|"); AvatarTerm t = AvatarTerm.createFromString (block, arg); if (t == null) { // Term couldn't be parsed diff --git a/src/main/java/cli/TestSpecific.java b/src/main/java/cli/TestSpecific.java index dda3e89e15538cd65f7e686c3f9d49290d9c1272..528568cc81843f0f49cd75dd523dd16f4a02fed8 100644 --- a/src/main/java/cli/TestSpecific.java +++ b/src/main/java/cli/TestSpecific.java @@ -41,6 +41,7 @@ package cli; import common.ConfigurationTTool; import launcher.RTLLauncher; +import myutil.Conversion; import myutil.IntExpressionEvaluator; import myutil.PluginManager; import myutil.TraceManager; @@ -108,11 +109,26 @@ public class TestSpecific extends Command { at.addAction(command); IntExpressionEvaluator iee = new IntExpressionEvaluator(); - iee.getResultOf(at.getAction(0).toString()); - double result = iee.getResultOf(command); System.out.println("Value of x=" + x.getInitialValue() + " y=" + y.getInitialValue() + " z=" +z.getInitialValue()); - System.out.println("Result =" + result); + String expr = at.getAction(0).toString(); + int index = expr.indexOf('='); + if (index == -1) { + System.out.println("Invalid expr"); + return "Test failed no '=' in assignation"; + } + + expr = expr.substring(index+1, expr.length()).trim(); + System.out.println("Evaluating: " + expr); + + for(AvatarAttribute aa: block.getAttributes()) { + expr = Conversion.putVariableValueInString(AvatarSpecification.ops, expr, aa.getName(), aa.getInitialValue()); + } + + System.out.println("Evaluating: " + expr); + + double result = iee.getResultOf(expr); + System.out.println("Result = " + result); return null; } catch (Exception e) { diff --git a/src/main/java/myutil/IntExpressionEvaluator.java b/src/main/java/myutil/IntExpressionEvaluator.java index afab93a2e10eafb8d5f7b130e5a442ffee6ca2fa..87c122116e1c88f90868b9c27a45b1e41827c2cd 100644 --- a/src/main/java/myutil/IntExpressionEvaluator.java +++ b/src/main/java/myutil/IntExpressionEvaluator.java @@ -84,15 +84,14 @@ public class IntExpressionEvaluator { double d = parseExpression(); - if ((errorMessage == null) && (nbOpen!=0)) { errorMessage = "Badly placed parenthesis"; } if (errorMessage != null) { - TraceManager.addDev("Expr contains an error:" + errorMessage + " expr=" + _expr); + TraceManager.addDev("Expr contains an error: " + errorMessage + " for expr:" + _expr); } else { - //TraceManager.addDev("Expr is correct"); + TraceManager.addDev("Expr is correct"); } return d; @@ -221,7 +220,7 @@ public class IntExpressionEvaluator { // <rootexp> ::= number - else if (currentType==NUMBER_TOKEN){ + else if (currentType == NUMBER_TOKEN){ result = currentValue; if (errorMessage != null) return result; match(NUMBER_TOKEN); @@ -230,7 +229,7 @@ public class IntExpressionEvaluator { else { errorMessage = - "Expected a number or a parenthesis."; + "Expected a number or a parenthesis for currentType = " + currentType; } return result; @@ -255,7 +254,7 @@ public class IntExpressionEvaluator { char c1 = s.charAt(0); if (s.length()>1 || Character.isDigit(c1)) { try { - currentValue = Integer.valueOf(s).intValue(); + currentValue = Integer.valueOf(s); currentType = NUMBER_TOKEN; } catch (NumberFormatException x) {