diff --git a/src/main/java/myutil/intboolsolver/IBSScanner.java b/src/main/java/myutil/intboolsolver/IBSScanner.java
new file mode 100644
index 0000000000000000000000000000000000000000..dafd9a00a0515e83fa7b8878a8a9665cec28e660
--- /dev/null
+++ b/src/main/java/myutil/intboolsolver/IBSScanner.java
@@ -0,0 +1,15 @@
+package myutil.intboolsolver;
+import java.util.HashSet;
+
+public interface IBSScanner< Spec extends IBSParamSpec, Comp extends IBSParamComp, State extends IBSParamState, SpecState extends IBSParamSpecState,
+        CompState extends IBSParamCompState > extends java_cup.runtime.Scanner {
+    public void setAttributeClass( IBSAttributeClass<Spec,Comp,State,SpecState,CompState> _attrC);
+    public IBSAttributeClass<Spec,Comp,State,SpecState,CompState> getAttributeClass();
+    public void setExpressionClass( IBSExpressionClass<Spec,Comp,State,SpecState,CompState> _exprC);
+    public IBSExpressionClass<Spec,Comp,State,SpecState,CompState> getExpressionClass();
+    public HashSet<String> getBadIdents();
+    public void clearBadIdents();
+    public void init(String _s) throws java.io.IOException;
+    public void init(Spec _spec, String _s) throws java.io.IOException;
+    public void init(Comp _comp, String _s) throws java.io.IOException;
+}
diff --git a/src/main/java/myutil/intboolsolver/IBSStdLexer.java b/src/main/java/myutil/intboolsolver/IBSStdLexer.java
index 9b7d3b17a821f0bc334a65d4b755c38753bde9b7..4b5ef55fb9f6345c36a9fa2208780e77cd1136a8 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 06/04/2023 17:36 */
+/* The following code was generated by JFlex 1.4.3 on 11/04/2023 12:46 */
 
 package myutil.intboolsolver;
 import java_cup.runtime.*;
@@ -8,10 +8,10 @@ import java.util.HashSet;
 /**
  * This class is a scanner generated by 
  * <a href="http://www.jflex.de/">JFlex</a> 1.4.3
- * on 06/04/2023 17:36 from the specification file
- * <tt>IBSStdLexer.jflex</tt>
+ * on 11/04/2023 12:46 from the specification file
+ * <tt>__tmplexer2.jflex</tt>
  */
-public class IBSStdLexer< Spec extends IBSParamSpec, Comp extends IBSParamComp, State extends IBSParamState, SpecState extends IBSParamSpecState, CompState extends IBSParamCompState > implements java_cup.runtime.Scanner {
+public class IBSStdLexer< Spec extends IBSParamSpec, Comp extends IBSParamComp, State extends IBSParamState, SpecState extends IBSParamSpecState, CompState extends IBSParamCompState > implements IBSScanner<Spec, Comp, State, SpecState, CompState>, java_cup.runtime.Scanner {
 
   /** This character denotes the end of file */
   public static final int YYEOF = -1;
@@ -299,7 +299,7 @@ public void init(Comp _comp, String _s) throws java.io.IOException { attrHandler
    *
    * @param   in  the java.io.Reader to read input from.
    */
-  IBSStdLexer(java.io.Reader in) {
+  public IBSStdLexer(java.io.Reader in) {
     this.zzReader = in;
   }
 
@@ -309,7 +309,7 @@ public void init(Comp _comp, String _s) throws java.io.IOException { attrHandler
    *
    * @param   in  the java.io.Inputstream to read input from.
    */
-  IBSStdLexer(java.io.InputStream in) {
+  public IBSStdLexer(java.io.InputStream in) {
     this(new java.io.InputStreamReader(in));
   }
 
@@ -602,102 +602,102 @@ public void init(Comp _comp, String _s) throws java.io.IOException { attrHandler
       zzMarkedPos = zzMarkedPosL;
 
       switch (zzAction < 0 ? zzAction : ZZ_ACTION[zzAction]) {
-        case 16: 
-          { return new Symbol(IBSStdParserSym.DIF);
+        case 21: 
+          { return new Symbol(IBSStdSymbol.BOOL, Integer.valueOf(exprC.make_bConst(false)));
           }
         case 24: break;
-        case 23: 
-          { yybegin(INTBOOL); return new Symbol(IBSStdParserSym.PARSE_INT);
+        case 4: 
+          { return new Symbol(IBSStdSymbol.PLUS);
           }
         case 25: break;
-        case 10: 
-          { return new Symbol(IBSStdParserSym.LT);
+        case 5: 
+          { return new Symbol(IBSStdSymbol.MINUS);
           }
         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 16: 
+          { return new Symbol(IBSStdSymbol.DIF);
           }
         case 27: break;
-        case 19: 
-          { return new Symbol(IBSStdParserSym.GEQ);
+        case 13: 
+          { return new Symbol(IBSStdSymbol.RPAR);
           }
         case 28: break;
-        case 8: 
-          { return new Symbol(IBSStdParserSym.MOD);
+        case 11: 
+          { return new Symbol(IBSStdSymbol.GT);
           }
         case 29: break;
-        case 11: 
-          { return new Symbol(IBSStdParserSym.GT);
+        case 17: 
+          { return new Symbol(IBSStdSymbol.EQ);
           }
         case 30: break;
-        case 18: 
-          { return new Symbol(IBSStdParserSym.LEQ);
+        case 2: 
+          { try { return new Symbol(IBSStdSymbol.INT, Integer.valueOf(exprC.make_iConst(Integer.parseInt(yytext()))));}
+                  catch (NumberFormatException nfe) { throw new Exception ("Lexer : Integer Format : " + yytext()); }
           }
         case 31: break;
-        case 17: 
-          { return new Symbol(IBSStdParserSym.EQ);
+        case 14: 
+          { return new Symbol(IBSStdSymbol.OR);
           }
         case 32: break;
-        case 14: 
-          { return new Symbol(IBSStdParserSym.OR);
+        case 6: 
+          { return new Symbol(IBSStdSymbol.MULT);
           }
         case 33: break;
-        case 4: 
-          { return new Symbol(IBSStdParserSym.PLUS);
+        case 19: 
+          { return new Symbol(IBSStdSymbol.GEQ);
           }
         case 34: break;
-        case 21: 
-          { return new Symbol(IBSStdParserSym.BOOL, Integer.valueOf(exprC.make_bConst(false)));
+        case 8: 
+          { return new Symbol(IBSStdSymbol.MOD);
           }
         case 35: break;
-        case 13: 
-          { return new Symbol(IBSStdParserSym.RPAR);
+        case 12: 
+          { return new Symbol(IBSStdSymbol.LPAR);
           }
         case 36: break;
-        case 5: 
-          { return new Symbol(IBSStdParserSym.MINUS);
+        case 18: 
+          { return new Symbol(IBSStdSymbol.LEQ);
           }
         case 37: break;
         case 22: 
-          { yybegin(INTBOOL); return new Symbol(IBSStdParserSym.PARSE_BOOL);
+          { yybegin(INTBOOL); return new Symbol(IBSStdSymbol.PARSE_BOOL);
           }
         case 38: break;
-        case 15: 
-          { return new Symbol(IBSStdParserSym.AND);
+        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(IBSStdSymbol.BOOL, Integer.valueOf(exprC.make_bConst(attr.getConstant()!=0)));
+                      case IBSAttributeClass.IntConst : return new Symbol(IBSStdSymbol.INT, Integer.valueOf(exprC.make_iConst(attr.getConstant())));
+                      case IBSAttributeClass.BoolAttr : return new Symbol(IBSStdSymbol.BOOL, Integer.valueOf(exprC.make_bVar(attr.getAttribute())));
+                      case IBSAttributeClass.IntAttr : return new Symbol(IBSStdSymbol.INT, Integer.valueOf(exprC.make_iVar(attr.getAttribute())));
+                      default : throw new Error ("Lexer, BUG : bad attribute type");
+                  }
           }
         case 39: break;
-        case 9: 
-          { return new Symbol(IBSStdParserSym.NOT);
+        case 20: 
+          { return new Symbol(IBSStdSymbol.BOOL, Integer.valueOf(exprC.make_bConst(true)));
           }
         case 40: break;
-        case 7: 
-          { return new Symbol(IBSStdParserSym.DIV);
+        case 15: 
+          { return new Symbol(IBSStdSymbol.AND);
           }
         case 41: break;
-        case 6: 
-          { return new Symbol(IBSStdParserSym.MULT);
+        case 9: 
+          { return new Symbol(IBSStdSymbol.NOT);
           }
         case 42: break;
-        case 12: 
-          { return new Symbol(IBSStdParserSym.LPAR);
+        case 23: 
+          { yybegin(INTBOOL); return new Symbol(IBSStdSymbol.PARSE_INT);
           }
         case 43: break;
-        case 20: 
-          { return new Symbol(IBSStdParserSym.BOOL, Integer.valueOf(exprC.make_bConst(true)));
+        case 7: 
+          { return new Symbol(IBSStdSymbol.DIV);
           }
         case 44: break;
-        case 2: 
-          { try { return new Symbol(IBSStdParserSym.INT, Integer.valueOf(exprC.make_iConst(Integer.parseInt(yytext()))));}
-                  catch (NumberFormatException nfe) { throw new Exception ("Lexer : Integer Format : " + yytext()); }
+        case 10: 
+          { return new Symbol(IBSStdSymbol.LT);
           }
         case 45: break;
         case 1: 
@@ -708,7 +708,7 @@ public void init(Comp _comp, String _s) throws java.io.IOException { attrHandler
           if (zzInput == YYEOF && zzStartRead == zzCurrentPos) {
             zzAtEOF = true;
             zzDoEOF();
-              {    return new java_cup.runtime.Symbol(IBSStdParserSym.EOF);
+              {    return new java_cup.runtime.Symbol(IBSStdSymbol.EOF);
  }
           } 
           else {
diff --git a/src/main/java/myutil/intboolsolver/IBSStdParser.java b/src/main/java/myutil/intboolsolver/IBSStdParser.java
index a87ce5b9930e2ab80decedde9ad4b8e02c411f02..94198fc7938c54cfb7b51bcdac818db0680c3514 100644
--- a/src/main/java/myutil/intboolsolver/IBSStdParser.java
+++ b/src/main/java/myutil/intboolsolver/IBSStdParser.java
@@ -16,7 +16,7 @@ public class IBSStdParser< Spec extends IBSParamSpec, Comp extends IBSParamComp,
 
  @Override
  public final Class<?> getSymbolContainer() {
-    return IBSStdParserSym.class;
+    return IBSStdSymbol.class;
 }
 
   /** Default constructor. */
@@ -33,16 +33,14 @@ public class IBSStdParser< Spec extends IBSParamSpec, Comp extends IBSParamComp,
   /** Production table. */
   protected static final short _production_table[][] = 
     unpackFromStrings(new String[] {
-    "\000\035\000\002\002\004\000\002\002\004\000\002\002" +
-    "\004\000\002\003\003\000\002\003\005\000\002\003\005" +
+    "\000\030\000\002\002\004\000\002\002\004\000\002\002" +
+    "\004\000\002\003\005\000\002\003\005\000\002\003\005" +
+    "\000\002\003\005\000\002\003\005\000\002\003\005\000" +
+    "\002\003\004\000\002\003\003\000\002\004\005\000\002" +
+    "\004\005\000\002\004\003\000\002\004\005\000\002\004" +
+    "\004\000\002\004\005\000\002\004\005\000\002\004\005" +
     "\000\002\004\005\000\002\004\005\000\002\004\005\000" +
-    "\002\004\003\000\002\005\003\000\002\005\005\000\002" +
-    "\005\004\000\002\006\005\000\002\006\003\000\002\007" +
-    "\005\000\002\007\003\000\002\010\003\000\002\010\003" +
-    "\000\002\010\005\000\002\010\004\000\002\011\005\000" +
-    "\002\011\005\000\002\011\005\000\002\011\005\000\002" +
-    "\011\005\000\002\011\005\000\002\011\005\000\002\011" +
-    "\005" });
+    "\002\004\005\000\002\004\005" });
 
   /** Access to production table. */
   @Override
@@ -51,82 +49,77 @@ public class IBSStdParser< Spec extends IBSParamSpec, Comp extends IBSParamComp,
   /** Parse-action table. */
   protected static final short[][] _action_table = 
     unpackFromStrings(new String[] {
-    "\000\071\000\006\024\004\025\005\001\002\000\010\005" +
-    "\010\022\027\026\012\001\002\000\014\005\010\021\021" +
-    "\022\015\026\012\027\013\001\002\000\004\002\007\001" +
-    "\002\000\004\002\000\001\002\000\010\005\010\022\027" +
-    "\026\012\001\002\000\016\002\ufff1\011\ufff1\012\ufff1\013" +
-    "\ufff1\014\ufff1\023\ufff1\001\002\000\040\002\ufff7\004\ufff7" +
-    "\005\ufff7\006\ufff7\007\ufff7\010\ufff7\011\ufff7\012\ufff7\013" +
-    "\ufff7\014\ufff7\015\ufff7\016\ufff7\017\ufff7\020\ufff7\023\ufff7" +
-    "\001\002\000\016\002\ufff0\011\ufff0\012\ufff0\013\ufff0\014" +
-    "\ufff0\023\ufff0\001\002\000\012\002\001\012\044\013\043" +
-    "\014\042\001\002\000\014\005\010\021\021\022\015\026" +
-    "\012\027\013\001\002\000\040\002\ufff8\004\ufff8\005\ufff8" +
+    "\000\063\000\006\025\004\026\005\001\002\000\010\005" +
+    "\014\022\020\027\016\001\002\000\014\005\014\021\012" +
+    "\022\013\027\016\030\015\001\002\000\004\002\007\001" +
+    "\002\000\004\002\000\001\002\000\030\004\024\005\025" +
+    "\006\023\007\026\010\022\013\051\014\050\015\054\016" +
+    "\052\017\055\020\053\001\002\000\014\002\001\011\041" +
+    "\012\042\013\037\014\040\001\002\000\014\005\014\021" +
+    "\012\022\013\027\016\030\015\001\002\000\014\005\014" +
+    "\021\012\022\013\027\016\030\015\001\002\000\010\005" +
+    "\014\022\020\027\016\001\002\000\016\002\ufff4\011\ufff4" +
+    "\012\ufff4\013\ufff4\014\ufff4\023\ufff4\001\002\000\040\002" +
+    "\ufff7\004\ufff7\005\ufff7\006\ufff7\007\ufff7\010\ufff7\011\ufff7" +
+    "\012\ufff7\013\ufff7\014\ufff7\015\ufff7\016\ufff7\017\ufff7\020" +
+    "\ufff7\023\ufff7\001\002\000\040\002\ufff8\004\ufff8\005\ufff8" +
     "\006\ufff8\007\ufff8\010\ufff8\011\ufff8\012\ufff8\013\ufff8\014" +
     "\ufff8\015\ufff8\016\ufff8\017\ufff8\020\ufff8\023\ufff8\001\002" +
-    "\000\016\002\ufff3\011\047\012\ufff3\013\ufff3\014\ufff3\023" +
-    "\ufff3\001\002\000\022\004\032\005\033\013\053\014\054" +
-    "\015\055\016\056\017\060\020\057\001\002\000\014\005" +
-    "\010\021\021\022\015\026\012\027\013\001\002\000\040" +
-    "\002\ufffe\004\ufffe\005\ufffe\006\025\007\026\010\024\011" +
-    "\ufffe\012\ufffe\013\ufffe\014\ufffe\015\ufffe\016\ufffe\017\ufffe" +
-    "\020\ufffe\023\ufffe\001\002\000\016\002\uffef\011\uffef\012" +
-    "\uffef\013\uffef\014\uffef\023\uffef\001\002\000\010\005\010" +
-    "\022\027\026\012\001\002\000\010\005\010\022\027\026" +
-    "\012\001\002\000\010\005\010\022\027\026\012\001\002" +
-    "\000\010\005\010\022\027\026\012\001\002\000\040\002" +
-    "\ufffa\004\ufffa\005\ufffa\006\ufffa\007\ufffa\010\ufffa\011\ufffa" +
-    "\012\ufffa\013\ufffa\014\ufffa\015\ufffa\016\ufffa\017\ufffa\020" +
-    "\ufffa\023\ufffa\001\002\000\010\004\032\005\033\023\034" +
-    "\001\002\000\010\005\010\022\027\026\012\001\002\000" +
-    "\010\005\010\022\027\026\012\001\002\000\040\002\ufff6" +
-    "\004\ufff6\005\ufff6\006\ufff6\007\ufff6\010\ufff6\011\ufff6\012" +
-    "\ufff6\013\ufff6\014\ufff6\015\ufff6\016\ufff6\017\ufff6\020\ufff6" +
-    "\023\ufff6\001\002\000\040\002\ufffc\004\ufffc\005\ufffc\006" +
-    "\025\007\026\010\024\011\ufffc\012\ufffc\013\ufffc\014\ufffc" +
+    "\000\010\005\014\022\020\027\016\001\002\000\016\004" +
+    "\024\005\025\006\023\007\026\010\022\023\027\001\002" +
+    "\000\010\005\014\022\020\027\016\001\002\000\010\005" +
+    "\014\022\020\027\016\001\002\000\010\005\014\022\020" +
+    "\027\016\001\002\000\010\005\014\022\020\027\016\001" +
+    "\002\000\010\005\014\022\020\027\016\001\002\000\040" +
+    "\002\ufff9\004\ufff9\005\ufff9\006\ufff9\007\ufff9\010\ufff9\011" +
+    "\ufff9\012\ufff9\013\ufff9\014\ufff9\015\ufff9\016\ufff9\017\ufff9" +
+    "\020\ufff9\023\ufff9\001\002\000\040\002\ufffb\004\ufffb\005" +
+    "\ufffb\006\ufffb\007\ufffb\010\ufffb\011\ufffb\012\ufffb\013\ufffb" +
+    "\014\ufffb\015\ufffb\016\ufffb\017\ufffb\020\ufffb\023\ufffb\001" +
+    "\002\000\040\002\ufffd\004\ufffd\005\ufffd\006\023\007\026" +
+    "\010\022\011\ufffd\012\ufffd\013\ufffd\014\ufffd\015\ufffd\016" +
+    "\ufffd\017\ufffd\020\ufffd\023\ufffd\001\002\000\040\002\ufffe" +
+    "\004\ufffe\005\ufffe\006\023\007\026\010\022\011\ufffe\012" +
+    "\ufffe\013\ufffe\014\ufffe\015\ufffe\016\ufffe\017\ufffe\020\ufffe" +
+    "\023\ufffe\001\002\000\040\002\ufffc\004\ufffc\005\ufffc\006" +
+    "\ufffc\007\ufffc\010\ufffc\011\ufffc\012\ufffc\013\ufffc\014\ufffc" +
     "\015\ufffc\016\ufffc\017\ufffc\020\ufffc\023\ufffc\001\002\000" +
-    "\040\002\ufffd\004\ufffd\005\ufffd\006\025\007\026\010\024" +
-    "\011\ufffd\012\ufffd\013\ufffd\014\ufffd\015\ufffd\016\ufffd\017" +
-    "\ufffd\020\ufffd\023\ufffd\001\002\000\040\002\ufffb\004\ufffb" +
-    "\005\ufffb\006\ufffb\007\ufffb\010\ufffb\011\ufffb\012\ufffb\013" +
-    "\ufffb\014\ufffb\015\ufffb\016\ufffb\017\ufffb\020\ufffb\023\ufffb" +
-    "\001\002\000\040\002\ufff9\004\ufff9\005\ufff9\006\ufff9\007" +
-    "\ufff9\010\ufff9\011\ufff9\012\ufff9\013\ufff9\014\ufff9\015\ufff9" +
-    "\016\ufff9\017\ufff9\020\ufff9\023\ufff9\001\002\000\016\002" +
-    "\uffed\011\uffed\012\uffed\013\043\014\042\023\uffed\001\002" +
-    "\000\014\005\010\021\021\022\015\026\012\027\013\001" +
-    "\002\000\014\005\010\021\021\022\015\026\012\027\013" +
-    "\001\002\000\014\005\010\021\021\022\015\026\012\027" +
-    "\013\001\002\000\010\012\044\013\043\014\042\001\002" +
-    "\000\016\002\ufff4\011\047\012\ufff4\013\ufff4\014\ufff4\023" +
-    "\ufff4\001\002\000\014\005\010\021\021\022\015\026\012" +
-    "\027\013\001\002\000\016\002\ufff2\011\ufff2\012\ufff2\013" +
-    "\ufff2\014\ufff2\023\ufff2\001\002\000\016\002\uffe6\011\uffe6" +
-    "\012\uffe6\013\uffe6\014\uffe6\023\uffe6\001\002\000\016\002" +
-    "\uffe5\011\uffe5\012\uffe5\013\uffe5\014\uffe5\023\uffe5\001\002" +
-    "\000\010\005\010\022\027\026\012\001\002\000\010\005" +
-    "\010\022\027\026\012\001\002\000\010\005\010\022\027" +
-    "\026\012\001\002\000\010\005\010\022\027\026\012\001" +
-    "\002\000\010\005\010\022\027\026\012\001\002\000\010" +
-    "\005\010\022\027\026\012\001\002\000\022\002\uffea\004" +
-    "\032\005\033\011\uffea\012\uffea\013\uffea\014\uffea\023\uffea" +
-    "\001\002\000\022\002\uffe9\004\032\005\033\011\uffe9\012" +
-    "\uffe9\013\uffe9\014\uffe9\023\uffe9\001\002\000\022\002\uffeb" +
-    "\004\032\005\033\011\uffeb\012\uffeb\013\uffeb\014\uffeb\023" +
-    "\uffeb\001\002\000\022\002\uffec\004\032\005\033\011\uffec" +
-    "\012\uffec\013\uffec\014\uffec\023\uffec\001\002\000\022\002" +
-    "\uffe7\004\032\005\033\011\uffe7\012\uffe7\013\uffe7\014\uffe7" +
-    "\023\uffe7\001\002\000\022\002\uffe8\004\032\005\033\011" +
-    "\uffe8\012\uffe8\013\uffe8\014\uffe8\023\uffe8\001\002\000\012" +
-    "\012\044\013\043\014\042\023\071\001\002\000\024\004" +
-    "\032\005\033\013\053\014\054\015\055\016\056\017\060" +
-    "\020\057\023\034\001\002\000\016\002\uffee\011\uffee\012" +
-    "\uffee\013\uffee\014\uffee\023\uffee\001\002\000\040\002\ufff5" +
-    "\004\ufff5\005\ufff5\006\ufff5\007\ufff5\010\ufff5\011\ufff5\012" +
-    "\ufff5\013\ufff5\014\ufff5\015\ufff5\016\ufff5\017\ufff5\020\ufff5" +
-    "\023\ufff5\001\002\000\010\002\uffff\004\032\005\033\001" +
-    "\002" });
+    "\040\002\ufffa\004\ufffa\005\ufffa\006\ufffa\007\ufffa\010\ufffa" +
+    "\011\ufffa\012\ufffa\013\ufffa\014\ufffa\015\ufffa\016\ufffa\017" +
+    "\ufffa\020\ufffa\023\ufffa\001\002\000\032\004\024\005\025" +
+    "\006\023\007\026\010\022\013\051\014\050\015\054\016" +
+    "\052\017\055\020\053\023\027\001\002\000\014\011\041" +
+    "\012\042\013\037\014\040\023\043\001\002\000\014\005" +
+    "\014\021\012\022\013\027\016\030\015\001\002\000\014" +
+    "\005\014\021\012\022\013\027\016\030\015\001\002\000" +
+    "\014\005\014\021\012\022\013\027\016\030\015\001\002" +
+    "\000\014\005\014\021\012\022\013\027\016\030\015\001" +
+    "\002\000\016\002\ufff3\011\ufff3\012\ufff3\013\ufff3\014\ufff3" +
+    "\023\ufff3\001\002\000\016\002\ufff6\011\041\012\ufff6\013" +
+    "\037\014\040\023\ufff6\001\002\000\016\002\ufff5\011\ufff5" +
+    "\012\ufff5\013\037\014\040\023\ufff5\001\002\000\016\002" +
+    "\uffea\011\uffea\012\uffea\013\uffea\014\uffea\023\uffea\001\002" +
+    "\000\016\002\uffeb\011\uffeb\012\uffeb\013\uffeb\014\uffeb\023" +
+    "\uffeb\001\002\000\010\005\014\022\020\027\016\001\002" +
+    "\000\010\005\014\022\020\027\016\001\002\000\010\005" +
+    "\014\022\020\027\016\001\002\000\010\005\014\022\020" +
+    "\027\016\001\002\000\010\005\014\022\020\027\016\001" +
+    "\002\000\010\005\014\022\020\027\016\001\002\000\030" +
+    "\002\uffef\004\024\005\025\006\023\007\026\010\022\011" +
+    "\uffef\012\uffef\013\uffef\014\uffef\023\uffef\001\002\000\030" +
+    "\002\ufff1\004\024\005\025\006\023\007\026\010\022\011" +
+    "\ufff1\012\ufff1\013\ufff1\014\ufff1\023\ufff1\001\002\000\030" +
+    "\002\uffee\004\024\005\025\006\023\007\026\010\022\011" +
+    "\uffee\012\uffee\013\uffee\014\uffee\023\uffee\001\002\000\030" +
+    "\002\ufff0\004\024\005\025\006\023\007\026\010\022\011" +
+    "\ufff0\012\ufff0\013\ufff0\014\ufff0\023\ufff0\001\002\000\030" +
+    "\002\uffed\004\024\005\025\006\023\007\026\010\022\011" +
+    "\uffed\012\uffed\013\uffed\014\uffed\023\uffed\001\002\000\030" +
+    "\002\uffec\004\024\005\025\006\023\007\026\010\022\011" +
+    "\uffec\012\uffec\013\uffec\014\uffec\023\uffec\001\002\000\016" +
+    "\002\ufff2\011\ufff2\012\ufff2\013\037\014\040\023\ufff2\001" +
+    "\002\000\016\002\uffff\004\024\005\025\006\023\007\026" +
+    "\010\022\001\002" });
 
   /** Access to parse-action table. */
   @Override
@@ -135,35 +128,25 @@ public class IBSStdParser< Spec extends IBSParamSpec, Comp extends IBSParamComp,
   /** <code>reduce_goto</code> table. */
   protected static final short[][] _reduce_table = 
     unpackFromStrings(new String[] {
-    "\000\071\000\004\002\005\001\001\000\010\003\072\004" +
-    "\021\005\015\001\001\000\020\003\017\004\021\005\015" +
-    "\006\013\007\016\010\010\011\022\001\001\000\002\001" +
-    "\001\000\002\001\001\000\004\005\071\001\001\000\002" +
-    "\001\001\000\002\001\001\000\002\001\001\000\002\001" +
-    "\001\000\020\003\067\004\021\005\015\006\066\007\016" +
-    "\010\010\011\022\001\001\000\002\001\001\000\002\001" +
-    "\001\000\002\001\001\000\020\003\017\004\021\005\015" +
-    "\006\040\007\016\010\010\011\022\001\001\000\002\001" +
-    "\001\000\002\001\001\000\004\005\037\001\001\000\004" +
-    "\005\036\001\001\000\004\005\027\001\001\000\010\003" +
-    "\030\004\021\005\015\001\001\000\002\001\001\000\002" +
-    "\001\001\000\006\004\035\005\015\001\001\000\006\004" +
-    "\034\005\015\001\001\000\002\001\001\000\002\001\001" +
+    "\000\063\000\004\002\005\001\001\000\004\003\064\001" +
+    "\001\000\006\003\007\004\010\001\001\000\002\001\001" +
     "\000\002\001\001\000\002\001\001\000\002\001\001\000" +
-    "\002\001\001\000\020\003\017\004\021\005\015\006\051" +
-    "\007\016\010\010\011\022\001\001\000\020\003\017\004" +
-    "\021\005\015\006\050\007\016\010\010\011\022\001\001" +
-    "\000\020\003\017\004\021\005\015\006\044\007\045\010" +
-    "\010\011\022\001\001\000\002\001\001\000\002\001\001" +
-    "\000\020\003\017\004\021\005\015\006\044\007\016\010" +
-    "\047\011\022\001\001\000\002\001\001\000\002\001\001" +
-    "\000\002\001\001\000\010\003\065\004\021\005\015\001" +
-    "\001\000\010\003\064\004\021\005\015\001\001\000\010" +
-    "\003\063\004\021\005\015\001\001\000\010\003\062\004" +
-    "\021\005\015\001\001\000\010\003\061\004\021\005\015" +
-    "\001\001\000\010\003\060\004\021\005\015\001\001\000" +
+    "\006\003\007\004\063\001\001\000\006\003\034\004\035" +
+    "\001\001\000\004\003\016\001\001\000\002\001\001\000" +
+    "\002\001\001\000\002\001\001\000\004\003\020\001\001" +
+    "\000\002\001\001\000\004\003\033\001\001\000\004\003" +
+    "\032\001\001\000\004\003\031\001\001\000\004\003\030" +
+    "\001\001\000\004\003\027\001\001\000\002\001\001\000" +
     "\002\001\001\000\002\001\001\000\002\001\001\000\002" +
     "\001\001\000\002\001\001\000\002\001\001\000\002\001" +
+    "\001\000\006\003\007\004\046\001\001\000\006\003\007" +
+    "\004\045\001\001\000\006\003\007\004\044\001\001\000" +
+    "\006\003\007\004\043\001\001\000\002\001\001\000\002" +
+    "\001\001\000\002\001\001\000\002\001\001\000\002\001" +
+    "\001\000\004\003\062\001\001\000\004\003\061\001\001" +
+    "\000\004\003\060\001\001\000\004\003\057\001\001\000" +
+    "\004\003\056\001\001\000\004\003\055\001\001\000\002" +
+    "\001\001\000\002\001\001\000\002\001\001\000\002\001" +
     "\001\000\002\001\001\000\002\001\001\000\002\001\001" +
     "\000\002\001\001" });
 
@@ -212,9 +195,9 @@ public class IBSStdParser< Spec extends IBSParamSpec, Comp extends IBSParamComp,
 
 
 
-    IBSStdLexer<Spec,Comp,State,SpecState,CompState> lexer;
+    IBSScanner<Spec,Comp,State,SpecState,CompState> lexer;
     
-    public void setLexer(IBSStdLexer<Spec,Comp,State,SpecState,CompState> _lexer){ lexer=_lexer; setScanner(_lexer); }
+    public void setLexer(IBSScanner<Spec,Comp,State,SpecState,CompState> _lexer){ lexer=_lexer; setScanner(_lexer); }
 
     public void setAttributeClass(IBSAttributeClass<Spec,Comp,State,SpecState,CompState> _c){ lexer.setAttributeClass(_c); }
 
@@ -432,19 +415,7 @@ class CUP$IBSStdParser$actions {
           return CUP$IBSStdParser$result;
 
           /*. . . . . . . . . . . . . . . . . . . .*/
-          case 3: // iexpr ::= ifact 
-            {
-              Integer RESULT =null;
-		int eleft = (CUP$IBSStdParser$stack.peek()).left;
-		int eright = (CUP$IBSStdParser$stack.peek()).right;
-		Integer e = CUP$IBSStdParser$stack.peek().<Integer>value();
-		 RESULT = e; 
-              CUP$IBSStdParser$result = parser.getSymbolFactory().newSymbol("iexpr",1, CUP$IBSStdParser$stack.peek(), CUP$IBSStdParser$stack.peek(), RESULT);
-            }
-          return CUP$IBSStdParser$result;
-
-          /*. . . . . . . . . . . . . . . . . . . .*/
-          case 4: // iexpr ::= iexpr PLUS ifact 
+          case 3: // iexpr ::= iexpr PLUS iexpr 
             {
               Integer RESULT =null;
 		int lleft = (CUP$IBSStdParser$stack.elementAt(CUP$IBSStdParser$top-2)).left;
@@ -462,7 +433,7 @@ class CUP$IBSStdParser$actions {
           return CUP$IBSStdParser$result;
 
           /*. . . . . . . . . . . . . . . . . . . .*/
-          case 5: // iexpr ::= iexpr MINUS ifact 
+          case 4: // iexpr ::= iexpr MINUS iexpr 
             {
               Integer RESULT =null;
 		int lleft = (CUP$IBSStdParser$stack.elementAt(CUP$IBSStdParser$top-2)).left;
@@ -480,7 +451,7 @@ class CUP$IBSStdParser$actions {
           return CUP$IBSStdParser$result;
 
           /*. . . . . . . . . . . . . . . . . . . .*/
-          case 6: // ifact ::= ifact MULT iatom 
+          case 5: // iexpr ::= iexpr MULT iexpr 
             {
               Integer RESULT =null;
 		int lleft = (CUP$IBSStdParser$stack.elementAt(CUP$IBSStdParser$top-2)).left;
@@ -493,12 +464,12 @@ class CUP$IBSStdParser$actions {
          lexer.getExpressionClass().freeInt(l.intValue());
          lexer.getExpressionClass().freeInt(r.intValue());
       
-              CUP$IBSStdParser$result = parser.getSymbolFactory().newSymbol("ifact",2, CUP$IBSStdParser$stack.elementAt(CUP$IBSStdParser$top-2), CUP$IBSStdParser$stack.peek(), RESULT);
+              CUP$IBSStdParser$result = parser.getSymbolFactory().newSymbol("iexpr",1, CUP$IBSStdParser$stack.elementAt(CUP$IBSStdParser$top-2), CUP$IBSStdParser$stack.peek(), RESULT);
             }
           return CUP$IBSStdParser$result;
 
           /*. . . . . . . . . . . . . . . . . . . .*/
-          case 7: // ifact ::= ifact DIV iatom 
+          case 6: // iexpr ::= iexpr DIV iexpr 
             {
               Integer RESULT =null;
 		int lleft = (CUP$IBSStdParser$stack.elementAt(CUP$IBSStdParser$top-2)).left;
@@ -511,12 +482,12 @@ class CUP$IBSStdParser$actions {
          lexer.getExpressionClass().freeInt(l.intValue());
          lexer.getExpressionClass().freeInt(r.intValue());
       
-              CUP$IBSStdParser$result = parser.getSymbolFactory().newSymbol("ifact",2, CUP$IBSStdParser$stack.elementAt(CUP$IBSStdParser$top-2), CUP$IBSStdParser$stack.peek(), RESULT);
+              CUP$IBSStdParser$result = parser.getSymbolFactory().newSymbol("iexpr",1, CUP$IBSStdParser$stack.elementAt(CUP$IBSStdParser$top-2), CUP$IBSStdParser$stack.peek(), RESULT);
             }
           return CUP$IBSStdParser$result;
 
           /*. . . . . . . . . . . . . . . . . . . .*/
-          case 8: // ifact ::= ifact MOD iatom 
+          case 7: // iexpr ::= iexpr MOD iexpr 
             {
               Integer RESULT =null;
 		int lleft = (CUP$IBSStdParser$stack.elementAt(CUP$IBSStdParser$top-2)).left;
@@ -529,60 +500,48 @@ class CUP$IBSStdParser$actions {
          lexer.getExpressionClass().freeInt(l.intValue());
          lexer.getExpressionClass().freeInt(r.intValue());
       
-              CUP$IBSStdParser$result = parser.getSymbolFactory().newSymbol("ifact",2, CUP$IBSStdParser$stack.elementAt(CUP$IBSStdParser$top-2), CUP$IBSStdParser$stack.peek(), RESULT);
+              CUP$IBSStdParser$result = parser.getSymbolFactory().newSymbol("iexpr",1, CUP$IBSStdParser$stack.elementAt(CUP$IBSStdParser$top-2), CUP$IBSStdParser$stack.peek(), RESULT);
             }
           return CUP$IBSStdParser$result;
 
           /*. . . . . . . . . . . . . . . . . . . .*/
-          case 9: // ifact ::= iatom 
+          case 8: // iexpr ::= LPAR iexpr RPAR 
             {
               Integer RESULT =null;
-		int eleft = (CUP$IBSStdParser$stack.peek()).left;
-		int eright = (CUP$IBSStdParser$stack.peek()).right;
-		Integer e = CUP$IBSStdParser$stack.peek().<Integer>value();
+		int eleft = (CUP$IBSStdParser$stack.elementAt(CUP$IBSStdParser$top-1)).left;
+		int eright = (CUP$IBSStdParser$stack.elementAt(CUP$IBSStdParser$top-1)).right;
+		Integer e = CUP$IBSStdParser$stack.elementAt(CUP$IBSStdParser$top-1).<Integer>value();
 		 RESULT = e; 
-              CUP$IBSStdParser$result = parser.getSymbolFactory().newSymbol("ifact",2, CUP$IBSStdParser$stack.peek(), CUP$IBSStdParser$stack.peek(), RESULT);
+              CUP$IBSStdParser$result = parser.getSymbolFactory().newSymbol("iexpr",1, CUP$IBSStdParser$stack.elementAt(CUP$IBSStdParser$top-2), CUP$IBSStdParser$stack.peek(), RESULT);
             }
           return CUP$IBSStdParser$result;
 
           /*. . . . . . . . . . . . . . . . . . . .*/
-          case 10: // iatom ::= INT 
+          case 9: // iexpr ::= MINUS iexpr 
             {
               Integer RESULT =null;
 		int eleft = (CUP$IBSStdParser$stack.peek()).left;
 		int eright = (CUP$IBSStdParser$stack.peek()).right;
 		Integer e = CUP$IBSStdParser$stack.peek().<Integer>value();
-		 RESULT = e; 
-              CUP$IBSStdParser$result = parser.getSymbolFactory().newSymbol("iatom",3, CUP$IBSStdParser$stack.peek(), CUP$IBSStdParser$stack.peek(), RESULT);
-            }
-          return CUP$IBSStdParser$result;
-
-          /*. . . . . . . . . . . . . . . . . . . .*/
-          case 11: // iatom ::= LPAR iexpr RPAR 
-            {
-              Integer RESULT =null;
-		int eleft = (CUP$IBSStdParser$stack.elementAt(CUP$IBSStdParser$top-1)).left;
-		int eright = (CUP$IBSStdParser$stack.elementAt(CUP$IBSStdParser$top-1)).right;
-		Integer e = CUP$IBSStdParser$stack.elementAt(CUP$IBSStdParser$top-1).<Integer>value();
-		 RESULT = e; 
-              CUP$IBSStdParser$result = parser.getSymbolFactory().newSymbol("iatom",3, CUP$IBSStdParser$stack.elementAt(CUP$IBSStdParser$top-2), CUP$IBSStdParser$stack.peek(), RESULT);
+		 RESULT = Integer.valueOf(lexer.getExpressionClass().make_iNeg(e.intValue())); 
+              CUP$IBSStdParser$result = parser.getSymbolFactory().newSymbol("iexpr",1, CUP$IBSStdParser$stack.elementAt(CUP$IBSStdParser$top-1), CUP$IBSStdParser$stack.peek(), RESULT);
             }
           return CUP$IBSStdParser$result;
 
           /*. . . . . . . . . . . . . . . . . . . .*/
-          case 12: // iatom ::= MINUS iatom 
+          case 10: // iexpr ::= INT 
             {
               Integer RESULT =null;
 		int eleft = (CUP$IBSStdParser$stack.peek()).left;
 		int eright = (CUP$IBSStdParser$stack.peek()).right;
 		Integer e = CUP$IBSStdParser$stack.peek().<Integer>value();
-		 RESULT = Integer.valueOf(lexer.getExpressionClass().make_iNeg(e.intValue())); 
-              CUP$IBSStdParser$result = parser.getSymbolFactory().newSymbol("iatom",3, CUP$IBSStdParser$stack.elementAt(CUP$IBSStdParser$top-1), CUP$IBSStdParser$stack.peek(), RESULT);
+		 RESULT = e; 
+              CUP$IBSStdParser$result = parser.getSymbolFactory().newSymbol("iexpr",1, CUP$IBSStdParser$stack.peek(), CUP$IBSStdParser$stack.peek(), RESULT);
             }
           return CUP$IBSStdParser$result;
 
           /*. . . . . . . . . . . . . . . . . . . .*/
-          case 13: // bexpr ::= bexpr OR bfact 
+          case 11: // bexpr ::= bexpr OR bexpr 
             {
               Integer RESULT =null;
 		int lleft = (CUP$IBSStdParser$stack.elementAt(CUP$IBSStdParser$top-2)).left;
@@ -592,28 +551,15 @@ class CUP$IBSStdParser$actions {
 		int rright = (CUP$IBSStdParser$stack.peek()).right;
 		Integer r = CUP$IBSStdParser$stack.peek().<Integer>value();
 		 RESULT = Integer.valueOf(lexer.getExpressionClass().make_bbbOr(l.intValue(),r.intValue()));
-      System.out.println("BBOR: " + lexer.getExpressionClass().getBExpr(RESULT).toString());
          lexer.getExpressionClass().freeBool(l.intValue());
          lexer.getExpressionClass().freeBool(r.intValue());
       
-              CUP$IBSStdParser$result = parser.getSymbolFactory().newSymbol("bexpr",4, CUP$IBSStdParser$stack.elementAt(CUP$IBSStdParser$top-2), CUP$IBSStdParser$stack.peek(), RESULT);
+              CUP$IBSStdParser$result = parser.getSymbolFactory().newSymbol("bexpr",2, CUP$IBSStdParser$stack.elementAt(CUP$IBSStdParser$top-2), CUP$IBSStdParser$stack.peek(), RESULT);
             }
           return CUP$IBSStdParser$result;
 
           /*. . . . . . . . . . . . . . . . . . . .*/
-          case 14: // bexpr ::= bfact 
-            {
-              Integer RESULT =null;
-		int eleft = (CUP$IBSStdParser$stack.peek()).left;
-		int eright = (CUP$IBSStdParser$stack.peek()).right;
-		Integer e = CUP$IBSStdParser$stack.peek().<Integer>value();
-		 RESULT = e; 
-              CUP$IBSStdParser$result = parser.getSymbolFactory().newSymbol("bexpr",4, CUP$IBSStdParser$stack.peek(), CUP$IBSStdParser$stack.peek(), RESULT);
-            }
-          return CUP$IBSStdParser$result;
-
-          /*. . . . . . . . . . . . . . . . . . . .*/
-          case 15: // bfact ::= bfact AND batom 
+          case 12: // bexpr ::= bexpr AND bexpr 
             {
               Integer RESULT =null;
 		int lleft = (CUP$IBSStdParser$stack.elementAt(CUP$IBSStdParser$top-2)).left;
@@ -626,72 +572,48 @@ class CUP$IBSStdParser$actions {
          lexer.getExpressionClass().freeBool(l.intValue());
          lexer.getExpressionClass().freeBool(r.intValue());
       
-              CUP$IBSStdParser$result = parser.getSymbolFactory().newSymbol("bfact",5, CUP$IBSStdParser$stack.elementAt(CUP$IBSStdParser$top-2), CUP$IBSStdParser$stack.peek(), RESULT);
-            }
-          return CUP$IBSStdParser$result;
-
-          /*. . . . . . . . . . . . . . . . . . . .*/
-          case 16: // bfact ::= batom 
-            {
-              Integer RESULT =null;
-		int eleft = (CUP$IBSStdParser$stack.peek()).left;
-		int eright = (CUP$IBSStdParser$stack.peek()).right;
-		Integer e = CUP$IBSStdParser$stack.peek().<Integer>value();
-		 RESULT = e; 
-              CUP$IBSStdParser$result = parser.getSymbolFactory().newSymbol("bfact",5, CUP$IBSStdParser$stack.peek(), CUP$IBSStdParser$stack.peek(), RESULT);
-            }
-          return CUP$IBSStdParser$result;
-
-          /*. . . . . . . . . . . . . . . . . . . .*/
-          case 17: // batom ::= BOOL 
-            {
-              Integer RESULT =null;
-		int eleft = (CUP$IBSStdParser$stack.peek()).left;
-		int eright = (CUP$IBSStdParser$stack.peek()).right;
-		Integer e = CUP$IBSStdParser$stack.peek().<Integer>value();
-		 RESULT = e; 
-              CUP$IBSStdParser$result = parser.getSymbolFactory().newSymbol("batom",6, CUP$IBSStdParser$stack.peek(), CUP$IBSStdParser$stack.peek(), RESULT);
+              CUP$IBSStdParser$result = parser.getSymbolFactory().newSymbol("bexpr",2, CUP$IBSStdParser$stack.elementAt(CUP$IBSStdParser$top-2), CUP$IBSStdParser$stack.peek(), RESULT);
             }
           return CUP$IBSStdParser$result;
 
           /*. . . . . . . . . . . . . . . . . . . .*/
-          case 18: // batom ::= bcomp 
+          case 13: // bexpr ::= BOOL 
             {
               Integer RESULT =null;
 		int eleft = (CUP$IBSStdParser$stack.peek()).left;
 		int eright = (CUP$IBSStdParser$stack.peek()).right;
 		Integer e = CUP$IBSStdParser$stack.peek().<Integer>value();
 		 RESULT = e; 
-              CUP$IBSStdParser$result = parser.getSymbolFactory().newSymbol("batom",6, CUP$IBSStdParser$stack.peek(), CUP$IBSStdParser$stack.peek(), RESULT);
+              CUP$IBSStdParser$result = parser.getSymbolFactory().newSymbol("bexpr",2, CUP$IBSStdParser$stack.peek(), CUP$IBSStdParser$stack.peek(), RESULT);
             }
           return CUP$IBSStdParser$result;
 
           /*. . . . . . . . . . . . . . . . . . . .*/
-          case 19: // batom ::= LPAR bexpr RPAR 
+          case 14: // bexpr ::= LPAR bexpr RPAR 
             {
               Integer RESULT =null;
 		int eleft = (CUP$IBSStdParser$stack.elementAt(CUP$IBSStdParser$top-1)).left;
 		int eright = (CUP$IBSStdParser$stack.elementAt(CUP$IBSStdParser$top-1)).right;
 		Integer e = CUP$IBSStdParser$stack.elementAt(CUP$IBSStdParser$top-1).<Integer>value();
 		 RESULT = e; 
-              CUP$IBSStdParser$result = parser.getSymbolFactory().newSymbol("batom",6, CUP$IBSStdParser$stack.elementAt(CUP$IBSStdParser$top-2), CUP$IBSStdParser$stack.peek(), RESULT);
+              CUP$IBSStdParser$result = parser.getSymbolFactory().newSymbol("bexpr",2, CUP$IBSStdParser$stack.elementAt(CUP$IBSStdParser$top-2), CUP$IBSStdParser$stack.peek(), RESULT);
             }
           return CUP$IBSStdParser$result;
 
           /*. . . . . . . . . . . . . . . . . . . .*/
-          case 20: // batom ::= NOT bexpr 
+          case 15: // bexpr ::= NOT bexpr 
             {
               Integer RESULT =null;
 		int eleft = (CUP$IBSStdParser$stack.peek()).left;
 		int eright = (CUP$IBSStdParser$stack.peek()).right;
 		Integer e = CUP$IBSStdParser$stack.peek().<Integer>value();
 		 RESULT = Integer.valueOf(lexer.getExpressionClass().make_bNot(e.intValue())); 
-              CUP$IBSStdParser$result = parser.getSymbolFactory().newSymbol("batom",6, CUP$IBSStdParser$stack.elementAt(CUP$IBSStdParser$top-1), CUP$IBSStdParser$stack.peek(), RESULT);
+              CUP$IBSStdParser$result = parser.getSymbolFactory().newSymbol("bexpr",2, CUP$IBSStdParser$stack.elementAt(CUP$IBSStdParser$top-1), CUP$IBSStdParser$stack.peek(), RESULT);
             }
           return CUP$IBSStdParser$result;
 
           /*. . . . . . . . . . . . . . . . . . . .*/
-          case 21: // bcomp ::= iexpr LT iexpr 
+          case 16: // bexpr ::= iexpr LT iexpr 
             {
               Integer RESULT =null;
 		int lleft = (CUP$IBSStdParser$stack.elementAt(CUP$IBSStdParser$top-2)).left;
@@ -704,12 +626,12 @@ class CUP$IBSStdParser$actions {
          lexer.getExpressionClass().freeInt(l.intValue());
          lexer.getExpressionClass().freeInt(r.intValue());
       
-              CUP$IBSStdParser$result = parser.getSymbolFactory().newSymbol("bcomp",7, CUP$IBSStdParser$stack.elementAt(CUP$IBSStdParser$top-2), CUP$IBSStdParser$stack.peek(), RESULT);
+              CUP$IBSStdParser$result = parser.getSymbolFactory().newSymbol("bexpr",2, CUP$IBSStdParser$stack.elementAt(CUP$IBSStdParser$top-2), CUP$IBSStdParser$stack.peek(), RESULT);
             }
           return CUP$IBSStdParser$result;
 
           /*. . . . . . . . . . . . . . . . . . . .*/
-          case 22: // bcomp ::= iexpr GT iexpr 
+          case 17: // bexpr ::= iexpr GT iexpr 
             {
               Integer RESULT =null;
 		int lleft = (CUP$IBSStdParser$stack.elementAt(CUP$IBSStdParser$top-2)).left;
@@ -722,12 +644,12 @@ class CUP$IBSStdParser$actions {
          lexer.getExpressionClass().freeInt(l.intValue());
          lexer.getExpressionClass().freeInt(r.intValue());
       
-              CUP$IBSStdParser$result = parser.getSymbolFactory().newSymbol("bcomp",7, CUP$IBSStdParser$stack.elementAt(CUP$IBSStdParser$top-2), CUP$IBSStdParser$stack.peek(), RESULT);
+              CUP$IBSStdParser$result = parser.getSymbolFactory().newSymbol("bexpr",2, CUP$IBSStdParser$stack.elementAt(CUP$IBSStdParser$top-2), CUP$IBSStdParser$stack.peek(), RESULT);
             }
           return CUP$IBSStdParser$result;
 
           /*. . . . . . . . . . . . . . . . . . . .*/
-          case 23: // bcomp ::= iexpr LEQ iexpr 
+          case 18: // bexpr ::= iexpr LEQ iexpr 
             {
               Integer RESULT =null;
 		int lleft = (CUP$IBSStdParser$stack.elementAt(CUP$IBSStdParser$top-2)).left;
@@ -740,12 +662,12 @@ class CUP$IBSStdParser$actions {
          lexer.getExpressionClass().freeInt(l.intValue());
          lexer.getExpressionClass().freeInt(r.intValue());
       
-              CUP$IBSStdParser$result = parser.getSymbolFactory().newSymbol("bcomp",7, CUP$IBSStdParser$stack.elementAt(CUP$IBSStdParser$top-2), CUP$IBSStdParser$stack.peek(), RESULT);
+              CUP$IBSStdParser$result = parser.getSymbolFactory().newSymbol("bexpr",2, CUP$IBSStdParser$stack.elementAt(CUP$IBSStdParser$top-2), CUP$IBSStdParser$stack.peek(), RESULT);
             }
           return CUP$IBSStdParser$result;
 
           /*. . . . . . . . . . . . . . . . . . . .*/
-          case 24: // bcomp ::= iexpr GEQ iexpr 
+          case 19: // bexpr ::= iexpr GEQ iexpr 
             {
               Integer RESULT =null;
 		int lleft = (CUP$IBSStdParser$stack.elementAt(CUP$IBSStdParser$top-2)).left;
@@ -758,12 +680,12 @@ class CUP$IBSStdParser$actions {
          lexer.getExpressionClass().freeInt(l.intValue());
          lexer.getExpressionClass().freeInt(r.intValue());
       
-              CUP$IBSStdParser$result = parser.getSymbolFactory().newSymbol("bcomp",7, CUP$IBSStdParser$stack.elementAt(CUP$IBSStdParser$top-2), CUP$IBSStdParser$stack.peek(), RESULT);
+              CUP$IBSStdParser$result = parser.getSymbolFactory().newSymbol("bexpr",2, CUP$IBSStdParser$stack.elementAt(CUP$IBSStdParser$top-2), CUP$IBSStdParser$stack.peek(), RESULT);
             }
           return CUP$IBSStdParser$result;
 
           /*. . . . . . . . . . . . . . . . . . . .*/
-          case 25: // bcomp ::= iexpr EQ iexpr 
+          case 20: // bexpr ::= iexpr EQ iexpr 
             {
               Integer RESULT =null;
 		int lleft = (CUP$IBSStdParser$stack.elementAt(CUP$IBSStdParser$top-2)).left;
@@ -776,12 +698,12 @@ class CUP$IBSStdParser$actions {
          lexer.getExpressionClass().freeInt(l.intValue());
          lexer.getExpressionClass().freeInt(r.intValue());
       
-              CUP$IBSStdParser$result = parser.getSymbolFactory().newSymbol("bcomp",7, CUP$IBSStdParser$stack.elementAt(CUP$IBSStdParser$top-2), CUP$IBSStdParser$stack.peek(), RESULT);
+              CUP$IBSStdParser$result = parser.getSymbolFactory().newSymbol("bexpr",2, CUP$IBSStdParser$stack.elementAt(CUP$IBSStdParser$top-2), CUP$IBSStdParser$stack.peek(), RESULT);
             }
           return CUP$IBSStdParser$result;
 
           /*. . . . . . . . . . . . . . . . . . . .*/
-          case 26: // bcomp ::= iexpr DIF iexpr 
+          case 21: // bexpr ::= iexpr DIF iexpr 
             {
               Integer RESULT =null;
 		int lleft = (CUP$IBSStdParser$stack.elementAt(CUP$IBSStdParser$top-2)).left;
@@ -794,12 +716,12 @@ class CUP$IBSStdParser$actions {
          lexer.getExpressionClass().freeInt(l.intValue());
          lexer.getExpressionClass().freeInt(r.intValue());
       
-              CUP$IBSStdParser$result = parser.getSymbolFactory().newSymbol("bcomp",7, CUP$IBSStdParser$stack.elementAt(CUP$IBSStdParser$top-2), CUP$IBSStdParser$stack.peek(), RESULT);
+              CUP$IBSStdParser$result = parser.getSymbolFactory().newSymbol("bexpr",2, CUP$IBSStdParser$stack.elementAt(CUP$IBSStdParser$top-2), CUP$IBSStdParser$stack.peek(), RESULT);
             }
           return CUP$IBSStdParser$result;
 
           /*. . . . . . . . . . . . . . . . . . . .*/
-          case 27: // bcomp ::= bexpr EQ bexpr 
+          case 22: // bexpr ::= bexpr EQ bexpr 
             {
               Integer RESULT =null;
 		int lleft = (CUP$IBSStdParser$stack.elementAt(CUP$IBSStdParser$top-2)).left;
@@ -809,16 +731,15 @@ class CUP$IBSStdParser$actions {
 		int rright = (CUP$IBSStdParser$stack.peek()).right;
 		Integer r = CUP$IBSStdParser$stack.peek().<Integer>value();
 		 RESULT = Integer.valueOf(lexer.getExpressionClass().make_bbbEq(l.intValue(),r.intValue()));
-      System.out.println("BBEQ: " + lexer.getExpressionClass().getBExpr(RESULT).toString());
          lexer.getExpressionClass().freeBool(l.intValue());
          lexer.getExpressionClass().freeBool(r.intValue());
       
-              CUP$IBSStdParser$result = parser.getSymbolFactory().newSymbol("bcomp",7, CUP$IBSStdParser$stack.elementAt(CUP$IBSStdParser$top-2), CUP$IBSStdParser$stack.peek(), RESULT);
+              CUP$IBSStdParser$result = parser.getSymbolFactory().newSymbol("bexpr",2, CUP$IBSStdParser$stack.elementAt(CUP$IBSStdParser$top-2), CUP$IBSStdParser$stack.peek(), RESULT);
             }
           return CUP$IBSStdParser$result;
 
           /*. . . . . . . . . . . . . . . . . . . .*/
-          case 28: // bcomp ::= bexpr DIF bexpr 
+          case 23: // bexpr ::= bexpr DIF bexpr 
             {
               Integer RESULT =null;
 		int lleft = (CUP$IBSStdParser$stack.elementAt(CUP$IBSStdParser$top-2)).left;
@@ -831,7 +752,7 @@ class CUP$IBSStdParser$actions {
          lexer.getExpressionClass().freeBool(l.intValue());
          lexer.getExpressionClass().freeBool(r.intValue());
       
-              CUP$IBSStdParser$result = parser.getSymbolFactory().newSymbol("bcomp",7, CUP$IBSStdParser$stack.elementAt(CUP$IBSStdParser$top-2), CUP$IBSStdParser$stack.peek(), RESULT);
+              CUP$IBSStdParser$result = parser.getSymbolFactory().newSymbol("bexpr",2, CUP$IBSStdParser$stack.elementAt(CUP$IBSStdParser$top-2), CUP$IBSStdParser$stack.peek(), RESULT);
             }
           return CUP$IBSStdParser$result;
 
diff --git a/src/main/java/myutil/intboolsolver/IBSStdParserSym.java b/src/main/java/myutil/intboolsolver/IBSStdSymbol.java
similarity index 83%
rename from src/main/java/myutil/intboolsolver/IBSStdParserSym.java
rename to src/main/java/myutil/intboolsolver/IBSStdSymbol.java
index 4a6c505361b40ceef649b7dd35e64f7c12362aef..5d90a6ccffd4cdf4e8011a5f567fb9eb9ac505a2 100644
--- a/src/main/java/myutil/intboolsolver/IBSStdParserSym.java
+++ b/src/main/java/myutil/intboolsolver/IBSStdSymbol.java
@@ -6,30 +6,31 @@
 package myutil.intboolsolver;
 
 /** CUP generated class containing symbol constants. */
-public class IBSStdParserSym {
+public class IBSStdSymbol {
   /* terminals */
   public static final int GEQ = 14;
   public static final int MOD = 6;
   public static final int AND = 7;
   public static final int LT = 11;
   public static final int PLUS = 2;
-  public static final int INT = 20;
+  public static final int INT = 21;
   public static final int OR = 8;
   public static final int NOT = 15;
   public static final int GT = 12;
-  public static final int PARSE_INT = 18;
+  public static final int PARSE_INT = 19;
   public static final int EOF = 0;
   public static final int MULT = 4;
   public static final int DIV = 5;
   public static final int MINUS = 3;
   public static final int error = 1;
   public static final int EQ = 9;
-  public static final int BOOL = 21;
-  public static final int PARSE_BOOL = 19;
+  public static final int BOOL = 22;
+  public static final int PARSE_BOOL = 20;
   public static final int LEQ = 13;
   public static final int RPAR = 17;
   public static final int LPAR = 16;
   public static final int DIF = 10;
+  public static final int UMINUS = 18;
   public static final String[] terminalNames = new String[] {
   "EOF",
   "error",
@@ -49,6 +50,7 @@ public class IBSStdParserSym {
   "NOT",
   "LPAR",
   "RPAR",
+  "UMINUS",
   "PARSE_INT",
   "PARSE_BOOL",
   "INT",
diff --git a/src/main/java/myutil/intboolsolver/javacup/IBSStdLexer.jflex b/src/main/java/myutil/intboolsolver/javacup/IBSStdLexer.jflex
index e7211054b1a179543c182489279ad6d0bed8d46b..c7d5f32bb41e6c2b3eb8a5109d4df1ebe6cf7e97 100644
--- a/src/main/java/myutil/intboolsolver/javacup/IBSStdLexer.jflex
+++ b/src/main/java/myutil/intboolsolver/javacup/IBSStdLexer.jflex
@@ -4,11 +4,14 @@ import java.util.HashSet;
 
 %%
 
-%class IBSStdLexer< Spec extends IBSParamSpec, Comp extends IBSParamComp, State extends IBSParamState, SpecState extends IBSParamSpecState, CompState extends IBSParamCompState >
+%class IBSLexerClassName
+%implements IBSScanner<Spec, Comp, State, SpecState, CompState>
+
+%public
 %unicode
 %cup
 %eofval{
-   return new java_cup.runtime.Symbol(IBSStdParserSym.EOF);
+   return new java_cup.runtime.Symbol(IBSFlex#Symb.EOF);
 %eofval}
 
 %yylexthrow Exception
@@ -18,7 +21,7 @@ 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 IBSLexerClassName(){}
 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; }
@@ -63,44 +66,44 @@ Identifier = [a-zA-Z_][a-zA-Z0-9_\.]*
 %state INTBOOL
 
 %%
-<YYINITIAL> "boolean"  { yybegin(INTBOOL); return new Symbol(IBSStdParserSym.PARSE_BOOL); }
-<YYINITIAL> "integer"  { yybegin(INTBOOL); return new Symbol(IBSStdParserSym.PARSE_INT); }
+<YYINITIAL> "boolean"  { yybegin(INTBOOL); return new Symbol(IBSFlex#Symb.PARSE_BOOL); }
+<YYINITIAL> "integer"  { yybegin(INTBOOL); return new Symbol(IBSFlex#Symb.PARSE_INT); }
 <YYINITIAL> {Space}    {}
 
 <INTBOOL> {
  {Space}        {}
- "true"         { return new Symbol(IBSStdParserSym.BOOL, Integer.valueOf(exprC.make_bConst(true))); }
- "false"        { return new Symbol(IBSStdParserSym.BOOL, Integer.valueOf(exprC.make_bConst(false))); }
- {Natural}      { try { return new Symbol(IBSStdParserSym.INT, Integer.valueOf(exprC.make_iConst(Integer.parseInt(yytext()))));}
+ "true"         { return new Symbol(IBSFlex#Symb.BOOL, Integer.valueOf(exprC.make_bConst(true))); }
+ "false"        { return new Symbol(IBSFlex#Symb.BOOL, Integer.valueOf(exprC.make_bConst(false))); }
+ {Natural}      { try { return new Symbol(IBSFlex#Symb.INT, Integer.valueOf(exprC.make_iConst(Integer.parseInt(yytext()))));}
                   catch (NumberFormatException nfe) { throw new Exception ("Lexer : Integer Format : " + yytext()); }
                 }
- "+"            { return new Symbol(IBSStdParserSym.PLUS); }
- "-"            { return new Symbol(IBSStdParserSym.MINUS); }
- "*"            { return new Symbol(IBSStdParserSym.MULT); }
- "/"            { return new Symbol(IBSStdParserSym.DIV); }
- "%"            { return new Symbol(IBSStdParserSym.MOD); }
- "&&"           { return new Symbol(IBSStdParserSym.AND); }
- "and"          { return new Symbol(IBSStdParserSym.AND); }
- "||"           { return new Symbol(IBSStdParserSym.OR); }
- "or"           { return new Symbol(IBSStdParserSym.OR); }
- "!"            { return new Symbol(IBSStdParserSym.NOT); }
- "not"          { return new Symbol(IBSStdParserSym.NOT); }
- "=="           { return new Symbol(IBSStdParserSym.EQ); }
- "!="           { return new Symbol(IBSStdParserSym.DIF); }
- "<"            { return new Symbol(IBSStdParserSym.LT); }
- ">"            { return new Symbol(IBSStdParserSym.GT); }
- "<="           { return new Symbol(IBSStdParserSym.LEQ); }
- ">="           { return new Symbol(IBSStdParserSym.GEQ); }
- "("            { return new Symbol(IBSStdParserSym.LPAR); }
- ")"            { return new Symbol(IBSStdParserSym.RPAR); }
+ "+"            { return new Symbol(IBSFlex#Symb.PLUS); }
+ "-"            { return new Symbol(IBSFlex#Symb.MINUS); }
+ "*"            { return new Symbol(IBSFlex#Symb.MULT); }
+ "/"            { return new Symbol(IBSFlex#Symb.DIV); }
+ "%"            { return new Symbol(IBSFlex#Symb.MOD); }
+ "&&"           { return new Symbol(IBSFlex#Symb.AND); }
+ "and"          { return new Symbol(IBSFlex#Symb.AND); }
+ "||"           { return new Symbol(IBSFlex#Symb.OR); }
+ "or"           { return new Symbol(IBSFlex#Symb.OR); }
+ "!"            { return new Symbol(IBSFlex#Symb.NOT); }
+ "not"          { return new Symbol(IBSFlex#Symb.NOT); }
+ "=="           { return new Symbol(IBSFlex#Symb.EQ); }
+ "!="           { return new Symbol(IBSFlex#Symb.DIF); }
+ "<"            { return new Symbol(IBSFlex#Symb.LT); }
+ ">"            { return new Symbol(IBSFlex#Symb.GT); }
+ "<="           { return new Symbol(IBSFlex#Symb.LEQ); }
+ ">="           { return new Symbol(IBSFlex#Symb.GEQ); }
+ "("            { return new Symbol(IBSFlex#Symb.LPAR); }
+ ")"            { return new Symbol(IBSFlex#Symb.RPAR); }
  {Identifier}   { 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())));
+                      case IBSAttributeClass.BoolConst : return new Symbol(IBSFlex#Symb.BOOL, Integer.valueOf(exprC.make_bConst(attr.getConstant()!=0)));
+                      case IBSAttributeClass.IntConst : return new Symbol(IBSFlex#Symb.INT, Integer.valueOf(exprC.make_iConst(attr.getConstant())));
+                      case IBSAttributeClass.BoolAttr : return new Symbol(IBSFlex#Symb.BOOL, Integer.valueOf(exprC.make_bVar(attr.getAttribute())));
+                      case IBSAttributeClass.IntAttr : return new Symbol(IBSFlex#Symb.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 c253d606f43622c7c745ad596ee0075826a374b9..0f56fff307a2616e3236150e52e4aaeb43f99fc6 100644
--- a/src/main/java/myutil/intboolsolver/javacup/IBSStdParser.jcup
+++ b/src/main/java/myutil/intboolsolver/javacup/IBSStdParser.jcup
@@ -4,16 +4,16 @@ import java_cup.runtime.*;
 import java.util.HashSet;
 
 
-class IBSStdParser;
+/* class IBSStdParser; */
 /* To add in generated file:
    < Spec extends IBSParamSpec, Comp extends IBSParamComp, State extends IBSParamState, SpecState extends IBSParamSpecState, CompState extends IBSParamCompState >
 */
 
 parser code {:
 
-    IBSStdLexer<Spec,Comp,State,SpecState,CompState> lexer;
+    IBSScanner<Spec,Comp,State,SpecState,CompState> lexer;
     
-    public void setLexer(IBSStdLexer<Spec,Comp,State,SpecState,CompState> _lexer){ lexer=_lexer; setScanner(_lexer); }
+    public void setLexer(IBSScanner<Spec,Comp,State,SpecState,CompState> _lexer){ lexer=_lexer; setScanner(_lexer); }
 
     public void setAttributeClass(IBSAttributeClass<Spec,Comp,State,SpecState,CompState> _c){ lexer.setAttributeClass(_c); }
 
@@ -170,15 +170,14 @@ parser code {:
 
 /* Terminals (tokens returned by the scanner). */
 terminal            PLUS, MINUS, MULT, DIV, MOD, AND, OR, EQ, DIF, LT, GT, LEQ, GEQ;
-terminal            NOT, LPAR, RPAR;
+terminal            NOT, LPAR, RPAR, UMINUS;
 terminal            PARSE_INT, PARSE_BOOL;
 terminal Integer    INT, BOOL;
 
 
 /* Non terminals */
 non terminal IBSExpressionClass<Spec,Comp,State,SpecState,CompState>.Expr expr;
-non terminal Integer    iexpr, ifact, iatom;
-non terminal Integer    bexpr, bfact, batom, bcomp;
+non terminal Integer    iexpr, bexpr;
 
 /* Precedences (probably useless for the current grammar) */
 precedence left OR;
@@ -188,6 +187,7 @@ precedence left EQ, DIF;
 precedence nonassoc GT, LT, LEQ, GEQ;
 precedence left PLUS, MINUS;
 precedence left MULT, DIV, MOD;
+precedence left UMINUS;
 
 
 /* The grammar */
@@ -199,72 +199,51 @@ expr    ::=
 ;
 
 iexpr   ::=
-     ifact:e  {: RESULT = e; :}
-   | iexpr:l PLUS ifact:r
+     iexpr:l PLUS iexpr:r
       {: RESULT = Integer.valueOf(lexer.getExpressionClass().make_iiiPlus(l.intValue(),r.intValue()));
          lexer.getExpressionClass().freeInt(l.intValue());
          lexer.getExpressionClass().freeInt(r.intValue());
       :}
-   | iexpr:l MINUS ifact:r
+   | iexpr:l MINUS iexpr:r
       {: RESULT = Integer.valueOf(lexer.getExpressionClass().make_iiiMinus(l.intValue(),r.intValue()));
          lexer.getExpressionClass().freeInt(l.intValue());
          lexer.getExpressionClass().freeInt(r.intValue());
       :}
-;
-
-ifact   ::=
-      ifact:l MULT iatom:r
+   | iexpr:l MULT iexpr:r
       {: RESULT = Integer.valueOf(lexer.getExpressionClass().make_iiiMult(l.intValue(),r.intValue()));
          lexer.getExpressionClass().freeInt(l.intValue());
          lexer.getExpressionClass().freeInt(r.intValue());
       :}
-    | ifact:l DIV iatom:r
+   | iexpr:l DIV iexpr:r
       {: RESULT = Integer.valueOf(lexer.getExpressionClass().make_iiiDiv(l.intValue(),r.intValue()));
          lexer.getExpressionClass().freeInt(l.intValue());
          lexer.getExpressionClass().freeInt(r.intValue());
       :}
-    | ifact:l MOD iatom:r
+   | iexpr:l MOD iexpr:r
       {: RESULT = Integer.valueOf(lexer.getExpressionClass().make_iiiMod(l.intValue(),r.intValue()));
          lexer.getExpressionClass().freeInt(l.intValue());
          lexer.getExpressionClass().freeInt(r.intValue());
       :}
-    | iatom:e  {: RESULT = e; :}
-;
-
-iatom   ::=
-      INT:e {: RESULT = e; :}
-    | LPAR iexpr:e RPAR {: RESULT = e; :}
-    | MINUS iatom:e {: RESULT = Integer.valueOf(lexer.getExpressionClass().make_iNeg(e.intValue())); :}
+   | LPAR iexpr:e RPAR {: RESULT = e; :}
+   | MINUS iexpr:e {: RESULT = Integer.valueOf(lexer.getExpressionClass().make_iNeg(e.intValue())); :} %prec UMINUS
+   | INT:e {: RESULT = e; :}
 ;
 
 bexpr   ::=
-      bexpr:l OR bfact:r
+      bexpr:l OR bexpr:r
       {: RESULT = Integer.valueOf(lexer.getExpressionClass().make_bbbOr(l.intValue(),r.intValue()));
-      System.out.println("BBOR: " + lexer.getExpressionClass().getBExpr(RESULT).toString());
          lexer.getExpressionClass().freeBool(l.intValue());
          lexer.getExpressionClass().freeBool(r.intValue());
       :}
-    | bfact:e {: RESULT = e; :}
-;
-
-bfact   ::=
-      bfact:l AND batom:r
+    | bexpr:l AND bexpr:r
       {: RESULT = Integer.valueOf(lexer.getExpressionClass().make_bbbAnd(l.intValue(),r.intValue()));
          lexer.getExpressionClass().freeBool(l.intValue());
          lexer.getExpressionClass().freeBool(r.intValue());
       :}
-    | batom:e {: RESULT = e; :}
-;
-
-batom   ::=
-      BOOL:e {: RESULT = e; :}
-    | bcomp:e {: RESULT = e; :}
+    | BOOL:e {: RESULT = e; :}
     | LPAR bexpr:e RPAR {: RESULT = e; :}
     | NOT bexpr:e {: RESULT = Integer.valueOf(lexer.getExpressionClass().make_bNot(e.intValue())); :}
-;
-
-bcomp   ::=
-      iexpr:l LT iexpr:r
+    | iexpr:l LT iexpr:r
       {: RESULT = Integer.valueOf(lexer.getExpressionClass().make_biiLt(l.intValue(),r.intValue()));
          lexer.getExpressionClass().freeInt(l.intValue());
          lexer.getExpressionClass().freeInt(r.intValue());
@@ -296,7 +275,6 @@ bcomp   ::=
       :}
     | bexpr:l EQ bexpr:r
       {: RESULT = Integer.valueOf(lexer.getExpressionClass().make_bbbEq(l.intValue(),r.intValue()));
-      System.out.println("BBEQ: " + lexer.getExpressionClass().getBExpr(RESULT).toString());
          lexer.getExpressionClass().freeBool(l.intValue());
          lexer.getExpressionClass().freeBool(r.intValue());
       :}
diff --git a/src/main/java/myutil/intboolsolver/javacup/compile b/src/main/java/myutil/intboolsolver/javacup/compile
index 926336ba290fc0a6380ea0319ad892b7692902c7..a41b66a71b561592d73a13b009a5a0295aa26a5c 100755
--- a/src/main/java/myutil/intboolsolver/javacup/compile
+++ b/src/main/java/myutil/intboolsolver/javacup/compile
@@ -1,9 +1,23 @@
-jflex IBSStdLexer.jflex
-java-cup -expect 2 IBSStdParser.jcup
-sed "s/class IBSStdLexer/public class IBSStdLexer/" IBSStdLexer.java > IBSStdLexer1.java
-sed "s/class IBSStdParser/class IBSStdParser< Spec extends IBSParamSpec, Comp extends IBSParamComp, State extends IBSParamState, SpecState extends IBSParamSpecState, CompState extends IBSParamCompState >/" IBSStdParser.java > IBSStdParser1.java
-rm IBSStdParser.java
-mv IBSStdParser1.java IBSStdParser.java
-rm IBSStdLexer.java
-mv IBSStdLexer1.java IBSStdLexer.java
-mv IBSStdParser.java IBSStdLexer.java IBSStdParserSym.java ..
+#!/bin/sh
+
+JFLEX_FILE="IBSStdLexer.jflex"
+JAVACUP_FILE="IBSStdParser.jcup"
+LEXER_CLASS="IBSStdLexer"
+PARSER_CLASS="IBSStdParser"
+SYMBOL_CLASS="IBSStdSymbol"
+
+sed "s/IBSLexerClassName/$LEXER_CLASS/g" $JFLEX_FILE > __tmplexer.jflex
+sed "s/IBSFlex#Symb/$SYMBOL_CLASS/g" __tmplexer.jflex > __tmplexer2.jflex
+jflex __tmplexer2.jflex
+sed "s/public class $LEXER_CLASS/public class $LEXER_CLASS< Spec extends IBSParamSpec, Comp extends IBSParamComp, State extends IBSParamState, SpecState extends IBSParamSpecState, CompState extends IBSParamCompState >/" $LEXER_CLASS.java > __tmplexer.java
+rm $LEXER_CLASS.java
+mv __tmplexer.java $LEXER_CLASS.java
+rm __tmplexer.jflex __tmplexer2.jflex
+
+java-cup -parser $PARSER_CLASS -symbols $SYMBOL_CLASS $JAVACUP_FILE
+
+sed "s/class $PARSER_CLASS/class $PARSER_CLASS< Spec extends IBSParamSpec, Comp extends IBSParamComp, State extends IBSParamState, SpecState extends IBSParamSpecState, CompState extends IBSParamCompState >/" $PARSER_CLASS.java > __tmpparser.java
+
+rm $PARSER_CLASS.java *~
+mv __tmpparser.java $PARSER_CLASS.java
+mv $LEXER_CLASS.java $PARSER_CLASS.java $SYMBOL_CLASS.java ..
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
Binary files a/src/main/java/myutil/intboolsolver/javacup/test.tgz and /dev/null differ