diff --git a/src/main/java/avatartranslator/AvatarExpressionSolver.java b/src/main/java/avatartranslator/AvatarExpressionSolver.java deleted file mode 100644 index 9867e120d65c9289402f92679ef1616f43df4f48..0000000000000000000000000000000000000000 --- a/src/main/java/avatartranslator/AvatarExpressionSolver.java +++ /dev/null @@ -1,666 +0,0 @@ -/* 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, - * that may mean that it is complicated to manipulate, and that also - * therefore means that it is reserved for developers and experienced - * professionals having in-depth computer knowledge. Users are therefore - * encouraged to load and test the software's suitability as regards their - * 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 avatartranslator.modelchecker.SpecificationBlock; -import avatartranslator.modelchecker.SpecificationState; - -/** - * Class AvatarExpressionSolver - * Avatar Expression Solver - * Creation: 17/04/2020 - * - * @author Alessandro TEMPIA CALVINO - * @version 1.0 17/04/2020 - */ -public class AvatarExpressionSolver { - private static final int IMMEDIATE_NO = 0; - private static final int IMMEDIATE_INT = 1; - - private AvatarExpressionSolver left, right; - private char operator; - private String expression; - private boolean isLeaf; //variable - private boolean isNot; - private boolean isNegated; - private int isImmediateValue; //0: No; 1: Boolean; 2: Int - private int intValue; - private AvatarExpressionAttribute leaf; - - - public AvatarExpressionSolver() { - left = null; - right = null; - isLeaf = true; - isImmediateValue = IMMEDIATE_NO; - intValue = 0; - } - - public AvatarExpressionSolver(String expression) { - this.expression = expression.trim(); - replaceOperators(); - left = null; - right = null; - isLeaf = true; - isImmediateValue = IMMEDIATE_NO; - intValue = 0; - isNot = false; - isNegated = false; - } - - - public void setExpression(String expression) { - this.expression = expression; - replaceOperators(); - } - - public boolean buildExpression(AvatarSpecification spec) { - boolean returnVal; - - removeUselessBrackets(); - - if (!expression.matches("^.+[\\+\\-<>=:;\\$&\\|\\*/].*$")) { - // leaf - isLeaf = true; - checkNot(); - checkNegated(); - checkNegatedNoBrackets(); - if (expression.equals("true")) { - intValue = 1; - isImmediateValue = IMMEDIATE_INT; - returnVal = true; - } else if (expression.equals("false")) { - intValue = 0; - isImmediateValue = IMMEDIATE_INT; - returnVal = true; - } else if (expression.matches("-?\\d+")) { - intValue = Integer.parseInt(expression); - isImmediateValue = IMMEDIATE_INT; - returnVal = true; - } else { - leaf = new AvatarExpressionAttribute(spec, expression); - returnVal = !leaf.hasError(); - } - //System.out.println("Variable " + expression + "\n"); - return returnVal; - } - - isLeaf = false; - - returnVal = checkNot(); - returnVal &= checkNegated(); - - if (!returnVal) { - return false; - } - - int index = getOperatorIndex(); - - if (index == -1) { - return false; - } - - operator = expression.charAt(index); - - //split and recur - String leftExpression = expression.substring(0, index).strip(); - String rightExpression = expression.substring(index + 1, expression.length()).strip(); - - left = new AvatarExpressionSolver(leftExpression); - right = new AvatarExpressionSolver(rightExpression); - //System.out.println("Expression " + expression + " ; " + leftExpression + " ; " + rightExpression + "\n"); - returnVal = left.buildExpression(spec); - returnVal &= right.buildExpression(spec); - - return returnVal; - } - - public boolean buildExpression(AvatarBlock block) { - boolean returnVal; - - removeUselessBrackets(); - - if (!expression.matches("^.+[\\+\\-<>=:;\\$&\\|\\*/].*$")) { - // leaf - isLeaf = true; - checkNot(); - checkNegated(); - checkNegatedNoBrackets(); - if (expression.equals("true")) { - intValue = 1; - isImmediateValue = IMMEDIATE_INT; - returnVal = true; - } else if (expression.equals("false")) { - intValue = 0; - isImmediateValue = IMMEDIATE_INT; - returnVal = true; - } else if (expression.matches("-?\\d+")) { - intValue = Integer.parseInt(expression); - isImmediateValue = IMMEDIATE_INT; - returnVal = true; - } else { - leaf = new AvatarExpressionAttribute(block, expression); - returnVal = !leaf.hasError(); - } - //System.out.println("Variable " + expression + "\n"); - return returnVal; - } - - isLeaf = false; - - returnVal = checkNot(); - returnVal &= checkNegated(); - - if (!returnVal) { - return false; - } - - int index = getOperatorIndex(); - - if (index == -1) { - return false; - } - - operator = expression.charAt(index); - - //split and recur - String leftExpression = expression.substring(0, index).strip(); - String rightExpression = expression.substring(index + 1, expression.length()).strip(); - - left = new AvatarExpressionSolver(leftExpression); - right = new AvatarExpressionSolver(rightExpression); - //System.out.println("Expression " + expression + " ; " + leftExpression + " ; " + rightExpression + "\n"); - returnVal = left.buildExpression(block); - returnVal &= right.buildExpression(block); - - return returnVal; - } - - public boolean builExpression(AvatarExpressionAttribute attribute) { - this.expression = attribute.toString(); - isLeaf = true; - isImmediateValue = IMMEDIATE_NO; - leaf = attribute; - return true; - } - - public boolean buildExpression() { - boolean returnVal; - - removeUselessBrackets(); - - if (!expression.matches("^.+[\\+\\-<>=:;\\$&\\|\\*/].*$")) { - // leaf - isLeaf = true; - checkNot(); - checkNegated(); - checkNegatedNoBrackets(); - if (expression.equals("true")) { - intValue = 1; - isImmediateValue = IMMEDIATE_INT; - returnVal = true; - } else if (expression.equals("false")) { - intValue = 0; - isImmediateValue = IMMEDIATE_INT; - returnVal = true; - } else if (expression.matches("-?\\d+")) { - intValue = Integer.parseInt(expression); - isImmediateValue = IMMEDIATE_INT; - returnVal = true; - } else { - returnVal = false; - } - //System.out.println("Variable " + expression + "\n"); - return returnVal; - } - - isLeaf = false; - - returnVal = checkNot(); - returnVal &= checkNegated(); - - if (!returnVal) { - return false; - } - - int index = getOperatorIndex(); - - if (index == -1) { - return false; - } - - operator = expression.charAt(index); - - //split and recur - String leftExpression = expression.substring(0, index).strip(); - String rightExpression = expression.substring(index + 1, expression.length()).strip(); - - left = new AvatarExpressionSolver(leftExpression); - right = new AvatarExpressionSolver(rightExpression); - //System.out.println("Expression " + expression + " ; " + leftExpression + " ; " + rightExpression + "\n"); - returnVal = left.buildExpression(); - returnVal &= right.buildExpression(); - - return returnVal; - } - - private void replaceOperators() { - expression = expression.replaceAll("\\|\\|", "\\|").trim(); - expression = expression.replaceAll("&&", "&").trim(); - expression = expression.replaceAll("==", "=").trim(); - expression = expression.replaceAll("!=", "\\$").trim(); - expression = expression.replaceAll(">=", ":").trim(); - expression = expression.replaceAll("<=", ";").trim(); - expression = expression.replaceAll("\\bor\\b", "\\|").trim(); - expression = expression.replaceAll("\\band\\b", "&").trim(); - //expression.replaceAll("\\btrue\\b", "t").trim(); - //expression.replaceAll("\\bfalse\\b", "f").trim(); - } - - private boolean checkNot() { - if (expression.startsWith("not(")) { - //not bracket must be closed in the last char - int closingIndex = getClosingBracket(4); - - if (closingIndex == -1) { - return false; - } - if (closingIndex == expression.length() - 1) { - //not(expression) - isNot = true; - expression = expression.substring(4, expression.length() - 1).trim(); - } - } - return true; - } - - private boolean checkNegated() { - if (expression.startsWith("-(")) { - //not bracket must be closed in the last char - int closingIndex = getClosingBracket(2); - - if (closingIndex == -1) { - return false; - } - if (closingIndex == expression.length() - 1) { - //-(expression) - isNegated = true; - expression = expression.substring(2, expression.length() - 1).trim(); - } - } - return true; - } - - private boolean checkNegatedNoBrackets() { - if (expression.startsWith("-")) { - isNegated = true; - expression = expression.substring(1, expression.length()).trim(); - } - return true; - } - - private int getOperatorIndex() { - int index; - // find the last executed operator - int i, level, priority; - boolean subVar = true; //when a subtraction is only one one variable - char a; - level = 0; - priority = 0; - for (i = 0, index = -1; i < expression.length(); i++) { - a = expression.charAt(i); - switch (a) { - case '=': - if (level == 0) { - index = i; - priority = 2; - } - subVar = true; - break; - case '$': - if (level == 0) { - index = i; - priority = 2; - } - subVar = true; - break; - case '<': - if (level == 0) { - index = i; - priority = 2; - } - subVar = true; - break; - case '>': - if (level == 0) { - index = i; - priority = 2; - } - subVar = true; - break; - case ':': - if (level == 0) { - index = i; - priority = 2; - } - subVar = true; - break; - case ';': - if (level == 0) { - index = i; - priority = 2; - } - subVar = true; - break; - case '-': - if (level == 0 && !subVar && priority < 2) { - index = i; - priority = 1; - } - break; - case '+': - if (level == 0 && !subVar && priority < 2) { - index = i; - priority = 1; - } - break; - case '|': - if (level == 0 && priority < 2) { - index = i; - priority = 1; - } - break; - case '/': - if (level == 0 && priority == 0) { - index = i; - } - break; - case '*': - if (level == 0 && priority == 0) { - index = i; - } - break; - case '&': - if (level == 0 && priority == 0) { - index = i; - } - break; - case '(': - level++; - subVar = true; - break; - case ')': - level--; - subVar = false; - break; - case ' ': - break; - default: - subVar = false; - break; - } - } - return index; - } - - public int getResult() { - int res; - if (isLeaf) { - if (isImmediateValue == IMMEDIATE_INT) { - res = intValue; - } else { - return 0; - } - } else { - res = getChildrenResult(left.getResult(), right.getResult()); - } - - if (isNot) { - res = (res == 0) ? 1 : 0; - } else if (isNegated) { - res = -res; - } - return res; - } - - public int getResult(SpecificationState ss) { - int res; - if (isLeaf) { - if (isImmediateValue == IMMEDIATE_INT) { - res = intValue; - } else { - res = leaf.getValue(ss); - } - } else { - res = getChildrenResult(left.getResult(ss), right.getResult(ss)); - } - - if (isNot) { - res = (res == 0) ? 1 : 0; - } else if (isNegated) { - res = -res; - } - return res; - } - - public int getResult(SpecificationState ss, AvatarStateMachineElement asme) { - int res; - if (isLeaf) { - if (isImmediateValue == IMMEDIATE_INT) { - res = intValue; - } else { - res = leaf.getValue(ss, asme); - } - } else { - res = getChildrenResult(left.getResult(ss, asme), right.getResult(ss, asme)); - } - - if (isNot) { - res = (res == 0) ? 1 : 0; - } else if (isNegated) { - res = -res; - } - return res; - } - - public int getResult(SpecificationBlock sb) { - int res; - if (isLeaf) { - if (isImmediateValue == IMMEDIATE_INT) { - res = intValue; - } else { - res = leaf.getValue(sb); - } - } else { - res = getChildrenResult(left.getResult(sb), right.getResult(sb)); - } - - if (isNot) { - res = (res == 0) ? 1 : 0; - } else if (isNegated) { - res = -res; - } - return res; - } - - private int getChildrenResult(int leftV, int rightV) { - int result; - - switch (operator) { - case '=': - result = (leftV == rightV) ? 1 : 0; - break; - case '$': - result = (leftV != rightV) ? 1 : 0; - break; - case '<': - result = (leftV < rightV) ? 1 : 0; - break; - case '>': - result = (leftV > rightV) ? 1 : 0; - break; - case ':': - result = (leftV >= rightV) ? 1 : 0; - break; - case ';': - result = (leftV <= rightV) ? 1 : 0; - break; - case '-': - result = leftV - rightV; - break; - case '+': - result = leftV + rightV; - break; - case '|': - result = (leftV == 0 && rightV == 0) ? 0 : 1; - break; - case '/': - result = leftV / rightV; - break; - case '*': - result = leftV * rightV; - break; - case '&': - result = (leftV == 0 || rightV == 0) ? 0 : 1; - break; - default: - //System.out.println("Error in EquationSolver::getResult"); - result = 0; - break; - } - //System.out.println(leftV + " " + operator + " " + rightV + " = " + result); - return result; - } - - public String toString() { - String retS; - if (isLeaf) { - if (isImmediateValue == IMMEDIATE_NO) { - retS = leaf.toString(); - } else { - retS = String.valueOf(intValue); - } - if (isNegated) { - retS = "-(" + retS + ")"; - } - if (isNot) { - retS = "not(" + retS + ")"; - } - } else { - String leftString = left.toString(); - String rightString = right.toString(); - String opString; - switch (operator) { - case '=': - opString = "=="; - break; - case '$': - opString = "!="; - break; - case ':': - opString = ">="; - break; - case ';': - opString = "<="; - break; - case '|': - opString = "||"; - break; - case '&': - opString = "&&"; - break; - default: - opString = "" + operator; - break; - } - retS = "(" + leftString + " " + opString + " " + rightString + ")"; - if (isNegated) { - retS = "-" + retS; - } - if (isNot) { - retS = "not" + retS; - } - } - return retS; - } - - public boolean hasState() { - boolean hasState; - if (isLeaf) { - if (isImmediateValue == IMMEDIATE_NO) { - return leaf.isState(); - } else { - return false; - } - } else { - hasState = left.hasState(); - hasState |= right.hasState(); - return hasState; - } - } - - private void removeUselessBrackets() { - while (expression.startsWith("(") && expression.endsWith(")")) { - if (getClosingBracket(1) == expression.length() - 1) { - expression = expression.substring(1, expression.length() - 1).trim(); - } else { - break; - } - } - } - - private int getClosingBracket(int startChar) { - int level = 0; - char a; - for (int i = startChar; i < expression.length(); i++) { - a = expression.charAt(i); - if (a == ')') { - if (level == 0) { - return i; - } else { - level--; - } - } else if (a == '(') { - level++; - } - } - return -1; - } - -}