From c65ef4577ff0a1b86805cd10b959fc79070ab450 Mon Sep 17 00:00:00 2001
From: Sophie Coudert <sophie.coudert@telecom-paris.fr>
Date: Wed, 5 Apr 2023 16:13:31 +0200
Subject: [PATCH] Avatar integration

---
 graphminimize/build.gradle                    |   1 +
 graphshow/build.gradle                        |   1 +
 launcher/build.gradle                         |   1 +
 rundse/build.gradle                           |   1 +
 simulationcontrol/build.gradle                |   1 +
 .../avatartranslator/AvatarSyntaxChecker.java |   1 -
 .../AvatarIBSExpressionClass.java             |   2 +-
 ...Parser.java => AvatarIBSOriginParser.java} |   6 +-
 .../intboolsolver/AvatarIBSStdParser.java     | 102 ++++++++++++++++++
 .../intboolsolver/AvatarIBSolver.java         |   2 +-
 .../myutil/intboolsolver/IBSStdLexer.java     |  76 ++++++-------
 .../myutil/intboolsolver/IBSStdParser.java    |  75 ++++++++++++-
 .../intboolsolver/javacup/IBSStdLexer.jflex   |  26 ++---
 .../intboolsolver/javacup/IBSStdParser.jcup   |  75 ++++++++++++-
 .../myutil/intboolsolver/javacup/test.tgz     | Bin 2156 -> 0 bytes
 tiftranslator/build.gradle                    |   1 +
 tmltranslator/build.gradle                    |   1 +
 ttool-cli/build.gradle                        |   1 +
 ...st.java => AvatarIBSOriginParserTest.java} |   8 +-
 webcrawler/client/build.gradle                |   1 +
 webcrawler/server/build.gradle                |   1 +
 21 files changed, 318 insertions(+), 65 deletions(-)
 rename src/main/java/avatartranslator/intboolsolver/{AvatarIBSParser.java => AvatarIBSOriginParser.java} (96%)
 create mode 100644 src/main/java/avatartranslator/intboolsolver/AvatarIBSStdParser.java
 delete mode 100644 src/main/java/myutil/intboolsolver/javacup/test.tgz
 rename ttool/src/test/java/avatartranslator/{AvatarIBSParserTest.java => AvatarIBSOriginParserTest.java} (98%)

diff --git a/graphminimize/build.gradle b/graphminimize/build.gradle
index 7b80aed762..a96b2cdc43 100644
--- a/graphminimize/build.gradle
+++ b/graphminimize/build.gradle
@@ -20,6 +20,7 @@ sourceSets {
 }
 
 dependencies {
+    implementation name: 'java_cup'
     compileOnly name: 'gs-core-2.0'
     compileOnly name: 'gs-algo-2.0'
     compileOnly name: 'gs-ui-swing-2.0'
diff --git a/graphshow/build.gradle b/graphshow/build.gradle
index d784aed857..7cfae83b48 100644
--- a/graphshow/build.gradle
+++ b/graphshow/build.gradle
@@ -15,6 +15,7 @@ sourceSets {
 }
 
 dependencies {
+    implementation name: 'java_cup'
     implementation name: 'gs-core-2.0'
     implementation name: 'gs-algo-2.0'
     implementation name: 'gs-ui-swing-2.0'
diff --git a/launcher/build.gradle b/launcher/build.gradle
index 1c07d24e9f..5a88f6c619 100644
--- a/launcher/build.gradle
+++ b/launcher/build.gradle
@@ -12,6 +12,7 @@ sourceSets {
 }
 
 dependencies {
+    implementation name: 'java_cup'
     implementation name: 'commons-codec-1.10'
     compileOnly name: 'commons-io-2.5'
     compileOnly name: 'jsoup-1.8.1'
diff --git a/rundse/build.gradle b/rundse/build.gradle
index 3727e52832..0b0b7ccd02 100644
--- a/rundse/build.gradle
+++ b/rundse/build.gradle
@@ -10,6 +10,7 @@ sourceSets {
 }
 
 dependencies {
+    implementation name: 'java_cup'
     compileOnly name: 'opencloud'
     compileOnly name: 'JavaPlot'
     compileOnly name: 'derbynet'
diff --git a/simulationcontrol/build.gradle b/simulationcontrol/build.gradle
index 7cafd684af..a88b8d7f0b 100644
--- a/simulationcontrol/build.gradle
+++ b/simulationcontrol/build.gradle
@@ -13,6 +13,7 @@ sourceSets {
 }
 
 dependencies {
+    implementation name: 'java_cup'
     implementation name: 'jsoup-1.8.1'
 }
 
diff --git a/src/main/java/avatartranslator/AvatarSyntaxChecker.java b/src/main/java/avatartranslator/AvatarSyntaxChecker.java
index ed5800c4fb..9a79c7c3f0 100644
--- a/src/main/java/avatartranslator/AvatarSyntaxChecker.java
+++ b/src/main/java/avatartranslator/AvatarSyntaxChecker.java
@@ -47,7 +47,6 @@ import compiler.tmlparser.TokenMgrError;
 import myutil.Conversion;
 import myutil.NameChecker;
 import myutil.TraceManager;
-import avatartranslator.intboolsolver.AvatarIBSParser;
 
 import java.io.StringReader;
 import java.util.ArrayList;
diff --git a/src/main/java/avatartranslator/intboolsolver/AvatarIBSExpressionClass.java b/src/main/java/avatartranslator/intboolsolver/AvatarIBSExpressionClass.java
index 5043706c2d..cb571acc35 100644
--- a/src/main/java/avatartranslator/intboolsolver/AvatarIBSExpressionClass.java
+++ b/src/main/java/avatartranslator/intboolsolver/AvatarIBSExpressionClass.java
@@ -53,7 +53,7 @@ import myutil.intboolsolver.*;
  * <p> It is provided for documentation together with
  * {@link IBSStdClosedFormulaAttributeClass
  * IBSStdClosedFormulaAttribute} and
- * {@link AvatarIBSParser
+ * {@link AvatarIBSOriginParser
  * IBSStdClosedFormulaSolver}}</p>
  *
  * <p>These three
diff --git a/src/main/java/avatartranslator/intboolsolver/AvatarIBSParser.java b/src/main/java/avatartranslator/intboolsolver/AvatarIBSOriginParser.java
similarity index 96%
rename from src/main/java/avatartranslator/intboolsolver/AvatarIBSParser.java
rename to src/main/java/avatartranslator/intboolsolver/AvatarIBSOriginParser.java
index bb9e19d06e..d3c956ad68 100644
--- a/src/main/java/avatartranslator/intboolsolver/AvatarIBSParser.java
+++ b/src/main/java/avatartranslator/intboolsolver/AvatarIBSOriginParser.java
@@ -71,16 +71,16 @@ import myutil.intboolsolver.*;
  * @author Sophie Coudert
  */
 
-public class AvatarIBSParser extends IBSOriginParser<
+public class AvatarIBSOriginParser extends IBSOriginParser<
         AvatarSpecification,
         AvatarBlock,
         AvatarStateMachineElement,
         SpecificationState,
         SpecificationBlock> {
-        public AvatarIBSParser() {
+        public AvatarIBSOriginParser() {
                 super(new AvatarIBSAttributeClass(),new AvatarIBSExpressionClass());
         }
-        public AvatarIBSParser(
+        public AvatarIBSOriginParser(
                 IBSAttributeClass<
                         AvatarSpecification,
                         AvatarBlock,
diff --git a/src/main/java/avatartranslator/intboolsolver/AvatarIBSStdParser.java b/src/main/java/avatartranslator/intboolsolver/AvatarIBSStdParser.java
new file mode 100644
index 0000000000..1444f1b5ac
--- /dev/null
+++ b/src/main/java/avatartranslator/intboolsolver/AvatarIBSStdParser.java
@@ -0,0 +1,102 @@
+/* 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.intboolsolver;
+
+import avatartranslator.AvatarBlock;
+import avatartranslator.AvatarSpecification;
+import avatartranslator.AvatarStateMachineElement;
+import avatartranslator.modelchecker.SpecificationBlock;
+import avatartranslator.modelchecker.SpecificationState;
+import myutil.intboolsolver.*;
+
+/**
+ * class IBSStdClosedFormulaSolver is a complete implementation
+ * and instantiation of {@link IBSOriginParser
+ * IBSolver} for closed Formulas.
+ *
+ * <p> It is provided for documentation together with
+ * {@link IBSStdClosedFormulaAttributeClass
+ * IBSStdClosedFormulaAttributeClass} and
+ * {@link IBSStdClosedFormulaAttributeClass
+ * IBSStdClosedFormulaAttribute}}</p>
+ *
+ * <p>These three
+ * classes provides the same features as
+ * {@link IBSClosedFormulaAttributeClass
+ * IBSClosedFormulaAttribute},
+ * {@link IBSClosedFormulaAttributeClass
+ * IBSClosedFormulaAttributeClass} and
+ * {@link IBSClosedFormulaParser
+ * IBSClosedFormulaSolver} (together).</p>
+ *
+ * Creation: 07/03/2023
+ *
+ * @version 0.1 07/03/2023
+ * @author Sophie Coudert
+ */
+
+public class AvatarIBSStdParser extends IBSStdParser<
+        AvatarSpecification,
+        AvatarBlock,
+        AvatarStateMachineElement,
+        SpecificationState,
+        SpecificationBlock> {
+        public AvatarIBSStdParser() {
+                super();
+                setAttributeClass(new AvatarIBSAttributeClass());
+                setExpressionClass(new AvatarIBSExpressionClass());
+        }
+        public AvatarIBSStdParser(
+                IBSAttributeClass<
+                        AvatarSpecification,
+                        AvatarBlock,
+                        AvatarStateMachineElement,
+                        SpecificationState,
+                        SpecificationBlock> _c,
+                IBSExpressionClass<
+                        AvatarSpecification,
+                        AvatarBlock,
+                        AvatarStateMachineElement,
+                        SpecificationState,
+                        SpecificationBlock> _e) {
+                super();
+                setAttributeClass(_c);
+                setExpressionClass(_e);
+        }
+}
\ No newline at end of file
diff --git a/src/main/java/avatartranslator/intboolsolver/AvatarIBSolver.java b/src/main/java/avatartranslator/intboolsolver/AvatarIBSolver.java
index 44df3cfb76..a1742b1aef 100644
--- a/src/main/java/avatartranslator/intboolsolver/AvatarIBSolver.java
+++ b/src/main/java/avatartranslator/intboolsolver/AvatarIBSolver.java
@@ -4,5 +4,5 @@ public class AvatarIBSolver {
     public static AvatarIBSAttributeClass attrC = new AvatarIBSAttributeClass();
     protected static AvatarIBSExpressionClass exprC = new AvatarIBSExpressionClass();
 
-    public static AvatarIBSParser parser = new AvatarIBSParser(attrC,exprC);
+    public static AvatarIBSStdParser parser = new AvatarIBSStdParser(attrC,exprC);
 }
diff --git a/src/main/java/myutil/intboolsolver/IBSStdLexer.java b/src/main/java/myutil/intboolsolver/IBSStdLexer.java
index deb1a10840..214a412818 100644
--- a/src/main/java/myutil/intboolsolver/IBSStdLexer.java
+++ b/src/main/java/myutil/intboolsolver/IBSStdLexer.java
@@ -1,4 +1,4 @@
-/* The following code was generated by JFlex 1.4.3 on 05/04/2023 14:20 */
+/* The following code was generated by JFlex 1.4.3 on 05/04/2023 15:54 */
 
 package myutil.intboolsolver;
 import java_cup.runtime.*;
@@ -8,7 +8,7 @@ import java.util.HashSet;
 /**
  * This class is a scanner generated by 
  * <a href="http://www.jflex.de/">JFlex</a> 1.4.3
- * on 05/04/2023 14:20 from the specification file
+ * on 05/04/2023 15:54 from the specification file
  * <tt>IBSStdLexer.jflex</tt>
  */
 class IBSStdLexer< Spec extends IBSParamSpec, Comp extends IBSParamComp, State extends IBSParamState, SpecState extends IBSParamSpecState, CompState extends IBSParamCompState > implements java_cup.runtime.Scanner {
@@ -251,24 +251,24 @@ class IBSStdLexer< Spec extends IBSParamSpec, Comp extends IBSParamComp, State e
   private boolean zzEOFDone;
 
   /* user code: */
-private IBSStdAttributeClass<Spec,Comp,State,SpecState,CompState> attrC;
+private IBSAttributeClass<Spec,Comp,State,SpecState,CompState> attrC;
 private IBSExpressionClass<Spec,Comp,State,SpecState,CompState> exprC;
 private final HashSet<String> badIdents = new HashSet<String>();
 
 public IBSStdLexer(){}
-public void setAttributeClass( IBSStdAttributeClass<Spec,Comp,State,SpecState,CompState> _attrC) { attrC = _attrC; }
-public IBSStdAttributeClass<Spec,Comp,State,SpecState,CompState> getAttributeClass() { return attrC; }
+public void setAttributeClass( IBSAttributeClass<Spec,Comp,State,SpecState,CompState> _attrC) { attrC = _attrC; }
+public IBSAttributeClass<Spec,Comp,State,SpecState,CompState> getAttributeClass() { return attrC; }
 public void setExpressionClass( IBSExpressionClass<Spec,Comp,State,SpecState,CompState> _exprC) { exprC = _exprC; }
 public IBSExpressionClass<Spec,Comp,State,SpecState,CompState> getExpressionClass() { return exprC; }
 public HashSet<String> getBadIdents() { return badIdents; }
 public void clearBadIdents() { badIdents.clear(); }
 
 private abstract class AttrHandler {
-    public abstract IBSStdAttributeClass<Spec,Comp,State,SpecState,CompState>.TypedAttribute getTypedAttribute(String _s) throws Exception;
+    public abstract IBSAttributeClass<Spec,Comp,State,SpecState,CompState>.TypedAttribute getTypedAttribute(String _s) throws Exception;
 }
 private class ClosedAttrHandler extends AttrHandler {
     ClosedAttrHandler(){};
-    public IBSStdAttributeClass<Spec,Comp,State,SpecState,CompState>.TypedAttribute getTypedAttribute(String _s)
+    public IBSAttributeClass<Spec,Comp,State,SpecState,CompState>.TypedAttribute getTypedAttribute(String _s)
        throws Exception {
         badIdents.add(_s); throw new Exception ("Ident in closed expression: " +  _s);
     }
@@ -276,14 +276,14 @@ private class ClosedAttrHandler extends AttrHandler {
 private class SpecAttrHandler extends AttrHandler {
     private Spec spec;
     SpecAttrHandler(Spec _spec){ spec = _spec; }
-    public IBSStdAttributeClass<Spec,Comp,State,SpecState,CompState>.TypedAttribute getTypedAttribute(String _s){
+    public IBSAttributeClass<Spec,Comp,State,SpecState,CompState>.TypedAttribute getTypedAttribute(String _s){
         return attrC.getTypedAttribute(spec,_s);
     }
 }
 private class CompAttrHandler extends AttrHandler {
     private Comp comp;
     CompAttrHandler(Comp _comp){ comp = _comp; }
-    public IBSStdAttributeClass<Spec,Comp,State,SpecState,CompState>.TypedAttribute getTypedAttribute(String _s){
+    public IBSAttributeClass<Spec,Comp,State,SpecState,CompState>.TypedAttribute getTypedAttribute(String _s){
         return attrC.getTypedAttribute(comp,_s);
     }
 }
@@ -614,86 +614,86 @@ public void init(Comp _comp, String _s) throws java.io.IOException { attrHandler
           { return new Symbol(IBSStdParserSym.LT);
           }
         case 26: break;
+        case 3: 
+          { IBSAttributeClass<Spec,Comp,State,SpecState,CompState>.TypedAttribute attr =
+                      attrHandler.getTypedAttribute(yytext());
+                  switch(attr.getType()) {
+                      case IBSAttributeClass.NullAttr : badIdents.add(yytext()); throw new Exception ("Bad Ident : " +  yytext());
+                      case IBSAttributeClass.BoolConst : return new Symbol(IBSStdParserSym.BOOL, Integer.valueOf(exprC.make_bConst(attr.getConstant()!=0)));
+                      case IBSAttributeClass.IntConst : return new Symbol(IBSStdParserSym.INT, Integer.valueOf(exprC.make_iConst(attr.getConstant())));
+                      case IBSAttributeClass.BoolAttr : return new Symbol(IBSStdParserSym.BOOL, Integer.valueOf(exprC.make_bVar(attr.getAttribute())));
+                      case IBSAttributeClass.IntAttr : return new Symbol(IBSStdParserSym.INT, Integer.valueOf(exprC.make_iVar(attr.getAttribute())));
+                      default : throw new Error ("Lexer, BUG : bad attribute type");
+                  }
+          }
+        case 27: break;
         case 19: 
           { return new Symbol(IBSStdParserSym.GEQ);
           }
-        case 27: break;
+        case 28: break;
         case 8: 
           { return new Symbol(IBSStdParserSym.MOD);
           }
-        case 28: break;
+        case 29: break;
         case 11: 
           { return new Symbol(IBSStdParserSym.GT);
           }
-        case 29: break;
+        case 30: break;
         case 18: 
           { return new Symbol(IBSStdParserSym.LEQ);
           }
-        case 30: break;
+        case 31: break;
         case 17: 
           { return new Symbol(IBSStdParserSym.EQ);
           }
-        case 31: break;
+        case 32: break;
         case 14: 
           { return new Symbol(IBSStdParserSym.OR);
           }
-        case 32: break;
+        case 33: break;
         case 4: 
           { return new Symbol(IBSStdParserSym.PLUS);
           }
-        case 33: break;
+        case 34: break;
         case 21: 
           { return new Symbol(IBSStdParserSym.BOOL, Integer.valueOf(exprC.make_bConst(false)));
           }
-        case 34: break;
+        case 35: break;
         case 13: 
           { return new Symbol(IBSStdParserSym.RPAR);
           }
-        case 35: break;
+        case 36: break;
         case 5: 
           { return new Symbol(IBSStdParserSym.MINUS);
           }
-        case 36: break;
+        case 37: break;
         case 22: 
           { yybegin(INTBOOL); return new Symbol(IBSStdParserSym.PARSE_BOOL);
           }
-        case 37: break;
+        case 38: break;
         case 15: 
           { return new Symbol(IBSStdParserSym.AND);
           }
-        case 38: break;
+        case 39: break;
         case 9: 
           { return new Symbol(IBSStdParserSym.NOT);
           }
-        case 39: break;
+        case 40: break;
         case 7: 
           { return new Symbol(IBSStdParserSym.DIV);
           }
-        case 40: break;
+        case 41: break;
         case 6: 
           { return new Symbol(IBSStdParserSym.MULT);
           }
-        case 41: break;
+        case 42: break;
         case 12: 
           { return new Symbol(IBSStdParserSym.LPAR);
           }
-        case 42: break;
+        case 43: break;
         case 20: 
           { return new Symbol(IBSStdParserSym.BOOL, Integer.valueOf(exprC.make_bConst(true)));
           }
-        case 43: break;
-        case 3: 
-          { IBSStdAttributeClass<Spec,Comp,State,SpecState,CompState>.TypedAttribute attr =
-                      attrHandler.getTypedAttribute(yytext());
-                  switch(attr.getType()) {
-                      case IBSStdAttributeClass.NullAttr : badIdents.add(yytext()); throw new Exception ("Bad Ident : " +  yytext());
-                      case IBSStdAttributeClass.BoolConst : return new Symbol(IBSStdParserSym.BOOL, Integer.valueOf(exprC.make_bConst(attr.getConstant()!=0)));
-                      case IBSStdAttributeClass.IntConst : return new Symbol(IBSStdParserSym.INT, Integer.valueOf(exprC.make_iConst(attr.getConstant())));
-                      case IBSStdAttributeClass.BoolAttr : return new Symbol(IBSStdParserSym.BOOL, Integer.valueOf(exprC.make_bVar(attr.getAttribute())));
-                      case IBSStdAttributeClass.IntAttr : return new Symbol(IBSStdParserSym.INT, Integer.valueOf(exprC.make_iVar(attr.getAttribute())));
-                      default : throw new Error ("Lexer, BUG : bad attribute type");
-                  }
-          }
         case 44: break;
         case 2: 
           { try { return new Symbol(IBSStdParserSym.INT, Integer.valueOf(exprC.make_iConst(Integer.parseInt(yytext()))));}
diff --git a/src/main/java/myutil/intboolsolver/IBSStdParser.java b/src/main/java/myutil/intboolsolver/IBSStdParser.java
index 87234659b0..5431c49dfe 100644
--- a/src/main/java/myutil/intboolsolver/IBSStdParser.java
+++ b/src/main/java/myutil/intboolsolver/IBSStdParser.java
@@ -216,9 +216,9 @@ public class IBSStdParser< Spec extends IBSParamSpec, Comp extends IBSParamComp,
     
     public void setLexer(IBSStdLexer<Spec,Comp,State,SpecState,CompState> _lexer){ lexer=_lexer; setScanner(_lexer); }
 
-    public void setAttributeClass(IBSStdAttributeClass<Spec,Comp,State,SpecState,CompState> _c){ lexer.setAttributeClass(_c); }
+    public void setAttributeClass(IBSAttributeClass<Spec,Comp,State,SpecState,CompState> _c){ lexer.setAttributeClass(_c); }
 
-    public IBSStdAttributeClass<Spec,Comp,State,SpecState,CompState> getAttributeClass(){ return lexer.getAttributeClass(); }
+    public IBSAttributeClass<Spec,Comp,State,SpecState,CompState> getAttributeClass(){ return lexer.getAttributeClass(); }
 
     public void setExpressionClass(IBSExpressionClass<Spec,Comp,State,SpecState,CompState> _c){ lexer.setExpressionClass(_c); }
 
@@ -296,6 +296,77 @@ public class IBSStdParser< Spec extends IBSParamSpec, Comp extends IBSParamComp,
         return null;
     }
 
+    // A DEPLACER ...
+
+    public int indexOfVariable(String expr, String variable) {
+        int index;
+        String tmp = expr;
+        int removed = 0;
+        //System.out.println("\nHandling expr: " + expr);
+
+        while ((index = tmp.indexOf(variable)) > -1) {
+            char c1, c2;
+            if (index > 0) {
+                c1 = tmp.charAt(index - 1);
+            } else {
+                c1 = ' ';
+            }
+
+            if (index + variable.length() < tmp.length())
+                c2 = tmp.charAt(index + variable.length());
+            else
+                c2 = ' ';
+
+            //System.out.println("tmp=" + tmp + " c1=" + c1 + " c2=" + c2);
+
+            if (!(Character.isLetterOrDigit(c1) || (c1 == '_'))) {
+                if (!(Character.isLetterOrDigit(c2) || (c2 == '_'))) {
+                    //System.out.println("Found at index=" + index + " returnedIndex=" + (index+removed));
+                    return index + removed;
+                }
+            }
+            tmp = tmp.substring(index + variable.length(), tmp.length());
+            //System.out.println("tmp=" + tmp);
+            removed = index + variable.length();
+            if (tmp.length() == 0) {
+                return -1;
+            }
+            // We cut until we find a non alphanumerical character
+            while (Character.isLetterOrDigit(tmp.charAt(0)) || (tmp.charAt(0) == '_')) {
+                tmp = tmp.substring(1, tmp.length());
+                if (tmp.length() == 0) {
+                    return -1;
+                }
+                removed++;
+            }
+            //System.out.println("after remove: tmp=" + tmp);
+
+        }
+        return -1;
+    }
+
+
+    public String replaceVariable(String expr, String oldVariable, String newVariable) {
+        if (oldVariable.compareTo(newVariable) == 0) {
+            return expr;
+        }
+        int index;
+        String tmp = expr;
+
+        while ((index = indexOfVariable(tmp, oldVariable)) > -1) {
+            String tmp1 = "";
+            if (index > 0) {
+                tmp1 = tmp.substring(0, index);
+            }
+            tmp1 += newVariable;
+            tmp1 += tmp.substring(index + oldVariable.length(), tmp.length());
+            tmp = tmp1;
+        }
+
+        return tmp;
+    }
+
+
 
 /** Cup generated class to encapsulate user supplied action code.*/
 class CUP$IBSStdParser$actions {
diff --git a/src/main/java/myutil/intboolsolver/javacup/IBSStdLexer.jflex b/src/main/java/myutil/intboolsolver/javacup/IBSStdLexer.jflex
index 119873a5eb..e7211054b1 100644
--- a/src/main/java/myutil/intboolsolver/javacup/IBSStdLexer.jflex
+++ b/src/main/java/myutil/intboolsolver/javacup/IBSStdLexer.jflex
@@ -14,24 +14,24 @@ import java.util.HashSet;
 %yylexthrow Exception
 
 %{
-private IBSStdAttributeClass<Spec,Comp,State,SpecState,CompState> attrC;
+private IBSAttributeClass<Spec,Comp,State,SpecState,CompState> attrC;
 private IBSExpressionClass<Spec,Comp,State,SpecState,CompState> exprC;
 private final HashSet<String> badIdents = new HashSet<String>();
 
 public IBSStdLexer(){}
-public void setAttributeClass( IBSStdAttributeClass<Spec,Comp,State,SpecState,CompState> _attrC) { attrC = _attrC; }
-public IBSStdAttributeClass<Spec,Comp,State,SpecState,CompState> getAttributeClass() { return attrC; }
+public void setAttributeClass( IBSAttributeClass<Spec,Comp,State,SpecState,CompState> _attrC) { attrC = _attrC; }
+public IBSAttributeClass<Spec,Comp,State,SpecState,CompState> getAttributeClass() { return attrC; }
 public void setExpressionClass( IBSExpressionClass<Spec,Comp,State,SpecState,CompState> _exprC) { exprC = _exprC; }
 public IBSExpressionClass<Spec,Comp,State,SpecState,CompState> getExpressionClass() { return exprC; }
 public HashSet<String> getBadIdents() { return badIdents; }
 public void clearBadIdents() { badIdents.clear(); }
 
 private abstract class AttrHandler {
-    public abstract IBSStdAttributeClass<Spec,Comp,State,SpecState,CompState>.TypedAttribute getTypedAttribute(String _s) throws Exception;
+    public abstract IBSAttributeClass<Spec,Comp,State,SpecState,CompState>.TypedAttribute getTypedAttribute(String _s) throws Exception;
 }
 private class ClosedAttrHandler extends AttrHandler {
     ClosedAttrHandler(){};
-    public IBSStdAttributeClass<Spec,Comp,State,SpecState,CompState>.TypedAttribute getTypedAttribute(String _s)
+    public IBSAttributeClass<Spec,Comp,State,SpecState,CompState>.TypedAttribute getTypedAttribute(String _s)
        throws Exception {
         badIdents.add(_s); throw new Exception ("Ident in closed expression: " +  _s);
     }
@@ -39,14 +39,14 @@ private class ClosedAttrHandler extends AttrHandler {
 private class SpecAttrHandler extends AttrHandler {
     private Spec spec;
     SpecAttrHandler(Spec _spec){ spec = _spec; }
-    public IBSStdAttributeClass<Spec,Comp,State,SpecState,CompState>.TypedAttribute getTypedAttribute(String _s){
+    public IBSAttributeClass<Spec,Comp,State,SpecState,CompState>.TypedAttribute getTypedAttribute(String _s){
         return attrC.getTypedAttribute(spec,_s);
     }
 }
 private class CompAttrHandler extends AttrHandler {
     private Comp comp;
     CompAttrHandler(Comp _comp){ comp = _comp; }
-    public IBSStdAttributeClass<Spec,Comp,State,SpecState,CompState>.TypedAttribute getTypedAttribute(String _s){
+    public IBSAttributeClass<Spec,Comp,State,SpecState,CompState>.TypedAttribute getTypedAttribute(String _s){
         return attrC.getTypedAttribute(comp,_s);
     }
 }
@@ -93,14 +93,14 @@ Identifier = [a-zA-Z_][a-zA-Z0-9_\.]*
  ">="           { return new Symbol(IBSStdParserSym.GEQ); }
  "("            { return new Symbol(IBSStdParserSym.LPAR); }
  ")"            { return new Symbol(IBSStdParserSym.RPAR); }
- {Identifier}   { IBSStdAttributeClass<Spec,Comp,State,SpecState,CompState>.TypedAttribute attr =
+ {Identifier}   { IBSAttributeClass<Spec,Comp,State,SpecState,CompState>.TypedAttribute attr =
                       attrHandler.getTypedAttribute(yytext());
                   switch(attr.getType()) {
-                      case IBSStdAttributeClass.NullAttr : badIdents.add(yytext()); throw new Exception ("Bad Ident : " +  yytext());
-                      case IBSStdAttributeClass.BoolConst : return new Symbol(IBSStdParserSym.BOOL, Integer.valueOf(exprC.make_bConst(attr.getConstant()!=0)));
-                      case IBSStdAttributeClass.IntConst : return new Symbol(IBSStdParserSym.INT, Integer.valueOf(exprC.make_iConst(attr.getConstant())));
-                      case IBSStdAttributeClass.BoolAttr : return new Symbol(IBSStdParserSym.BOOL, Integer.valueOf(exprC.make_bVar(attr.getAttribute())));
-                      case IBSStdAttributeClass.IntAttr : return new Symbol(IBSStdParserSym.INT, Integer.valueOf(exprC.make_iVar(attr.getAttribute())));
+                      case IBSAttributeClass.NullAttr : badIdents.add(yytext()); throw new Exception ("Bad Ident : " +  yytext());
+                      case IBSAttributeClass.BoolConst : return new Symbol(IBSStdParserSym.BOOL, Integer.valueOf(exprC.make_bConst(attr.getConstant()!=0)));
+                      case IBSAttributeClass.IntConst : return new Symbol(IBSStdParserSym.INT, Integer.valueOf(exprC.make_iConst(attr.getConstant())));
+                      case IBSAttributeClass.BoolAttr : return new Symbol(IBSStdParserSym.BOOL, Integer.valueOf(exprC.make_bVar(attr.getAttribute())));
+                      case IBSAttributeClass.IntAttr : return new Symbol(IBSStdParserSym.INT, Integer.valueOf(exprC.make_iVar(attr.getAttribute())));
                       default : throw new Error ("Lexer, BUG : bad attribute type");
                   }
                 }
diff --git a/src/main/java/myutil/intboolsolver/javacup/IBSStdParser.jcup b/src/main/java/myutil/intboolsolver/javacup/IBSStdParser.jcup
index 9c994c47e0..57896f8647 100644
--- a/src/main/java/myutil/intboolsolver/javacup/IBSStdParser.jcup
+++ b/src/main/java/myutil/intboolsolver/javacup/IBSStdParser.jcup
@@ -15,9 +15,9 @@ parser code {:
     
     public void setLexer(IBSStdLexer<Spec,Comp,State,SpecState,CompState> _lexer){ lexer=_lexer; setScanner(_lexer); }
 
-    public void setAttributeClass(IBSStdAttributeClass<Spec,Comp,State,SpecState,CompState> _c){ lexer.setAttributeClass(_c); }
+    public void setAttributeClass(IBSAttributeClass<Spec,Comp,State,SpecState,CompState> _c){ lexer.setAttributeClass(_c); }
 
-    public IBSStdAttributeClass<Spec,Comp,State,SpecState,CompState> getAttributeClass(){ return lexer.getAttributeClass(); }
+    public IBSAttributeClass<Spec,Comp,State,SpecState,CompState> getAttributeClass(){ return lexer.getAttributeClass(); }
 
     public void setExpressionClass(IBSExpressionClass<Spec,Comp,State,SpecState,CompState> _c){ lexer.setExpressionClass(_c); }
 
@@ -94,6 +94,77 @@ parser code {:
         // if (index==-1) syntaxError=true; else syntaxError=false;
         return null;
     }
+
+    // A DEPLACER ...
+
+    public int indexOfVariable(String expr, String variable) {
+        int index;
+        String tmp = expr;
+        int removed = 0;
+        //System.out.println("\nHandling expr: " + expr);
+
+        while ((index = tmp.indexOf(variable)) > -1) {
+            char c1, c2;
+            if (index > 0) {
+                c1 = tmp.charAt(index - 1);
+            } else {
+                c1 = ' ';
+            }
+
+            if (index + variable.length() < tmp.length())
+                c2 = tmp.charAt(index + variable.length());
+            else
+                c2 = ' ';
+
+            //System.out.println("tmp=" + tmp + " c1=" + c1 + " c2=" + c2);
+
+            if (!(Character.isLetterOrDigit(c1) || (c1 == '_'))) {
+                if (!(Character.isLetterOrDigit(c2) || (c2 == '_'))) {
+                    //System.out.println("Found at index=" + index + " returnedIndex=" + (index+removed));
+                    return index + removed;
+                }
+            }
+            tmp = tmp.substring(index + variable.length(), tmp.length());
+            //System.out.println("tmp=" + tmp);
+            removed = index + variable.length();
+            if (tmp.length() == 0) {
+                return -1;
+            }
+            // We cut until we find a non alphanumerical character
+            while (Character.isLetterOrDigit(tmp.charAt(0)) || (tmp.charAt(0) == '_')) {
+                tmp = tmp.substring(1, tmp.length());
+                if (tmp.length() == 0) {
+                    return -1;
+                }
+                removed++;
+            }
+            //System.out.println("after remove: tmp=" + tmp);
+
+        }
+        return -1;
+    }
+
+
+    public String replaceVariable(String expr, String oldVariable, String newVariable) {
+        if (oldVariable.compareTo(newVariable) == 0) {
+            return expr;
+        }
+        int index;
+        String tmp = expr;
+
+        while ((index = indexOfVariable(tmp, oldVariable)) > -1) {
+            String tmp1 = "";
+            if (index > 0) {
+                tmp1 = tmp.substring(0, index);
+            }
+            tmp1 += newVariable;
+            tmp1 += tmp.substring(index + oldVariable.length(), tmp.length());
+            tmp = tmp1;
+        }
+
+        return tmp;
+    }
+
 :}
 
 
diff --git a/src/main/java/myutil/intboolsolver/javacup/test.tgz b/src/main/java/myutil/intboolsolver/javacup/test.tgz
deleted file mode 100644
index 3af7ff39682d0d9e7298327feafd63bfb2ba99ed..0000000000000000000000000000000000000000
GIT binary patch
literal 0
HcmV?d00001

literal 2156
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
Sfe(!z<C~g47cc}cFaQ7reMv0<

diff --git a/tiftranslator/build.gradle b/tiftranslator/build.gradle
index ba45b1d91d..36c3422678 100644
--- a/tiftranslator/build.gradle
+++ b/tiftranslator/build.gradle
@@ -17,6 +17,7 @@ sourceSets {
 }
 
 dependencies {
+    implementation name: 'java_cup'
     compileOnly name: 'commons-io-2.5'
     compileOnly name: 'jsoup-1.8.1'
     compileOnly name: 'commons-codec-1.10'
diff --git a/tmltranslator/build.gradle b/tmltranslator/build.gradle
index 91195ae974..61d653a683 100644
--- a/tmltranslator/build.gradle
+++ b/tmltranslator/build.gradle
@@ -10,6 +10,7 @@ sourceSets {
 }
 
 dependencies {
+    implementation name: 'java_cup'
     compileOnly name: 'opencloud'
     compileOnly name: 'JavaPlot'
     compileOnly name: 'derbynet'
diff --git a/ttool-cli/build.gradle b/ttool-cli/build.gradle
index a5e309691b..681b99068f 100644
--- a/ttool-cli/build.gradle
+++ b/ttool-cli/build.gradle
@@ -19,6 +19,7 @@ sourceSets {
 }
 
 dependencies {
+    implementation name: 'java_cup'
     implementation name: 'opencloud'
     implementation name: 'JavaPlot'
     implementation name: 'derbynet'
diff --git a/ttool/src/test/java/avatartranslator/AvatarIBSParserTest.java b/ttool/src/test/java/avatartranslator/AvatarIBSOriginParserTest.java
similarity index 98%
rename from ttool/src/test/java/avatartranslator/AvatarIBSParserTest.java
rename to ttool/src/test/java/avatartranslator/AvatarIBSOriginParserTest.java
index 98f149e71f..68af7a033f 100644
--- a/ttool/src/test/java/avatartranslator/AvatarIBSParserTest.java
+++ b/ttool/src/test/java/avatartranslator/AvatarIBSOriginParserTest.java
@@ -44,7 +44,7 @@
  */
 package avatartranslator;
 import avatartranslator.intboolsolver.AvatarIBSExpressionClass;
-import avatartranslator.intboolsolver.AvatarIBSParser;
+import avatartranslator.intboolsolver.AvatarIBSOriginParser;
 import avatartranslator.intboolsolver.AvatarIBSAttributeClass;
 import avatartranslator.modelchecker.SpecificationBlock;
 import avatartranslator.modelchecker.SpecificationState;
@@ -56,15 +56,15 @@ import java.util.ArrayList;
 
 import static org.junit.Assert.*;
 
-public class AvatarIBSParserTest {
+public class AvatarIBSOriginParserTest {
 
     private AvatarSpecification as;
     private AvatarBlock block1, block2;
     private AvatarIBSAttributeClass attC = new AvatarIBSAttributeClass();
     private AvatarIBSExpressionClass expr = new AvatarIBSExpressionClass();
 
-    private AvatarIBSParser parser = new AvatarIBSParser(attC,expr);
-    public AvatarIBSParserTest() {
+    private AvatarIBSOriginParser parser = new AvatarIBSOriginParser(attC,expr);
+    public AvatarIBSOriginParserTest() {
     }
     
     @Before
diff --git a/webcrawler/client/build.gradle b/webcrawler/client/build.gradle
index c8b3d8c5b5..389fdee413 100644
--- a/webcrawler/client/build.gradle
+++ b/webcrawler/client/build.gradle
@@ -12,6 +12,7 @@ sourceSets {
 }
 
 dependencies {
+    implementation name: 'java_cup'
     compileOnly name: 'commons-codec-1.10'
     compileOnly name: 'jsoup-1.8.1'
     compileOnly name: 'commons-io-2.5'
diff --git a/webcrawler/server/build.gradle b/webcrawler/server/build.gradle
index 9ee6566d14..98cf4fc26e 100644
--- a/webcrawler/server/build.gradle
+++ b/webcrawler/server/build.gradle
@@ -12,6 +12,7 @@ sourceSets {
 }
 
 dependencies {
+    implementation name: 'java_cup'
     compileOnly name: 'commons-codec-1.10'
     compileOnly name: 'jsoup-1.8.1'
     implementation name: 'commons-io-2.5'
-- 
GitLab