You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@jena.apache.org by an...@apache.org on 2020/09/01 12:08:37 UTC

[jena] branch master updated: JENA-1957: targetClass=, missing propertyParams, NodeShape sh:node.

This is an automated email from the ASF dual-hosted git repository.

andy pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/jena.git


The following commit(s) were added to refs/heads/master by this push:
     new c7febfc  JENA-1957: targetClass=, missing propertyParams, NodeShape sh:node.
     new d620645  Merge pull request #789 from afs/jena1947-shacl
c7febfc is described below

commit c7febfc57142e4249ea8e43f9cddc8c4a4305f77
Author: Andy Seaborne <an...@apache.org>
AuthorDate: Sat Aug 29 14:41:08 2020 +0100

    JENA-1957: targetClass=, missing propertyParams, NodeShape sh:node.
---
 .../org/apache/jena/atlas/lib/CollectionUtils.java |  11 +-
 jena-shacl/shaclc/shaclc.jj                        |  18 +-
 .../shacl/compact/reader/ShaclCompactParser.java   |   8 +-
 .../reader/parser/ShaclCompactParserJJ.java        |  53 +-
 .../parser/ShaclCompactParserJJConstants.java      | 121 ++---
 .../parser/ShaclCompactParserJJTokenManager.java   | 532 +++++++++++----------
 .../constraint => compact/writer}/CompactOut.java  |   2 +-
 .../jena/shacl/compact/writer/CompactWriter.java   |   6 +-
 .../shacl/compact/writer/ShapeOutputVisitor.java   |   2 +-
 .../jena/shacl/engine/ValidationContext.java       |  25 +-
 .../shacl/engine/constraint/ClassConstraint.java   |   2 +-
 .../shacl/engine/constraint/ClosedConstraint.java  |   2 +-
 .../engine/constraint/DatatypeConstraint.java      |   2 +-
 .../engine/constraint/DisjointConstraint.java      |   2 +-
 .../shacl/engine/constraint/EqualsConstraint.java  |   2 +-
 .../engine/constraint/HasValueConstraint.java      |   2 +-
 .../jena/shacl/engine/constraint/InConstraint.java |   2 +-
 .../{InConstraint.java => JLogConstraint.java}     |  46 +-
 ...InConstraint.java => JViolationConstraint.java} |  40 +-
 .../engine/constraint/LessThanConstraint.java      |   2 +-
 .../constraint/LessThanOrEqualsConstraint.java     |   2 +-
 .../shacl/engine/constraint/PatternConstraint.java |   2 +-
 .../engine/constraint/QualifiedValueShape.java     |   1 +
 .../shacl/engine/constraint/ReportConstraint.java  |   2 +-
 .../shacl/engine/constraint/StrLanguageIn.java     |   2 +-
 .../engine/constraint/StrMaxLengthConstraint.java  |   2 +-
 .../engine/constraint/StrMinLengthConstraint.java  |   2 +-
 .../engine/constraint/UniqueLangConstraint.java    |   2 +-
 .../engine/constraint/ValueRangeConstraint.java    |   2 +-
 .../org/apache/jena/shacl/parser/Constraints.java  |  42 +-
 .../org/apache/jena/shacl/parser/NodeShape.java    |   5 +-
 .../apache/jena/shacl/parser/PropertyShape.java    |   2 +-
 .../java/org/apache/jena/shacl/parser/Shape.java   |  13 +-
 .../org/apache/jena/shacl/parser/ShapesParser.java |  53 +-
 .../org/apache/jena/shacl/sys/ShaclSystem.java     |   7 +
 .../org/apache/jena/shacl/validation/VLib.java     |   2 +-
 .../java/org/apache/jena/shacl/vocabulary/SHJ.java |  22 +-
 37 files changed, 602 insertions(+), 441 deletions(-)

diff --git a/jena-base/src/main/java/org/apache/jena/atlas/lib/CollectionUtils.java b/jena-base/src/main/java/org/apache/jena/atlas/lib/CollectionUtils.java
index 9cbf807..7f63718 100644
--- a/jena-base/src/main/java/org/apache/jena/atlas/lib/CollectionUtils.java
+++ b/jena-base/src/main/java/org/apache/jena/atlas/lib/CollectionUtils.java
@@ -19,18 +19,23 @@
 package org.apache.jena.atlas.lib;
 
 import java.util.Collection ;
+import java.util.List;
 
 import org.apache.jena.atlas.iterator.Iter;
 
 public class CollectionUtils
-{   
-    /** Test for same elements, regardless of cardinality */ 
+{
+    /** Test for same elements, regardless of cardinality */
     public static <T> boolean sameElts(Collection<T> left, Collection<T> right) {
         return right.containsAll(left) && left.containsAll(right) ;
     }
 
-    /** Return an element from a collection. */ 
+    /** Return an element from a collection. */
     public static <T> T oneElt(Collection<T> collection) {
+        if ( collection == null || collection.isEmpty() )
+            return null;
+        if ( collection instanceof List<?> )
+            return ((List<T>)collection).get(0);
         return Iter.first(collection.iterator());
     }
 }
diff --git a/jena-shacl/shaclc/shaclc.jj b/jena-shacl/shaclc/shaclc.jj
index e81af72..cb1e041 100644
--- a/jena-shacl/shaclc/shaclc.jj
+++ b/jena-shacl/shaclc/shaclc.jj
@@ -140,7 +140,11 @@ void nodeShapeBody() : {}
 void constraint() : { }
 {
   { startConstraint(); }
-  ( (nodeOr())+ | propertyShape() )
+  ( (nodeOr())+ | propertyShape()
+// <EXT>
+    | shapeRef(false)
+// </EXT>
+  )
   { finishConstraint() ; }
   <DOT>
 }
@@ -217,7 +221,7 @@ void propertyNot() : { boolean b = false; }
 void propertyAtom() : { }
 {
   // Work on currentPropertyShape()
-  propertyType() | nodeKind() | shapeRef() | propertyValue() |
+  propertyType() | nodeKind() | shapeRef(true) | propertyValue() |
      ( { startNestedPropertyAtom(); } nodeShapeBody() { finishNestedPropertyAtom(); })
 }
 
@@ -249,7 +253,7 @@ void nodeKind() : { Token t; }
   { rNodeKind(t.image); }
 }
 
-void shapeRef() : { Token t; String iriStr; }
+void shapeRef(boolean inPropertyShape) : { Token t; String iriStr; }
 {
   // consistent WS handling.?
   ( t = <ATPNAME_LN>
@@ -258,8 +262,7 @@ void shapeRef() : { Token t; String iriStr; }
   { iriStr = resolvePName(t.image.substring(1), t.beginLine, t.beginColumn) ; }
   | <AT> iriStr= IRIREF()
   )
-  //<AT> iriStr = iri()
-  { rShapeRef(iriStr); }
+  { rShapeRef(inPropertyShape, iriStr); }
 }
 
 void propertyValue() : { String s; Node n; List<Node> x; }
@@ -305,6 +308,11 @@ String propertyParam() : { Token t; }
     t = "equals" | t = "disjoint" | t = "lessThan" | t = "lessThanOrEquals" |
     t = "qualifiedValueShape" | t = "qualifiedMinCount" | t = "qualifiedMaxCount" | t = "qualifiedValueShapesDisjoint" |
     t = "closed" | t = "ignoredProperties" | t = "hasValue" | t = "in"
+// <EXT>
+        | t = "group" | t = "order"
+        | t = "name"  | t = "description"
+        | t = "defaultValue"
+// </EXT>
   )
   { return t.image; }
 }
diff --git a/jena-shacl/src/main/java/org/apache/jena/shacl/compact/reader/ShaclCompactParser.java b/jena-shacl/src/main/java/org/apache/jena/shacl/compact/reader/ShaclCompactParser.java
index 4e08482..11a05e1 100644
--- a/jena-shacl/src/main/java/org/apache/jena/shacl/compact/reader/ShaclCompactParser.java
+++ b/jena-shacl/src/main/java/org/apache/jena/shacl/compact/reader/ShaclCompactParser.java
@@ -426,9 +426,13 @@ public class ShaclCompactParser extends ParserBase {
 
     // shapeRef: Produce a triple ?property sh:node ?node where ?node is the IRI
     // derived from the substring of shapeRef after the '@' character using iri.
-    protected void rShapeRef(String iriStr) {
+    protected void rShapeRef(boolean inPropertyShape, String iriStr) {
         Node x = iri(iriStr);
-        triple(currentTripleAcc(), currentPropertyShape(), SHACL.node, x);
+        if ( inPropertyShape )
+            triple(currentTripleAcc(), currentPropertyShape(), SHACL.node, x);
+        else
+            // Extension.
+            triple(currentTripleAcc(), currentNodeShape(), SHACL.node, x);
     }
 
     // propertyValue: Produce a triple ?property ?predicate ?object where ?predicate
diff --git a/jena-shacl/src/main/java/org/apache/jena/shacl/compact/reader/parser/ShaclCompactParserJJ.java b/jena-shacl/src/main/java/org/apache/jena/shacl/compact/reader/parser/ShaclCompactParserJJ.java
index 1cce249..9ef855f 100644
--- a/jena-shacl/src/main/java/org/apache/jena/shacl/compact/reader/parser/ShaclCompactParserJJ.java
+++ b/jena-shacl/src/main/java/org/apache/jena/shacl/compact/reader/parser/ShaclCompactParserJJ.java
@@ -210,12 +210,15 @@ startNodeShapeBody() ;
       case 31:
       case 32:
       case 33:
+      case AT:
       case CARAT:
       case BANG:
       case LPAREN:
       case IRIref:
       case PNAME_NS:
-      case PNAME_LN:{
+      case PNAME_LN:
+      case ATPNAME_NS:
+      case ATPNAME_LN:{
         ;
         break;
         }
@@ -306,6 +309,12 @@ startConstraint();
       propertyShape();
       break;
       }
+    case AT:
+    case ATPNAME_NS:
+    case ATPNAME_LN:{
+      shapeRef(false);
+      break;
+      }
     default:
       jj_la1[9] = jj_gen;
       jj_consume_token(-1);
@@ -563,7 +572,7 @@ finishPropertyNot(b);
     case AT:
     case ATPNAME_NS:
     case ATPNAME_LN:{
-      shapeRef();
+      shapeRef(true);
       break;
       }
     case 9:
@@ -680,7 +689,7 @@ rPropertyType(iriStr);
 rNodeKind(t.image);
   }
 
-  final public void shapeRef() throws ParseException {Token t; String iriStr;
+  final public void shapeRef(boolean inPropertyShape) throws ParseException {Token t; String iriStr;
     switch ((jj_ntk==-1)?jj_ntk_f():jj_ntk) {
     case ATPNAME_LN:{
       t = jj_consume_token(ATPNAME_LN);
@@ -702,7 +711,7 @@ iriStr = resolvePName(t.image.substring(1), t.beginLine, t.beginColumn) ;
       jj_consume_token(-1);
       throw new ParseException();
     }
-rShapeRef(iriStr);
+rShapeRef(inPropertyShape, iriStr);
   }
 
   final public void propertyValue() throws ParseException {String s; Node n; List<Node> x;
@@ -968,6 +977,26 @@ String nodeParam() throws ParseException {Token t ;
       t = jj_consume_token(33);
       break;
       }
+    case 41:{
+      t = jj_consume_token(41);
+      break;
+      }
+    case 42:{
+      t = jj_consume_token(42);
+      break;
+      }
+    case 43:{
+      t = jj_consume_token(43);
+      break;
+      }
+    case 44:{
+      t = jj_consume_token(44);
+      break;
+      }
+    case 45:{
+      t = jj_consume_token(45);
+      break;
+      }
     default:
       jj_la1[23] = jj_gen;
       jj_consume_token(-1);
@@ -1284,7 +1313,7 @@ n = createNode(uriStr);
     lex = string();
 String lang = null ; String dt = null ;
     switch ((jj_ntk==-1)?jj_ntk_f():jj_ntk) {
-    case 41:
+    case 46:
     case LANGTAG:{
       switch ((jj_ntk==-1)?jj_ntk_f():jj_ntk) {
       case LANGTAG:{
@@ -1292,8 +1321,8 @@ String lang = null ; String dt = null ;
 lang = stripChars(t.image, 1) ;
         break;
         }
-      case 41:{
-        jj_consume_token(41);
+      case 46:{
+        jj_consume_token(46);
         dt = datatype();
         break;
         }
@@ -1421,13 +1450,13 @@ lex = unescapeStr(lex,  t.beginLine, t.beginColumn) ;
       jj_la1_0 = new int[] {0x0,0x0,0x0,0x0,0x0,0x2,0x0,0xfffffe00,0xfffffe00,0xfffffe00,0x0,0x0,0x0,0xfffffff8,0xfffffff8,0x0,0x0,0xfffffff8,0x0,0x1f8,0x0,0x0,0xfffffe00,0xffffe000,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,};
    }
    private static void jj_la1_init_1() {
-      jj_la1_1 = new int[] {0x10000,0xe0000,0x300000,0x300000,0xe0000,0x0,0x0,0xa0000003,0x80000003,0xa0000003,0x8000000,0x80000000,0xc00000,0x90000003,0x90000003,0x8000000,0x80000000,0x10000003,0x0,0x0,0x10000000,0xc00000,0x3,0x1ff,0x8000000,0x0,0x2000000,0x20000000,0x2000000,0x0,0xc00000,0xc00000,0xc00000,0xc00000,0x0,0x200,0x200,0x0,0x0,0x0,};
+      jj_la1_1 = new int[] {0x200000,0x1c00000,0x6000000,0x6000000,0x1c00000,0x0,0x0,0x3,0x3,0x3,0x0,0x0,0x18000000,0x3,0x3,0x0,0x0,0x3,0x0,0x0,0x0,0x18000000,0x3,0x3fff,0x0,0x0,0x40000000,0x0,0x40000000,0x0,0x18000000,0x18000000,0x18000000,0x18000000,0x0,0x4000,0x4000,0x0,0x0,0x0,};
    }
    private static void jj_la1_init_2() {
-      jj_la1_2 = new int[] {0x0,0x0,0x0,0x0,0x0,0x0,0x3800,0x3810,0x0,0x3810,0x0,0x0,0x7783900,0xf940,0xf940,0x0,0x0,0xf840,0x1000004,0x0,0xc000,0x7783900,0x0,0x0,0x0,0x2,0x5,0x3810,0x5,0x3810,0x7783800,0x7783800,0x7780000,0x0,0x7000000,0x10000000,0x10000000,0x780000,0x3800,0x3000,};
+      jj_la1_2 = new int[] {0x0,0x0,0x0,0x0,0x0,0x0,0x70000,0x1f0216,0x10,0x1f0216,0x1,0x10,0xef072000,0x1f2812,0x1f2812,0x1,0x10,0x1f0802,0x20000080,0x0,0x180002,0xef072000,0x0,0x0,0x1,0x40,0xa0,0x70204,0xa0,0x70200,0xef070000,0xef070000,0xef000000,0x0,0xe0000000,0x0,0x0,0xf000000,0x70000,0x60000,};
    }
    private static void jj_la1_init_3() {
-      jj_la1_3 = new int[] {0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,};
+      jj_la1_3 = new int[] {0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x2,0x2,0x0,0x0,0x0,};
    }
 
   /** Constructor with InputStream. */
@@ -1544,7 +1573,7 @@ lex = unescapeStr(lex,  t.beginLine, t.beginColumn) ;
   /** Generate ParseException. */
   public ParseException generateParseException() {
     jj_expentries.clear();
-    boolean[] la1tokens = new boolean[105];
+    boolean[] la1tokens = new boolean[110];
     if (jj_kind >= 0) {
       la1tokens[jj_kind] = true;
       jj_kind = -1;
@@ -1567,7 +1596,7 @@ lex = unescapeStr(lex,  t.beginLine, t.beginColumn) ;
         }
       }
     }
-    for (int i = 0; i < 105; i++) {
+    for (int i = 0; i < 110; i++) {
       if (la1tokens[i]) {
         jj_expentry = new int[1];
         jj_expentry[0] = i;
diff --git a/jena-shacl/src/main/java/org/apache/jena/shacl/compact/reader/parser/ShaclCompactParserJJConstants.java b/jena-shacl/src/main/java/org/apache/jena/shacl/compact/reader/parser/ShaclCompactParserJJConstants.java
index 6cb2aa1..468f975 100644
--- a/jena-shacl/src/main/java/org/apache/jena/shacl/compact/reader/parser/ShaclCompactParserJJConstants.java
+++ b/jena-shacl/src/main/java/org/apache/jena/shacl/compact/reader/parser/ShaclCompactParserJJConstants.java
@@ -29,121 +29,121 @@ public interface ShaclCompactParserJJConstants {
   /** End of File. */
   int EOF = 0;
   /** RegularExpression Id. */
-  int SINGLE_LINE_COMMENT = 47;
+  int SINGLE_LINE_COMMENT = 52;
   /** RegularExpression Id. */
-  int BOM = 48;
+  int BOM = 53;
   /** RegularExpression Id. */
-  int BASE = 49;
+  int BASE = 54;
   /** RegularExpression Id. */
-  int IMPORTS = 50;
+  int IMPORTS = 55;
   /** RegularExpression Id. */
-  int PREFIX = 51;
+  int PREFIX = 56;
   /** RegularExpression Id. */
-  int SHAPE_CLASS = 52;
+  int SHAPE_CLASS = 57;
   /** RegularExpression Id. */
-  int SHAPE = 53;
+  int SHAPE = 58;
   /** RegularExpression Id. */
-  int TRUE = 54;
+  int TRUE = 59;
   /** RegularExpression Id. */
-  int FALSE = 55;
+  int FALSE = 60;
   /** RegularExpression Id. */
-  int HEX = 56;
+  int HEX = 61;
   /** RegularExpression Id. */
-  int PLUS = 57;
+  int PLUS = 62;
   /** RegularExpression Id. */
-  int MINUS = 58;
+  int MINUS = 63;
   /** RegularExpression Id. */
-  int VBAR = 59;
+  int VBAR = 64;
   /** RegularExpression Id. */
-  int AT = 60;
+  int AT = 65;
   /** RegularExpression Id. */
-  int CARAT = 61;
+  int CARAT = 66;
   /** RegularExpression Id. */
-  int DOT = 62;
+  int DOT = 67;
   /** RegularExpression Id. */
-  int BANG = 63;
+  int BANG = 68;
   /** RegularExpression Id. */
-  int QMARK = 64;
+  int QMARK = 69;
   /** RegularExpression Id. */
-  int SLASH = 65;
+  int SLASH = 70;
   /** RegularExpression Id. */
-  int STAR = 66;
+  int STAR = 71;
   /** RegularExpression Id. */
-  int EQUALS = 67;
+  int EQUALS = 72;
   /** RegularExpression Id. */
-  int LPAREN = 68;
+  int LPAREN = 73;
   /** RegularExpression Id. */
-  int RPAREN = 69;
+  int RPAREN = 74;
   /** RegularExpression Id. */
-  int LBRACE = 70;
+  int LBRACE = 75;
   /** RegularExpression Id. */
-  int RBRACE = 71;
+  int RBRACE = 76;
   /** RegularExpression Id. */
-  int LBRACKET = 72;
+  int LBRACKET = 77;
   /** RegularExpression Id. */
-  int RBRACKET = 73;
+  int RBRACKET = 78;
   /** RegularExpression Id. */
-  int UCHAR = 74;
+  int UCHAR = 79;
   /** RegularExpression Id. */
-  int IRIref = 75;
+  int IRIref = 80;
   /** RegularExpression Id. */
-  int PNAME_NS = 76;
+  int PNAME_NS = 81;
   /** RegularExpression Id. */
-  int PNAME_LN = 77;
+  int PNAME_LN = 82;
   /** RegularExpression Id. */
-  int ATPNAME_NS = 78;
+  int ATPNAME_NS = 83;
   /** RegularExpression Id. */
-  int ATPNAME_LN = 79;
+  int ATPNAME_LN = 84;
   /** RegularExpression Id. */
-  int QUOTE_3D = 80;
+  int QUOTE_3D = 85;
   /** RegularExpression Id. */
-  int QUOTE_3S = 81;
+  int QUOTE_3S = 86;
   /** RegularExpression Id. */
-  int ECHAR = 82;
+  int ECHAR = 87;
   /** RegularExpression Id. */
-  int STRING_LITERAL1 = 83;
+  int STRING_LITERAL1 = 88;
   /** RegularExpression Id. */
-  int STRING_LITERAL2 = 84;
+  int STRING_LITERAL2 = 89;
   /** RegularExpression Id. */
-  int STRING_LITERAL_LONG1 = 85;
+  int STRING_LITERAL_LONG1 = 90;
   /** RegularExpression Id. */
-  int STRING_LITERAL_LONG2 = 86;
+  int STRING_LITERAL_LONG2 = 91;
   /** RegularExpression Id. */
-  int DIGITS = 87;
+  int DIGITS = 92;
   /** RegularExpression Id. */
-  int INTEGER = 88;
+  int INTEGER = 93;
   /** RegularExpression Id. */
-  int DECIMAL = 89;
+  int DECIMAL = 94;
   /** RegularExpression Id. */
-  int DOUBLE = 90;
+  int DOUBLE = 95;
   /** RegularExpression Id. */
-  int EXPONENT = 91;
+  int EXPONENT = 96;
   /** RegularExpression Id. */
-  int LANGTAG = 92;
+  int LANGTAG = 97;
   /** RegularExpression Id. */
-  int A2Z = 93;
+  int A2Z = 98;
   /** RegularExpression Id. */
-  int A2ZN = 94;
+  int A2ZN = 99;
   /** RegularExpression Id. */
-  int PN_CHARS_BASE = 95;
+  int PN_CHARS_BASE = 100;
   /** RegularExpression Id. */
-  int PN_CHARS_U = 96;
+  int PN_CHARS_U = 101;
   /** RegularExpression Id. */
-  int PN_CHARS = 97;
+  int PN_CHARS = 102;
   /** RegularExpression Id. */
-  int PN_PREFIX = 98;
+  int PN_PREFIX = 103;
   /** RegularExpression Id. */
-  int PN_LOCAL = 99;
+  int PN_LOCAL = 104;
   /** RegularExpression Id. */
-  int VARNAME = 100;
+  int VARNAME = 105;
   /** RegularExpression Id. */
-  int PN_LOCAL_ESC = 101;
+  int PN_LOCAL_ESC = 106;
   /** RegularExpression Id. */
-  int PLX = 102;
+  int PLX = 107;
   /** RegularExpression Id. */
-  int PERCENT = 103;
+  int PERCENT = 108;
   /** RegularExpression Id. */
-  int UNKNOWN = 104;
+  int UNKNOWN = 109;
 
   /** Lexical state. */
   int DEFAULT = 0;
@@ -191,6 +191,11 @@ public interface ShaclCompactParserJJConstants {
     "\"qualifiedMinCount\"",
     "\"qualifiedMaxCount\"",
     "\"qualifiedValueShapesDisjoint\"",
+    "\"group\"",
+    "\"order\"",
+    "\"name\"",
+    "\"description\"",
+    "\"defaultValue\"",
     "\"^^\"",
     "\" \"",
     "\"\\t\"",
diff --git a/jena-shacl/src/main/java/org/apache/jena/shacl/compact/reader/parser/ShaclCompactParserJJTokenManager.java b/jena-shacl/src/main/java/org/apache/jena/shacl/compact/reader/parser/ShaclCompactParserJJTokenManager.java
index 4b33b42..b524135 100644
--- a/jena-shacl/src/main/java/org/apache/jena/shacl/compact/reader/parser/ShaclCompactParserJJTokenManager.java
+++ b/jena-shacl/src/main/java/org/apache/jena/shacl/compact/reader/parser/ShaclCompactParserJJTokenManager.java
@@ -42,117 +42,121 @@ private int jjMoveStringLiteralDfa0_0(){
    switch(curChar)
    {
       case 9:
-         jjmatchedKind = 43;
+         jjmatchedKind = 48;
          return jjMoveNfa_0(0, 0);
       case 10:
-         jjmatchedKind = 44;
+         jjmatchedKind = 49;
          return jjMoveNfa_0(0, 0);
       case 12:
-         jjmatchedKind = 46;
+         jjmatchedKind = 51;
          return jjMoveNfa_0(0, 0);
       case 13:
-         jjmatchedKind = 45;
+         jjmatchedKind = 50;
          return jjMoveNfa_0(0, 0);
       case 32:
-         jjmatchedKind = 42;
+         jjmatchedKind = 47;
          return jjMoveNfa_0(0, 0);
       case 33:
-         jjmatchedKind = 63;
+         jjmatchedKind = 68;
          return jjMoveNfa_0(0, 0);
       case 40:
-         jjmatchedKind = 68;
+         jjmatchedKind = 73;
          return jjMoveNfa_0(0, 0);
       case 41:
-         jjmatchedKind = 69;
+         jjmatchedKind = 74;
          return jjMoveNfa_0(0, 0);
       case 42:
-         jjmatchedKind = 66;
+         jjmatchedKind = 71;
          return jjMoveNfa_0(0, 0);
       case 43:
-         jjmatchedKind = 57;
+         jjmatchedKind = 62;
          return jjMoveNfa_0(0, 0);
       case 45:
-         jjmatchedKind = 58;
+         jjmatchedKind = 63;
          return jjMoveStringLiteralDfa1_0(0x2L);
       case 46:
-         jjmatchedKind = 62;
+         jjmatchedKind = 67;
          return jjMoveStringLiteralDfa1_0(0x4L);
       case 47:
-         jjmatchedKind = 65;
+         jjmatchedKind = 70;
          return jjMoveNfa_0(0, 0);
       case 61:
-         jjmatchedKind = 67;
+         jjmatchedKind = 72;
          return jjMoveNfa_0(0, 0);
       case 63:
-         jjmatchedKind = 64;
+         jjmatchedKind = 69;
          return jjMoveNfa_0(0, 0);
       case 64:
-         jjmatchedKind = 60;
+         jjmatchedKind = 65;
          return jjMoveNfa_0(0, 0);
       case 66:
-         return jjMoveStringLiteralDfa1_0(0x20000000000c8L);
+         return jjMoveStringLiteralDfa1_0(0x400000000000c8L);
       case 70:
-         return jjMoveStringLiteralDfa1_0(0x80000000000000L);
+         return jjMoveStringLiteralDfa1_0(0x1000000000000000L);
       case 73:
-         return jjMoveStringLiteralDfa1_0(0x4000000000110L);
+         return jjMoveStringLiteralDfa1_0(0x80000000000110L);
       case 76:
          return jjMoveStringLiteralDfa1_0(0x20L);
       case 80:
-         return jjMoveStringLiteralDfa1_0(0x8000000000000L);
+         return jjMoveStringLiteralDfa1_0(0x100000000000000L);
       case 83:
-         return jjMoveStringLiteralDfa1_0(0x30000000000000L);
+         return jjMoveStringLiteralDfa1_0(0x600000000000000L);
       case 84:
-         return jjMoveStringLiteralDfa1_0(0x40000000000000L);
+         return jjMoveStringLiteralDfa1_0(0x800000000000000L);
       case 91:
-         jjmatchedKind = 72;
+         jjmatchedKind = 77;
          return jjMoveNfa_0(0, 0);
       case 93:
-         jjmatchedKind = 73;
+         jjmatchedKind = 78;
          return jjMoveNfa_0(0, 0);
       case 94:
-         jjmatchedKind = 61;
-         return jjMoveStringLiteralDfa1_0(0x20000000000L);
+         jjmatchedKind = 66;
+         return jjMoveStringLiteralDfa1_0(0x400000000000L);
       case 98:
-         return jjMoveStringLiteralDfa1_0(0x2000000000000L);
+         return jjMoveStringLiteralDfa1_0(0x40000000000000L);
       case 99:
          return jjMoveStringLiteralDfa1_0(0x40010000L);
       case 100:
-         return jjMoveStringLiteralDfa1_0(0x20022000L);
+         return jjMoveStringLiteralDfa1_0(0x300020022000L);
       case 101:
          return jjMoveStringLiteralDfa1_0(0x10000000L);
       case 102:
-         return jjMoveStringLiteralDfa1_0(0x80000004000000L);
+         return jjMoveStringLiteralDfa1_0(0x1000000004000000L);
+      case 103:
+         return jjMoveStringLiteralDfa1_0(0x20000000000L);
       case 104:
          return jjMoveStringLiteralDfa1_0(0x100000000L);
       case 105:
-         return jjMoveStringLiteralDfa1_0(0x4000280000000L);
+         return jjMoveStringLiteralDfa1_0(0x80000280000000L);
       case 108:
          return jjMoveStringLiteralDfa1_0(0x1808000000L);
       case 109:
          return jjMoveStringLiteralDfa1_0(0x1f88000L);
       case 110:
-         return jjMoveStringLiteralDfa1_0(0x40000L);
+         return jjMoveStringLiteralDfa1_0(0x80000040000L);
+      case 111:
+         return jjMoveStringLiteralDfa1_0(0x40000000000L);
       case 112:
-         return jjMoveStringLiteralDfa1_0(0x8000002000000L);
+         return jjMoveStringLiteralDfa1_0(0x100000002000000L);
       case 113:
          return jjMoveStringLiteralDfa1_0(0x1e000000000L);
       case 115:
-         return jjMoveStringLiteralDfa1_0(0x30000000004000L);
+         return jjMoveStringLiteralDfa1_0(0x600000000004000L);
       case 116:
-         return jjMoveStringLiteralDfa1_0(0x40000000001e00L);
+         return jjMoveStringLiteralDfa1_0(0x800000000001e00L);
       case 117:
          return jjMoveStringLiteralDfa1_0(0x400000000L);
       case 123:
-         jjmatchedKind = 70;
+         jjmatchedKind = 75;
          return jjMoveNfa_0(0, 0);
       case 124:
-         jjmatchedKind = 59;
+         jjmatchedKind = 64;
          return jjMoveNfa_0(0, 0);
       case 125:
-         jjmatchedKind = 71;
+         jjmatchedKind = 76;
          return jjMoveNfa_0(0, 0);
       case 65279:
-         jjmatchedKind = 48;
+         jjmatchedKind = 53;
          return jjMoveNfa_0(0, 0);
       default :
          return jjMoveNfa_0(0, 0);
@@ -180,34 +184,34 @@ private int jjMoveStringLiteralDfa1_0(long active0){
          }
          break;
       case 65:
-         return jjMoveStringLiteralDfa2_0(active0, 0x82000000000000L);
+         return jjMoveStringLiteralDfa2_0(active0, 0x1040000000000000L);
       case 72:
-         return jjMoveStringLiteralDfa2_0(active0, 0x30000000000000L);
+         return jjMoveStringLiteralDfa2_0(active0, 0x600000000000000L);
       case 77:
-         return jjMoveStringLiteralDfa2_0(active0, 0x4000000000000L);
+         return jjMoveStringLiteralDfa2_0(active0, 0x80000000000000L);
       case 82:
-         return jjMoveStringLiteralDfa2_0(active0, 0x48000000000110L);
+         return jjMoveStringLiteralDfa2_0(active0, 0x900000000000110L);
       case 94:
-         if ((active0 & 0x20000000000L) != 0L)
+         if ((active0 & 0x400000000000L) != 0L)
          {
-            jjmatchedKind = 41;
+            jjmatchedKind = 46;
             jjmatchedPos = 1;
          }
          break;
       case 97:
-         return jjMoveStringLiteralDfa2_0(active0, 0x8200010b621e00L);
+         return jjMoveStringLiteralDfa2_0(active0, 0x104008010b621e00L);
       case 101:
-         return jjMoveStringLiteralDfa2_0(active0, 0x180000e000L);
+         return jjMoveStringLiteralDfa2_0(active0, 0x30180000e000L);
       case 103:
          return jjMoveStringLiteralDfa2_0(active0, 0x80000000L);
       case 104:
-         return jjMoveStringLiteralDfa2_0(active0, 0x30000000000000L);
+         return jjMoveStringLiteralDfa2_0(active0, 0x600000000000000L);
       case 105:
          return jjMoveStringLiteralDfa2_0(active0, 0x20980020L);
       case 108:
          return jjMoveStringLiteralDfa2_0(active0, 0x440100c8L);
       case 109:
-         return jjMoveStringLiteralDfa2_0(active0, 0x4000000000000L);
+         return jjMoveStringLiteralDfa2_0(active0, 0x80000000000000L);
       case 110:
          if ((active0 & 0x200000000L) != 0L)
          {
@@ -220,7 +224,7 @@ private int jjMoveStringLiteralDfa1_0(long active0){
       case 113:
          return jjMoveStringLiteralDfa2_0(active0, 0x10000000L);
       case 114:
-         return jjMoveStringLiteralDfa2_0(active0, 0x48000000000000L);
+         return jjMoveStringLiteralDfa2_0(active0, 0x900060000000000L);
       case 117:
          return jjMoveStringLiteralDfa2_0(active0, 0x1e000000000L);
       default :
@@ -238,9 +242,9 @@ private int jjMoveStringLiteralDfa2_0(long old0, long active0){
    switch(curChar)
    {
       case 65:
-         return jjMoveStringLiteralDfa3_0(active0, 0x30000000000000L);
+         return jjMoveStringLiteralDfa3_0(active0, 0x600000000000000L);
       case 69:
-         return jjMoveStringLiteralDfa3_0(active0, 0x8000000000000L);
+         return jjMoveStringLiteralDfa3_0(active0, 0x100000000000000L);
       case 73:
          if ((active0 & 0x10L) != 0L)
          {
@@ -249,37 +253,41 @@ private int jjMoveStringLiteralDfa2_0(long old0, long active0){
          }
          return jjMoveStringLiteralDfa3_0(active0, 0x100L);
       case 76:
-         return jjMoveStringLiteralDfa3_0(active0, 0x80000000000000L);
+         return jjMoveStringLiteralDfa3_0(active0, 0x1000000000000000L);
       case 80:
-         return jjMoveStringLiteralDfa3_0(active0, 0x4000000000000L);
+         return jjMoveStringLiteralDfa3_0(active0, 0x80000000000000L);
       case 83:
-         return jjMoveStringLiteralDfa3_0(active0, 0x2000000000000L);
-      case 85:
          return jjMoveStringLiteralDfa3_0(active0, 0x40000000000000L);
+      case 85:
+         return jjMoveStringLiteralDfa3_0(active0, 0x800000000000000L);
       case 97:
-         return jjMoveStringLiteralDfa3_0(active0, 0x3001e0040120c8L);
+         return jjMoveStringLiteralDfa3_0(active0, 0x60001e0040120c8L);
       case 100:
-         return jjMoveStringLiteralDfa3_0(active0, 0x40000L);
+         return jjMoveStringLiteralDfa3_0(active0, 0x40000040000L);
       case 101:
-         return jjMoveStringLiteralDfa3_0(active0, 0x8000000000000L);
+         return jjMoveStringLiteralDfa3_0(active0, 0x100000000000000L);
+      case 102:
+         return jjMoveStringLiteralDfa3_0(active0, 0x200000000000L);
       case 105:
          return jjMoveStringLiteralDfa3_0(active0, 0x400000000L);
       case 108:
-         return jjMoveStringLiteralDfa3_0(active0, 0x80000000000000L);
+         return jjMoveStringLiteralDfa3_0(active0, 0x1000000000000000L);
+      case 109:
+         return jjMoveStringLiteralDfa3_0(active0, 0x80000000000L);
       case 110:
          return jjMoveStringLiteralDfa3_0(active0, 0x88980000L);
       case 111:
-         return jjMoveStringLiteralDfa3_0(active0, 0x40000000L);
+         return jjMoveStringLiteralDfa3_0(active0, 0x20040000000L);
       case 112:
-         return jjMoveStringLiteralDfa3_0(active0, 0x4000000000000L);
+         return jjMoveStringLiteralDfa3_0(active0, 0x80000000000000L);
       case 114:
          return jjMoveStringLiteralDfa3_0(active0, 0x1e00L);
       case 115:
-         return jjMoveStringLiteralDfa3_0(active0, 0x2001920008000L);
+         return jjMoveStringLiteralDfa3_0(active0, 0x40101920008000L);
       case 116:
          return jjMoveStringLiteralDfa3_0(active0, 0x2020020L);
       case 117:
-         return jjMoveStringLiteralDfa3_0(active0, 0x40000010000000L);
+         return jjMoveStringLiteralDfa3_0(active0, 0x800000010000000L);
       case 118:
          return jjMoveStringLiteralDfa3_0(active0, 0x4000L);
       case 120:
@@ -299,39 +307,39 @@ private int jjMoveStringLiteralDfa3_0(long old0, long active0){
    switch(curChar)
    {
       case 69:
-         if ((active0 & 0x2000000000000L) != 0L)
+         if ((active0 & 0x40000000000000L) != 0L)
          {
-            jjmatchedKind = 49;
+            jjmatchedKind = 54;
             jjmatchedPos = 3;
          }
-         else if ((active0 & 0x40000000000000L) != 0L)
+         else if ((active0 & 0x800000000000000L) != 0L)
          {
-            jjmatchedKind = 54;
+            jjmatchedKind = 59;
             jjmatchedPos = 3;
          }
          return jjMoveStringLiteralDfa4_0(active0, 0x280000L);
       case 70:
-         return jjMoveStringLiteralDfa4_0(active0, 0x8000000000000L);
+         return jjMoveStringLiteralDfa4_0(active0, 0x100000000000000L);
       case 73:
          return jjMoveStringLiteralDfa4_0(active0, 0x500000L);
       case 76:
          return jjMoveStringLiteralDfa4_0(active0, 0x1800000L);
       case 79:
-         return jjMoveStringLiteralDfa4_0(active0, 0x4000000000100L);
+         return jjMoveStringLiteralDfa4_0(active0, 0x80000000000100L);
       case 80:
-         return jjMoveStringLiteralDfa4_0(active0, 0x30000000000000L);
+         return jjMoveStringLiteralDfa4_0(active0, 0x600000000000000L);
       case 83:
-         return jjMoveStringLiteralDfa4_0(active0, 0x80000000000000L);
+         return jjMoveStringLiteralDfa4_0(active0, 0x1000000000000000L);
       case 86:
          return jjMoveStringLiteralDfa4_0(active0, 0x100000000L);
       case 97:
-         return jjMoveStringLiteralDfa4_0(active0, 0x10020000L);
+         return jjMoveStringLiteralDfa4_0(active0, 0x200010020000L);
       case 99:
-         return jjMoveStringLiteralDfa4_0(active0, 0x2000L);
+         return jjMoveStringLiteralDfa4_0(active0, 0x100000002000L);
       case 101:
-         if ((active0 & 0x2000000000000L) != 0L)
+         if ((active0 & 0x80000000000L) != 0L)
          {
-            jjmatchedKind = 49;
+            jjmatchedKind = 43;
             jjmatchedPos = 3;
          }
          else if ((active0 & 0x40000000000000L) != 0L)
@@ -339,9 +347,14 @@ private int jjMoveStringLiteralDfa3_0(long old0, long active0){
             jjmatchedKind = 54;
             jjmatchedPos = 3;
          }
-         return jjMoveStringLiteralDfa4_0(active0, 0x44020L);
+         else if ((active0 & 0x800000000000000L) != 0L)
+         {
+            jjmatchedKind = 59;
+            jjmatchedPos = 3;
+         }
+         return jjMoveStringLiteralDfa4_0(active0, 0x40000044020L);
       case 102:
-         return jjMoveStringLiteralDfa4_0(active0, 0x8000000000000L);
+         return jjMoveStringLiteralDfa4_0(active0, 0x100000000000000L);
       case 103:
          return jjMoveStringLiteralDfa4_0(active0, 0xc001e00L);
       case 106:
@@ -351,15 +364,17 @@ private int jjMoveStringLiteralDfa3_0(long old0, long active0){
       case 110:
          return jjMoveStringLiteralDfa4_0(active0, 0xc8L);
       case 111:
-         return jjMoveStringLiteralDfa4_0(active0, 0x4000080000000L);
+         return jjMoveStringLiteralDfa4_0(active0, 0x80000080000000L);
       case 112:
-         return jjMoveStringLiteralDfa4_0(active0, 0x30000000000000L);
+         return jjMoveStringLiteralDfa4_0(active0, 0x600000000000000L);
       case 113:
          return jjMoveStringLiteralDfa4_0(active0, 0x400000000L);
       case 115:
-         return jjMoveStringLiteralDfa4_0(active0, 0x80001840018000L);
+         return jjMoveStringLiteralDfa4_0(active0, 0x1000001840018000L);
       case 116:
          return jjMoveStringLiteralDfa4_0(active0, 0x2000000L);
+      case 117:
+         return jjMoveStringLiteralDfa4_0(active0, 0x20000000000L);
       default :
          break;
    }
@@ -375,41 +390,41 @@ private int jjMoveStringLiteralDfa4_0(long old0, long active0){
    switch(curChar)
    {
       case 69:
-         if ((active0 & 0x20000000000000L) != 0L)
+         if ((active0 & 0x400000000000000L) != 0L)
          {
-            jjmatchedKind = 53;
+            jjmatchedKind = 58;
             jjmatchedPos = 4;
          }
-         else if ((active0 & 0x80000000000000L) != 0L)
+         else if ((active0 & 0x1000000000000000L) != 0L)
          {
-            jjmatchedKind = 55;
+            jjmatchedKind = 60;
             jjmatchedPos = 4;
          }
-         return jjMoveStringLiteralDfa5_0(active0, 0x10000000000000L);
+         return jjMoveStringLiteralDfa5_0(active0, 0x200000000000000L);
       case 73:
-         return jjMoveStringLiteralDfa5_0(active0, 0x8000000000000L);
+         return jjMoveStringLiteralDfa5_0(active0, 0x100000000000000L);
       case 75:
          return jjMoveStringLiteralDfa5_0(active0, 0x40000L);
       case 82:
-         return jjMoveStringLiteralDfa5_0(active0, 0x4000000000000L);
+         return jjMoveStringLiteralDfa5_0(active0, 0x80000000000000L);
       case 84:
          return jjMoveStringLiteralDfa5_0(active0, 0x1800000000L);
       case 97:
          return jjMoveStringLiteralDfa5_0(active0, 0x100008000L);
       case 101:
-         if ((active0 & 0x20000000000000L) != 0L)
+         if ((active0 & 0x400000000000000L) != 0L)
          {
-            jjmatchedKind = 53;
+            jjmatchedKind = 58;
             jjmatchedPos = 4;
          }
-         else if ((active0 & 0x80000000000000L) != 0L)
+         else if ((active0 & 0x1000000000000000L) != 0L)
          {
-            jjmatchedKind = 55;
+            jjmatchedKind = 60;
             jjmatchedPos = 4;
          }
-         return jjMoveStringLiteralDfa5_0(active0, 0x10000043801e00L);
+         return jjMoveStringLiteralDfa5_0(active0, 0x200000043801e00L);
       case 105:
-         return jjMoveStringLiteralDfa5_0(active0, 0x801e000000000L);
+         return jjMoveStringLiteralDfa5_0(active0, 0x10001e000000000L);
       case 107:
          return jjMoveStringLiteralDfa5_0(active0, 0xc8L);
       case 108:
@@ -418,8 +433,20 @@ private int jjMoveStringLiteralDfa4_0(long old0, long active0){
          return jjMoveStringLiteralDfa5_0(active0, 0x500000L);
       case 111:
          return jjMoveStringLiteralDfa5_0(active0, 0x20000000L);
+      case 112:
+         if ((active0 & 0x20000000000L) != 0L)
+         {
+            jjmatchedKind = 41;
+            jjmatchedPos = 4;
+         }
+         break;
       case 114:
-         return jjMoveStringLiteralDfa5_0(active0, 0x4000080004120L);
+         if ((active0 & 0x40000000000L) != 0L)
+         {
+            jjmatchedKind = 42;
+            jjmatchedPos = 4;
+         }
+         return jjMoveStringLiteralDfa5_0(active0, 0x80100080004120L);
       case 115:
          if ((active0 & 0x10000L) != 0L)
          {
@@ -435,7 +462,7 @@ private int jjMoveStringLiteralDfa4_0(long old0, long active0){
       case 116:
          return jjMoveStringLiteralDfa5_0(active0, 0x22000L);
       case 117:
-         return jjMoveStringLiteralDfa5_0(active0, 0x408000000L);
+         return jjMoveStringLiteralDfa5_0(active0, 0x200408000000L);
       case 120:
          return jjMoveStringLiteralDfa5_0(active0, 0x280000L);
       default :
@@ -453,24 +480,24 @@ private int jjMoveStringLiteralDfa5_0(long old0, long active0){
    switch(curChar)
    {
       case 67:
-         return jjMoveStringLiteralDfa6_0(active0, 0x10000000000000L);
+         return jjMoveStringLiteralDfa6_0(active0, 0x200000000000000L);
       case 76:
          return jjMoveStringLiteralDfa6_0(active0, 0x100L);
       case 78:
          return jjMoveStringLiteralDfa6_0(active0, 0xc8L);
       case 84:
-         return jjMoveStringLiteralDfa6_0(active0, 0x4000000000000L);
+         return jjMoveStringLiteralDfa6_0(active0, 0x80000000000000L);
       case 88:
-         if ((active0 & 0x8000000000000L) != 0L)
+         if ((active0 & 0x100000000000000L) != 0L)
          {
-            jjmatchedKind = 51;
+            jjmatchedKind = 56;
             jjmatchedPos = 5;
          }
          break;
       case 97:
          return jjMoveStringLiteralDfa6_0(active0, 0x8000020L);
       case 99:
-         return jjMoveStringLiteralDfa6_0(active0, 0x10000000780000L);
+         return jjMoveStringLiteralDfa6_0(active0, 0x200000000780000L);
       case 100:
          if ((active0 & 0x40000000L) != 0L)
          {
@@ -487,9 +514,9 @@ private int jjMoveStringLiteralDfa5_0(long old0, long active0){
       case 104:
          return jjMoveStringLiteralDfa6_0(active0, 0x1800000000L);
       case 105:
-         return jjMoveStringLiteralDfa6_0(active0, 0x20046000L);
+         return jjMoveStringLiteralDfa6_0(active0, 0x100020046000L);
       case 108:
-         return jjMoveStringLiteralDfa6_0(active0, 0x100000000L);
+         return jjMoveStringLiteralDfa6_0(active0, 0x200100000000L);
       case 110:
          return jjMoveStringLiteralDfa6_0(active0, 0x1800000L);
       case 114:
@@ -502,11 +529,11 @@ private int jjMoveStringLiteralDfa5_0(long old0, long active0){
          }
          break;
       case 116:
-         return jjMoveStringLiteralDfa6_0(active0, 0x4000000001e00L);
+         return jjMoveStringLiteralDfa6_0(active0, 0x80000000001e00L);
       case 120:
-         if ((active0 & 0x8000000000000L) != 0L)
+         if ((active0 & 0x100000000000000L) != 0L)
          {
-            jjmatchedKind = 51;
+            jjmatchedKind = 56;
             jjmatchedPos = 5;
          }
          break;
@@ -529,15 +556,15 @@ private int jjMoveStringLiteralDfa6_0(long old0, long active0){
       case 67:
          return jjMoveStringLiteralDfa7_0(active0, 0x1000L);
       case 76:
-         return jjMoveStringLiteralDfa7_0(active0, 0x10000400000000L);
+         return jjMoveStringLiteralDfa7_0(active0, 0x200000400000000L);
       case 78:
          return jjMoveStringLiteralDfa7_0(active0, 0x200L);
       case 79:
          return jjMoveStringLiteralDfa7_0(active0, 0x400L);
       case 83:
-         if ((active0 & 0x4000000000000L) != 0L)
+         if ((active0 & 0x80000000000000L) != 0L)
          {
-            jjmatchedKind = 50;
+            jjmatchedKind = 55;
             jjmatchedPos = 6;
          }
          return jjMoveStringLiteralDfa7_0(active0, 0x800L);
@@ -562,7 +589,7 @@ private int jjMoveStringLiteralDfa6_0(long old0, long active0){
             jjmatchedKind = 5;
             jjmatchedPos = 6;
          }
-         return jjMoveStringLiteralDfa7_0(active0, 0x10000000780000L);
+         return jjMoveStringLiteralDfa7_0(active0, 0x200000000780000L);
       case 110:
          if ((active0 & 0x2000000L) != 0L)
          {
@@ -573,16 +600,16 @@ private int jjMoveStringLiteralDfa6_0(long old0, long active0){
       case 111:
          return jjMoveStringLiteralDfa7_0(active0, 0xc8L);
       case 112:
-         return jjMoveStringLiteralDfa7_0(active0, 0x20000L);
+         return jjMoveStringLiteralDfa7_0(active0, 0x100000020000L);
       case 115:
-         if ((active0 & 0x4000000000000L) != 0L)
+         if ((active0 & 0x80000000000000L) != 0L)
          {
-            jjmatchedKind = 50;
+            jjmatchedKind = 55;
             jjmatchedPos = 6;
          }
          break;
       case 116:
-         return jjMoveStringLiteralDfa7_0(active0, 0x4000L);
+         return jjMoveStringLiteralDfa7_0(active0, 0x200000004000L);
       case 117:
          return jjMoveStringLiteralDfa7_0(active0, 0x100000000L);
       case 118:
@@ -602,11 +629,13 @@ private int jjMoveStringLiteralDfa7_0(long old0, long active0){
    switch(curChar)
    {
       case 65:
-         return jjMoveStringLiteralDfa8_0(active0, 0x10000000000000L);
+         return jjMoveStringLiteralDfa8_0(active0, 0x200000000000000L);
       case 80:
          return jjMoveStringLiteralDfa8_0(active0, 0x80000000L);
+      case 86:
+         return jjMoveStringLiteralDfa8_0(active0, 0x200000000000L);
       case 97:
-         return jjMoveStringLiteralDfa8_0(active0, 0x10000400002000L);
+         return jjMoveStringLiteralDfa8_0(active0, 0x200000400002000L);
       case 98:
          return jjMoveStringLiteralDfa8_0(active0, 0x400L);
       case 100:
@@ -645,7 +674,7 @@ private int jjMoveStringLiteralDfa7_0(long old0, long active0){
             jjmatchedKind = 29;
             jjmatchedPos = 7;
          }
-         return jjMoveStringLiteralDfa8_0(active0, 0x1800100L);
+         return jjMoveStringLiteralDfa8_0(active0, 0x100001800100L);
       case 117:
          return jjMoveStringLiteralDfa8_0(active0, 0x780800L);
       case 121:
@@ -674,9 +703,9 @@ private int jjMoveStringLiteralDfa8_0(long old0, long active0){
       case 79:
          return jjMoveStringLiteralDfa9_0(active0, 0x1000000000L);
       case 83:
-         return jjMoveStringLiteralDfa9_0(active0, 0x10000000000000L);
+         return jjMoveStringLiteralDfa9_0(active0, 0x200000000000000L);
       case 97:
-         return jjMoveStringLiteralDfa9_0(active0, 0x1000L);
+         return jjMoveStringLiteralDfa9_0(active0, 0x200000001000L);
       case 98:
          return jjMoveStringLiteralDfa9_0(active0, 0x800L);
       case 100:
@@ -700,6 +729,8 @@ private int jjMoveStringLiteralDfa8_0(long old0, long active0){
             jjmatchedPos = 8;
          }
          break;
+      case 105:
+         return jjMoveStringLiteralDfa9_0(active0, 0x100000000000L);
       case 106:
          return jjMoveStringLiteralDfa9_0(active0, 0x400L);
       case 110:
@@ -707,7 +738,7 @@ private int jjMoveStringLiteralDfa8_0(long old0, long active0){
       case 114:
          return jjMoveStringLiteralDfa9_0(active0, 0x80000000L);
       case 115:
-         return jjMoveStringLiteralDfa9_0(active0, 0x10000000780000L);
+         return jjMoveStringLiteralDfa9_0(active0, 0x200000000780000L);
       case 116:
          return jjMoveStringLiteralDfa9_0(active0, 0x2000L);
       default :
@@ -729,9 +760,9 @@ private int jjMoveStringLiteralDfa9_0(long old0, long active0){
       case 79:
          return jjMoveStringLiteralDfa10_0(active0, 0xc0L);
       case 83:
-         if ((active0 & 0x10000000000000L) != 0L)
+         if ((active0 & 0x200000000000000L) != 0L)
          {
-            jjmatchedKind = 52;
+            jjmatchedKind = 57;
             jjmatchedPos = 9;
          }
          break;
@@ -755,6 +786,8 @@ private int jjMoveStringLiteralDfa9_0(long old0, long active0){
          return jjMoveStringLiteralDfa10_0(active0, 0x780000L);
       case 106:
          return jjMoveStringLiteralDfa10_0(active0, 0x800L);
+      case 108:
+         return jjMoveStringLiteralDfa10_0(active0, 0x200000000000L);
       case 110:
          if ((active0 & 0x8000000L) != 0L)
          {
@@ -763,13 +796,13 @@ private int jjMoveStringLiteralDfa9_0(long old0, long active0){
          }
          break;
       case 111:
-         return jjMoveStringLiteralDfa10_0(active0, 0x80000000L);
+         return jjMoveStringLiteralDfa10_0(active0, 0x100080000000L);
       case 114:
          return jjMoveStringLiteralDfa10_0(active0, 0x1000000100L);
       case 115:
-         if ((active0 & 0x10000000000000L) != 0L)
+         if ((active0 & 0x200000000000000L) != 0L)
          {
-            jjmatchedKind = 52;
+            jjmatchedKind = 57;
             jjmatchedPos = 9;
          }
          return jjMoveStringLiteralDfa10_0(active0, 0x1000L);
@@ -804,6 +837,13 @@ private int jjMoveStringLiteralDfa10_0(long old0, long active0){
          return jjMoveStringLiteralDfa11_0(active0, 0x800L);
       case 105:
          return jjMoveStringLiteralDfa11_0(active0, 0x4000000000L);
+      case 110:
+         if ((active0 & 0x100000000000L) != 0L)
+         {
+            jjmatchedKind = 44;
+            jjmatchedPos = 10;
+         }
+         break;
       case 112:
          return jjMoveStringLiteralDfa11_0(active0, 0x80000000L);
       case 114:
@@ -815,6 +855,8 @@ private int jjMoveStringLiteralDfa10_0(long old0, long active0){
             jjmatchedPos = 10;
          }
          break;
+      case 117:
+         return jjMoveStringLiteralDfa11_0(active0, 0x200000000000L);
       case 118:
          return jjMoveStringLiteralDfa11_0(active0, 0x780000L);
       default :
@@ -858,6 +900,11 @@ private int jjMoveStringLiteralDfa11_0(long old0, long active0){
             jjmatchedKind = 22;
             jjmatchedPos = 11;
          }
+         else if ((active0 & 0x200000000000L) != 0L)
+         {
+            jjmatchedKind = 45;
+            jjmatchedPos = 11;
+         }
          return jjMoveStringLiteralDfa12_0(active0, 0x80000000L);
       case 108:
          if ((active0 & 0x100L) != 0L)
@@ -1301,8 +1348,8 @@ private int jjMoveNfa_0(int startState, int curPos)
                case 0:
                   if ((0x3ff000000000000L & l) != 0L)
                   {
-                     if (kind > 88)
-                        kind = 88;
+                     if (kind > 93)
+                        kind = 93;
                      { jjCheckNAddStates(0, 6); }
                   }
                   else if ((0x280000000000L & l) != 0L)
@@ -1311,8 +1358,8 @@ private int jjMoveNfa_0(int startState, int curPos)
                      { jjCheckNAddTwoStates(164, 166); }
                   else if (curChar == 58)
                   {
-                     if (kind > 76)
-                        kind = 76;
+                     if (kind > 81)
+                        kind = 81;
                      { jjCheckNAddStates(12, 14); }
                   }
                   else if (curChar == 34)
@@ -1323,8 +1370,8 @@ private int jjMoveNfa_0(int startState, int curPos)
                      { jjCheckNAddStates(15, 17); }
                   else if (curChar == 35)
                   {
-                     if (kind > 47)
-                        kind = 47;
+                     if (kind > 52)
+                        kind = 52;
                      { jjCheckNAddStates(18, 20); }
                   }
                   if (curChar == 34)
@@ -1335,17 +1382,17 @@ private int jjMoveNfa_0(int startState, int curPos)
                case 1:
                   if ((0xffffffffffffdbffL & l) == 0L)
                      break;
-                  if (kind > 47)
-                     kind = 47;
+                  if (kind > 52)
+                     kind = 52;
                   { jjCheckNAddStates(18, 20); }
                   break;
                case 2:
-                  if ((0x2400L & l) != 0L && kind > 47)
-                     kind = 47;
+                  if ((0x2400L & l) != 0L && kind > 52)
+                     kind = 52;
                   break;
                case 3:
-                  if (curChar == 10 && kind > 47)
-                     kind = 47;
+                  if (curChar == 10 && kind > 52)
+                     kind = 52;
                   break;
                case 4:
                   if (curChar == 13)
@@ -1377,8 +1424,8 @@ private int jjMoveNfa_0(int startState, int curPos)
                      { jjCheckNAddStates(15, 17); }
                   break;
                case 13:
-                  if (curChar == 62 && kind > 75)
-                     kind = 75;
+                  if (curChar == 62 && kind > 80)
+                     kind = 80;
                   break;
                case 15:
                   if ((0x3ff000000000000L & l) != 0L)
@@ -1405,8 +1452,8 @@ private int jjMoveNfa_0(int startState, int curPos)
                      jjstateSet[jjnewStateCnt++] = 21;
                   break;
                case 23:
-                  if ((0x8400000000L & l) != 0L && kind > 82)
-                     kind = 82;
+                  if ((0x8400000000L & l) != 0L && kind > 87)
+                     kind = 87;
                   break;
                case 24:
                   if (curChar == 39)
@@ -1417,8 +1464,8 @@ private int jjMoveNfa_0(int startState, int curPos)
                      { jjCheckNAddStates(24, 26); }
                   break;
                case 26:
-                  if (curChar == 39 && kind > 83)
-                     kind = 83;
+                  if (curChar == 39 && kind > 88)
+                     kind = 88;
                   break;
                case 28:
                   if ((0x8400000000L & l) != 0L)
@@ -1474,8 +1521,8 @@ private int jjMoveNfa_0(int startState, int curPos)
                      { jjCheckNAddStates(21, 23); }
                   break;
                case 44:
-                  if (curChar == 34 && kind > 84)
-                     kind = 84;
+                  if (curChar == 34 && kind > 89)
+                     kind = 89;
                   break;
                case 46:
                   if ((0x8400000000L & l) != 0L)
@@ -1585,8 +1632,8 @@ private int jjMoveNfa_0(int startState, int curPos)
                      jjstateSet[jjnewStateCnt++] = 79;
                   break;
                case 80:
-                  if (curChar == 39 && kind > 85)
-                     kind = 85;
+                  if (curChar == 39 && kind > 90)
+                     kind = 90;
                   break;
                case 81:
                   if (curChar == 39)
@@ -1663,8 +1710,8 @@ private int jjMoveNfa_0(int startState, int curPos)
                      jjstateSet[jjnewStateCnt++] = 103;
                   break;
                case 104:
-                  if (curChar == 34 && kind > 86)
-                     kind = 86;
+                  if (curChar == 34 && kind > 91)
+                     kind = 91;
                   break;
                case 105:
                   if (curChar == 34)
@@ -1687,8 +1734,8 @@ private int jjMoveNfa_0(int startState, int curPos)
                      jjstateSet[jjnewStateCnt++] = 111;
                   break;
                case 111:
-                  if (curChar == 58 && kind > 76)
-                     kind = 76;
+                  if (curChar == 58 && kind > 81)
+                     kind = 81;
                   break;
                case 112:
                   if ((0x3ff600000000000L & l) != 0L)
@@ -1705,8 +1752,8 @@ private int jjMoveNfa_0(int startState, int curPos)
                case 115:
                   if ((0x7ff000000000000L & l) == 0L)
                      break;
-                  if (kind > 77)
-                     kind = 77;
+                  if (kind > 82)
+                     kind = 82;
                   { jjCheckNAddStates(43, 46); }
                   break;
                case 116:
@@ -1714,8 +1761,8 @@ private int jjMoveNfa_0(int startState, int curPos)
                      { jjCheckNAddStates(43, 46); }
                   break;
                case 117:
-                  if ((0x7ff200000000000L & l) != 0L && kind > 77)
-                     kind = 77;
+                  if ((0x7ff200000000000L & l) != 0L && kind > 82)
+                     kind = 82;
                   break;
                case 119:
                   if ((0xa800fffa00000000L & l) != 0L)
@@ -1738,18 +1785,18 @@ private int jjMoveNfa_0(int startState, int curPos)
                      jjstateSet[jjnewStateCnt++] = 124;
                   break;
                case 124:
-                  if ((0x3ff000000000000L & l) != 0L && kind > 77)
-                     kind = 77;
+                  if ((0x3ff000000000000L & l) != 0L && kind > 82)
+                     kind = 82;
                   break;
                case 125:
-                  if ((0xa800fffa00000000L & l) != 0L && kind > 77)
-                     kind = 77;
+                  if ((0xa800fffa00000000L & l) != 0L && kind > 82)
+                     kind = 82;
                   break;
                case 127:
                   if ((0xa800fffa00000000L & l) == 0L)
                      break;
-                  if (kind > 77)
-                     kind = 77;
+                  if (kind > 82)
+                     kind = 82;
                   { jjCheckNAddStates(43, 46); }
                   break;
                case 128:
@@ -1763,15 +1810,15 @@ private int jjMoveNfa_0(int startState, int curPos)
                case 130:
                   if ((0x3ff000000000000L & l) == 0L)
                      break;
-                  if (kind > 77)
-                     kind = 77;
+                  if (kind > 82)
+                     kind = 82;
                   { jjCheckNAddStates(43, 46); }
                   break;
                case 131:
                   if (curChar != 58)
                      break;
-                  if (kind > 76)
-                     kind = 76;
+                  if (kind > 81)
+                     kind = 81;
                   { jjCheckNAddStates(12, 14); }
                   break;
                case 134:
@@ -1783,8 +1830,8 @@ private int jjMoveNfa_0(int startState, int curPos)
                      jjstateSet[jjnewStateCnt++] = 136;
                   break;
                case 136:
-                  if (curChar == 58 && kind > 78)
-                     kind = 78;
+                  if (curChar == 58 && kind > 83)
+                     kind = 83;
                   break;
                case 138:
                   if ((0x3ff600000000000L & l) != 0L)
@@ -1801,8 +1848,8 @@ private int jjMoveNfa_0(int startState, int curPos)
                case 141:
                   if ((0x7ff000000000000L & l) == 0L)
                      break;
-                  if (kind > 79)
-                     kind = 79;
+                  if (kind > 84)
+                     kind = 84;
                   { jjCheckNAddStates(56, 59); }
                   break;
                case 142:
@@ -1810,8 +1857,8 @@ private int jjMoveNfa_0(int startState, int curPos)
                      { jjCheckNAddStates(56, 59); }
                   break;
                case 143:
-                  if ((0x7ff200000000000L & l) != 0L && kind > 79)
-                     kind = 79;
+                  if ((0x7ff200000000000L & l) != 0L && kind > 84)
+                     kind = 84;
                   break;
                case 145:
                   if ((0xa800fffa00000000L & l) != 0L)
@@ -1834,18 +1881,18 @@ private int jjMoveNfa_0(int startState, int curPos)
                      jjstateSet[jjnewStateCnt++] = 150;
                   break;
                case 150:
-                  if ((0x3ff000000000000L & l) != 0L && kind > 79)
-                     kind = 79;
+                  if ((0x3ff000000000000L & l) != 0L && kind > 84)
+                     kind = 84;
                   break;
                case 151:
-                  if ((0xa800fffa00000000L & l) != 0L && kind > 79)
-                     kind = 79;
+                  if ((0xa800fffa00000000L & l) != 0L && kind > 84)
+                     kind = 84;
                   break;
                case 153:
                   if ((0xa800fffa00000000L & l) == 0L)
                      break;
-                  if (kind > 79)
-                     kind = 79;
+                  if (kind > 84)
+                     kind = 84;
                   { jjCheckNAddStates(56, 59); }
                   break;
                case 154:
@@ -1859,8 +1906,8 @@ private int jjMoveNfa_0(int startState, int curPos)
                case 156:
                   if ((0x3ff000000000000L & l) == 0L)
                      break;
-                  if (kind > 79)
-                     kind = 79;
+                  if (kind > 84)
+                     kind = 84;
                   { jjCheckNAddStates(56, 59); }
                   break;
                case 158:
@@ -1870,8 +1917,8 @@ private int jjMoveNfa_0(int startState, int curPos)
                case 159:
                   if ((0x3ff000000000000L & l) == 0L)
                      break;
-                  if (kind > 92)
-                     kind = 92;
+                  if (kind > 97)
+                     kind = 97;
                   { jjCheckNAddTwoStates(158, 159); }
                   break;
                case 160:
@@ -1881,8 +1928,8 @@ private int jjMoveNfa_0(int startState, int curPos)
                case 161:
                   if ((0x3ff000000000000L & l) == 0L)
                      break;
-                  if (kind > 88)
-                     kind = 88;
+                  if (kind > 93)
+                     kind = 93;
                   { jjCheckNAdd(161); }
                   break;
                case 162:
@@ -1896,8 +1943,8 @@ private int jjMoveNfa_0(int startState, int curPos)
                case 164:
                   if ((0x3ff000000000000L & l) == 0L)
                      break;
-                  if (kind > 89)
-                     kind = 89;
+                  if (kind > 94)
+                     kind = 94;
                   { jjCheckNAdd(164); }
                   break;
                case 165:
@@ -1915,8 +1962,8 @@ private int jjMoveNfa_0(int startState, int curPos)
                case 169:
                   if ((0x3ff000000000000L & l) == 0L)
                      break;
-                  if (kind > 90)
-                     kind = 90;
+                  if (kind > 95)
+                     kind = 95;
                   { jjCheckNAdd(169); }
                   break;
                case 170:
@@ -1942,8 +1989,8 @@ private int jjMoveNfa_0(int startState, int curPos)
                case 176:
                   if ((0x3ff000000000000L & l) == 0L)
                      break;
-                  if (kind > 90)
-                     kind = 90;
+                  if (kind > 95)
+                     kind = 95;
                   { jjCheckNAdd(176); }
                   break;
                case 177:
@@ -1957,15 +2004,15 @@ private int jjMoveNfa_0(int startState, int curPos)
                case 180:
                   if ((0x3ff000000000000L & l) == 0L)
                      break;
-                  if (kind > 90)
-                     kind = 90;
+                  if (kind > 95)
+                     kind = 95;
                   { jjCheckNAdd(180); }
                   break;
                case 181:
                   if ((0x3ff000000000000L & l) == 0L)
                      break;
-                  if (kind > 88)
-                     kind = 88;
+                  if (kind > 93)
+                     kind = 93;
                   { jjCheckNAddStates(0, 6); }
                   break;
                case 182:
@@ -1992,8 +2039,8 @@ private int jjMoveNfa_0(int startState, int curPos)
                      jjstateSet[jjnewStateCnt++] = 23;
                   break;
                case 1:
-                  if (kind > 47)
-                     kind = 47;
+                  if (kind > 52)
+                     kind = 52;
                   { jjAddStates(18, 20); }
                   break;
                case 6:
@@ -2058,8 +2105,8 @@ private int jjMoveNfa_0(int startState, int curPos)
                      jjstateSet[jjnewStateCnt++] = 23;
                   break;
                case 23:
-                  if ((0x14404410000000L & l) != 0L && kind > 82)
-                     kind = 82;
+                  if ((0x14404410000000L & l) != 0L && kind > 87)
+                     kind = 87;
                   break;
                case 25:
                   if ((0xffffffffefffffffL & l) != 0L)
@@ -2328,8 +2375,8 @@ private int jjMoveNfa_0(int startState, int curPos)
                case 115:
                   if ((0x7fffffe87fffffeL & l) == 0L)
                      break;
-                  if (kind > 77)
-                     kind = 77;
+                  if (kind > 82)
+                     kind = 82;
                   { jjCheckNAddStates(43, 46); }
                   break;
                case 116:
@@ -2337,8 +2384,8 @@ private int jjMoveNfa_0(int startState, int curPos)
                      { jjCheckNAddStates(43, 46); }
                   break;
                case 117:
-                  if ((0x7fffffe87fffffeL & l) != 0L && kind > 77)
-                     kind = 77;
+                  if ((0x7fffffe87fffffeL & l) != 0L && kind > 82)
+                     kind = 82;
                   break;
                case 118:
                   if (curChar == 92)
@@ -2361,12 +2408,12 @@ private int jjMoveNfa_0(int startState, int curPos)
                      jjstateSet[jjnewStateCnt++] = 124;
                   break;
                case 124:
-                  if ((0x7e0000007eL & l) != 0L && kind > 77)
-                     kind = 77;
+                  if ((0x7e0000007eL & l) != 0L && kind > 82)
+                     kind = 82;
                   break;
                case 125:
-                  if ((0x4000000080000001L & l) != 0L && kind > 77)
-                     kind = 77;
+                  if ((0x4000000080000001L & l) != 0L && kind > 82)
+                     kind = 82;
                   break;
                case 126:
                   if (curChar == 92)
@@ -2375,8 +2422,8 @@ private int jjMoveNfa_0(int startState, int curPos)
                case 127:
                   if ((0x4000000080000001L & l) == 0L)
                      break;
-                  if (kind > 77)
-                     kind = 77;
+                  if (kind > 82)
+                     kind = 82;
                   { jjCheckNAddStates(43, 46); }
                   break;
                case 129:
@@ -2386,8 +2433,8 @@ private int jjMoveNfa_0(int startState, int curPos)
                case 130:
                   if ((0x7e0000007eL & l) == 0L)
                      break;
-                  if (kind > 77)
-                     kind = 77;
+                  if (kind > 82)
+                     kind = 82;
                   { jjCheckNAddStates(43, 46); }
                   break;
                case 132:
@@ -2421,8 +2468,8 @@ private int jjMoveNfa_0(int startState, int curPos)
                case 141:
                   if ((0x7fffffe87fffffeL & l) == 0L)
                      break;
-                  if (kind > 79)
-                     kind = 79;
+                  if (kind > 84)
+                     kind = 84;
                   { jjCheckNAddStates(56, 59); }
                   break;
                case 142:
@@ -2430,8 +2477,8 @@ private int jjMoveNfa_0(int startState, int curPos)
                      { jjCheckNAddStates(56, 59); }
                   break;
                case 143:
-                  if ((0x7fffffe87fffffeL & l) != 0L && kind > 79)
-                     kind = 79;
+                  if ((0x7fffffe87fffffeL & l) != 0L && kind > 84)
+                     kind = 84;
                   break;
                case 144:
                   if (curChar == 92)
@@ -2454,12 +2501,12 @@ private int jjMoveNfa_0(int startState, int curPos)
                      jjstateSet[jjnewStateCnt++] = 150;
                   break;
                case 150:
-                  if ((0x7e0000007eL & l) != 0L && kind > 79)
-                     kind = 79;
+                  if ((0x7e0000007eL & l) != 0L && kind > 84)
+                     kind = 84;
                   break;
                case 151:
-                  if ((0x4000000080000001L & l) != 0L && kind > 79)
-                     kind = 79;
+                  if ((0x4000000080000001L & l) != 0L && kind > 84)
+                     kind = 84;
                   break;
                case 152:
                   if (curChar == 92)
@@ -2468,8 +2515,8 @@ private int jjMoveNfa_0(int startState, int curPos)
                case 153:
                   if ((0x4000000080000001L & l) == 0L)
                      break;
-                  if (kind > 79)
-                     kind = 79;
+                  if (kind > 84)
+                     kind = 84;
                   { jjCheckNAddStates(56, 59); }
                   break;
                case 155:
@@ -2479,22 +2526,22 @@ private int jjMoveNfa_0(int startState, int curPos)
                case 156:
                   if ((0x7e0000007eL & l) == 0L)
                      break;
-                  if (kind > 79)
-                     kind = 79;
+                  if (kind > 84)
+                     kind = 84;
                   { jjCheckNAddStates(56, 59); }
                   break;
                case 157:
                   if ((0x7fffffe07fffffeL & l) == 0L)
                      break;
-                  if (kind > 92)
-                     kind = 92;
+                  if (kind > 97)
+                     kind = 97;
                   { jjCheckNAddTwoStates(157, 158); }
                   break;
                case 159:
                   if ((0x7fffffe07fffffeL & l) == 0L)
                      break;
-                  if (kind > 92)
-                     kind = 92;
+                  if (kind > 97)
+                     kind = 97;
                   { jjCheckNAddTwoStates(158, 159); }
                   break;
                case 167:
@@ -2531,8 +2578,8 @@ private int jjMoveNfa_0(int startState, int curPos)
                case 1:
                   if (!jjCanMove_0(hiByte, i1, i2, l1, l2))
                      break;
-                  if (kind > 47)
-                     kind = 47;
+                  if (kind > 52)
+                     kind = 52;
                   { jjAddStates(18, 20); }
                   break;
                case 6:
@@ -2574,8 +2621,8 @@ private int jjMoveNfa_0(int startState, int curPos)
                case 115:
                   if (!jjCanMove_1(hiByte, i1, i2, l1, l2))
                      break;
-                  if (kind > 77)
-                     kind = 77;
+                  if (kind > 82)
+                     kind = 82;
                   { jjCheckNAddStates(43, 46); }
                   break;
                case 116:
@@ -2583,8 +2630,8 @@ private int jjMoveNfa_0(int startState, int curPos)
                      { jjCheckNAddStates(43, 46); }
                   break;
                case 117:
-                  if (jjCanMove_2(hiByte, i1, i2, l1, l2) && kind > 77)
-                     kind = 77;
+                  if (jjCanMove_2(hiByte, i1, i2, l1, l2) && kind > 82)
+                     kind = 82;
                   break;
                case 133:
                   if (jjCanMove_1(hiByte, i1, i2, l1, l2))
@@ -2613,8 +2660,8 @@ private int jjMoveNfa_0(int startState, int curPos)
                case 141:
                   if (!jjCanMove_1(hiByte, i1, i2, l1, l2))
                      break;
-                  if (kind > 79)
-                     kind = 79;
+                  if (kind > 84)
+                     kind = 84;
                   { jjCheckNAddStates(56, 59); }
                   break;
                case 142:
@@ -2622,8 +2669,8 @@ private int jjMoveNfa_0(int startState, int curPos)
                      { jjCheckNAddStates(56, 59); }
                   break;
                case 143:
-                  if (jjCanMove_2(hiByte, i1, i2, l1, l2) && kind > 79)
-                     kind = 79;
+                  if (jjCanMove_2(hiByte, i1, i2, l1, l2) && kind > 84)
+                     kind = 84;
                   break;
                default : if (i1 == 0 || l1 == 0 || i2 == 0 ||  l2 == 0) break; else break;
             }
@@ -2751,12 +2798,13 @@ public static final String[] jjstrLiteralImages = {
 "\154\145\163\163\124\150\141\156\117\162\105\161\165\141\154\163", 
 "\161\165\141\154\151\146\151\145\144\126\141\154\165\145\123\150\141\160\145", "\161\165\141\154\151\146\151\145\144\115\151\156\103\157\165\156\164", 
 "\161\165\141\154\151\146\151\145\144\115\141\170\103\157\165\156\164", 
-"\161\165\141\154\151\146\151\145\144\126\141\154\165\145\123\150\141\160\145\163\104\151\163\152\157\151\156\164", "\136\136", null, null, null, null, null, null, "\ufeff", null, null, null, 
-null, null, null, null, null, "\53", "\55", "\174", "\100", "\136", "\56", "\41", 
-"\77", "\57", "\52", "\75", "\50", "\51", "\173", "\175", "\133", "\135", null, null, 
-null, null, null, null, null, null, null, null, null, null, null, null, null, null, 
+"\161\165\141\154\151\146\151\145\144\126\141\154\165\145\123\150\141\160\145\163\104\151\163\152\157\151\156\164", "\147\162\157\165\160", "\157\162\144\145\162", "\156\141\155\145", 
+"\144\145\163\143\162\151\160\164\151\157\156", "\144\145\146\141\165\154\164\126\141\154\165\145", "\136\136", null, null, 
+null, null, null, null, "\ufeff", null, null, null, null, null, null, null, null, 
+"\53", "\55", "\174", "\100", "\136", "\56", "\41", "\77", "\57", "\52", "\75", 
+"\50", "\51", "\173", "\175", "\133", "\135", null, null, null, null, null, null, 
 null, null, null, null, null, null, null, null, null, null, null, null, null, null, 
-null, };
+null, null, null, null, null, null, null, null, null, null, null, };
 protected Token jjFillToken()
 {
    final Token t;
@@ -2943,13 +2991,13 @@ public static final String[] lexStateNames = {
    "DEFAULT",
 };
 static final long[] jjtoToken = {
-   0xfeff03ffffffffffL, 0x177cfbffL, 
+   0xdfe07fffffffffffL, 0x2ef9f7fffL, 
 };
 static final long[] jjtoSkip = {
-   0xfc0000000000L, 0x0L, 
+   0x1f800000000000L, 0x0L, 
 };
 static final long[] jjtoSpecial = {
-   0x800000000000L, 0x0L, 
+   0x10000000000000L, 0x0L, 
 };
     protected SimpleCharStream  input_stream;
 
diff --git a/jena-shacl/src/main/java/org/apache/jena/shacl/engine/constraint/CompactOut.java b/jena-shacl/src/main/java/org/apache/jena/shacl/compact/writer/CompactOut.java
similarity index 98%
rename from jena-shacl/src/main/java/org/apache/jena/shacl/engine/constraint/CompactOut.java
rename to jena-shacl/src/main/java/org/apache/jena/shacl/compact/writer/CompactOut.java
index 3f7cbf0..ed6c0f9 100644
--- a/jena-shacl/src/main/java/org/apache/jena/shacl/engine/constraint/CompactOut.java
+++ b/jena-shacl/src/main/java/org/apache/jena/shacl/compact/writer/CompactOut.java
@@ -16,7 +16,7 @@
  * limitations under the License.
  */
 
-package org.apache.jena.shacl.engine.constraint;
+package org.apache.jena.shacl.compact.writer;
 
 import java.util.Collection;
 
diff --git a/jena-shacl/src/main/java/org/apache/jena/shacl/compact/writer/CompactWriter.java b/jena-shacl/src/main/java/org/apache/jena/shacl/compact/writer/CompactWriter.java
index 83001e1..734b5e8 100644
--- a/jena-shacl/src/main/java/org/apache/jena/shacl/compact/writer/CompactWriter.java
+++ b/jena-shacl/src/main/java/org/apache/jena/shacl/compact/writer/CompactWriter.java
@@ -18,11 +18,13 @@
 
 package org.apache.jena.shacl.compact.writer;
 
+import java.util.Collection;
 import java.util.List;
 import java.util.stream.Collectors;
 
 import org.apache.jena.atlas.io.IndentedLineBuffer;
 import org.apache.jena.atlas.io.IndentedWriter;
+import org.apache.jena.atlas.lib.CollectionUtils;
 import org.apache.jena.riot.out.NodeFormatter;
 import org.apache.jena.riot.out.NodeFormatterTTL;
 import org.apache.jena.riot.system.PrefixMap;
@@ -190,10 +192,10 @@ public class CompactWriter {
             return null;
         if ( ! other.getPropertyShapes().isEmpty() )
             return null;
-        List<Constraint> constraints = other.getConstraints();
+        Collection<Constraint> constraints = other.getConstraints();
         if ( constraints.size() != 1 )
             return null;
-        return constraints.get(0);
+        return CollectionUtils.oneElt(constraints);
     }
 
     private static void notShaclc(String string) {
diff --git a/jena-shacl/src/main/java/org/apache/jena/shacl/compact/writer/ShapeOutputVisitor.java b/jena-shacl/src/main/java/org/apache/jena/shacl/compact/writer/ShapeOutputVisitor.java
index c6d5129..818e646 100644
--- a/jena-shacl/src/main/java/org/apache/jena/shacl/compact/writer/ShapeOutputVisitor.java
+++ b/jena-shacl/src/main/java/org/apache/jena/shacl/compact/writer/ShapeOutputVisitor.java
@@ -18,7 +18,7 @@
 
 package org.apache.jena.shacl.compact.writer;
 
-import static org.apache.jena.shacl.engine.constraint.CompactOut.*;
+import static org.apache.jena.shacl.compact.writer.CompactOut.*;
 
 import org.apache.jena.atlas.io.IndentedWriter;
 import org.apache.jena.riot.out.NodeFormatter;
diff --git a/jena-shacl/src/main/java/org/apache/jena/shacl/engine/ValidationContext.java b/jena-shacl/src/main/java/org/apache/jena/shacl/engine/ValidationContext.java
index 1e34f3e..7dbbc53 100644
--- a/jena-shacl/src/main/java/org/apache/jena/shacl/engine/ValidationContext.java
+++ b/jena-shacl/src/main/java/org/apache/jena/shacl/engine/ValidationContext.java
@@ -20,10 +20,12 @@ package org.apache.jena.shacl.engine;
 
 import org.apache.jena.graph.Graph;
 import org.apache.jena.graph.Node;
+import org.apache.jena.riot.system.ErrorHandler;
 import org.apache.jena.shacl.Shapes;
 import org.apache.jena.shacl.ValidationReport;
 import org.apache.jena.shacl.parser.Constraint;
 import org.apache.jena.shacl.parser.Shape;
+import org.apache.jena.shacl.sys.ShaclSystem;
 import org.apache.jena.shacl.validation.ReportItem;
 import org.apache.jena.sparql.path.Path;
 
@@ -33,12 +35,19 @@ public class ValidationContext {
 
     private final ValidationReport.Builder validationReportBuilder = ValidationReport.create();
     private boolean verbose = false;
+    private boolean seenValidationReportEntry = false;
     private final Shapes shapes;
     private final Graph dataGraph;
     private boolean strict = false;
 
+    private final ErrorHandler errorHandler;
+
     public static ValidationContext create(Shapes shapes, Graph data) {
-        ValidationContext vCxt = new ValidationContext(shapes, data);
+        return create(shapes, data, ShaclSystem.systemShaclErrorHandler);
+    }
+    
+    public static ValidationContext create(Shapes shapes, Graph data, ErrorHandler errorHandler) {
+        ValidationContext vCxt = new ValidationContext(shapes, data, errorHandler);
         vCxt.setVerbose(VERBOSE);
         return vCxt;
     }
@@ -52,11 +61,15 @@ public class ValidationContext {
         this.dataGraph = vCxt.dataGraph;
         this.verbose = vCxt.verbose;
         this.strict = vCxt.strict;
+        this.errorHandler = vCxt.errorHandler;
     }
 
-    private ValidationContext(Shapes shapes, Graph data) {
+    private ValidationContext(Shapes shapes, Graph data, ErrorHandler errorHandler) {
         this.shapes = shapes;
         this.dataGraph = data;
+        if ( errorHandler == null )
+            errorHandler = ShaclSystem.systemShaclErrorHandler;
+        this.errorHandler = errorHandler;
         validationReportBuilder.addPrefixes(data.getPrefixMapping());
         validationReportBuilder.addPrefixes(shapes.getGraph().getPrefixMapping());
     }
@@ -70,6 +83,7 @@ public class ValidationContext {
     public void reportEntry(String message, Shape shape, Node focusNode, Path path, Node valueNode, Constraint constraint) {
         if ( verbose )
             System.out.println("Validation report entry");
+        seenValidationReportEntry = true;
         validationReportBuilder.addReportEntry(message, shape, focusNode, path, valueNode, constraint);
     }
 
@@ -77,6 +91,8 @@ public class ValidationContext {
         return validationReportBuilder.build();
     }
 
+    public boolean hasViolation() { return seenValidationReportEntry; }
+
     public void setVerbose(boolean value) {
         this.verbose = value;
     }
@@ -103,4 +119,9 @@ public class ValidationContext {
     public Graph getDataGraph() {
         return dataGraph;
     }
+    
+    public ErrorHandler getErrorHandler() {
+        return errorHandler;
+    }
+
 }
diff --git a/jena-shacl/src/main/java/org/apache/jena/shacl/engine/constraint/ClassConstraint.java b/jena-shacl/src/main/java/org/apache/jena/shacl/engine/constraint/ClassConstraint.java
index e8f1a93..1d34754 100644
--- a/jena-shacl/src/main/java/org/apache/jena/shacl/engine/constraint/ClassConstraint.java
+++ b/jena-shacl/src/main/java/org/apache/jena/shacl/engine/constraint/ClassConstraint.java
@@ -18,7 +18,7 @@
 
 package org.apache.jena.shacl.engine.constraint;
 
-import static org.apache.jena.shacl.engine.constraint.CompactOut.compact;
+import static org.apache.jena.shacl.compact.writer.CompactOut.compact;
 import static org.apache.jena.shacl.lib.ShLib.displayStr;
 
 import java.util.List;
diff --git a/jena-shacl/src/main/java/org/apache/jena/shacl/engine/constraint/ClosedConstraint.java b/jena-shacl/src/main/java/org/apache/jena/shacl/engine/constraint/ClosedConstraint.java
index d808604..6e0fbe3 100644
--- a/jena-shacl/src/main/java/org/apache/jena/shacl/engine/constraint/ClosedConstraint.java
+++ b/jena-shacl/src/main/java/org/apache/jena/shacl/engine/constraint/ClosedConstraint.java
@@ -18,7 +18,7 @@
 
 package org.apache.jena.shacl.engine.constraint;
 
-import static org.apache.jena.shacl.engine.constraint.CompactOut.*;
+import static org.apache.jena.shacl.compact.writer.CompactOut.*;
 import static org.apache.jena.shacl.lib.ShLib.displayStr;
 
 import java.util.*;
diff --git a/jena-shacl/src/main/java/org/apache/jena/shacl/engine/constraint/DatatypeConstraint.java b/jena-shacl/src/main/java/org/apache/jena/shacl/engine/constraint/DatatypeConstraint.java
index 64d6d07..3285089 100644
--- a/jena-shacl/src/main/java/org/apache/jena/shacl/engine/constraint/DatatypeConstraint.java
+++ b/jena-shacl/src/main/java/org/apache/jena/shacl/engine/constraint/DatatypeConstraint.java
@@ -18,7 +18,7 @@
 
 package org.apache.jena.shacl.engine.constraint;
 
-import static org.apache.jena.shacl.engine.constraint.CompactOut.compact;
+import static org.apache.jena.shacl.compact.writer.CompactOut.compact;
 import static org.apache.jena.shacl.lib.ShLib.displayStr;
 
 import java.util.Objects;
diff --git a/jena-shacl/src/main/java/org/apache/jena/shacl/engine/constraint/DisjointConstraint.java b/jena-shacl/src/main/java/org/apache/jena/shacl/engine/constraint/DisjointConstraint.java
index 14c02de..d2d7bec 100644
--- a/jena-shacl/src/main/java/org/apache/jena/shacl/engine/constraint/DisjointConstraint.java
+++ b/jena-shacl/src/main/java/org/apache/jena/shacl/engine/constraint/DisjointConstraint.java
@@ -18,7 +18,7 @@
 
 package org.apache.jena.shacl.engine.constraint;
 
-import static org.apache.jena.shacl.engine.constraint.CompactOut.compactArrayNodes;
+import static org.apache.jena.shacl.compact.writer.CompactOut.compactArrayNodes;
 import static org.apache.jena.shacl.lib.ShLib.displayStr;
 
 import java.util.Objects;
diff --git a/jena-shacl/src/main/java/org/apache/jena/shacl/engine/constraint/EqualsConstraint.java b/jena-shacl/src/main/java/org/apache/jena/shacl/engine/constraint/EqualsConstraint.java
index 673d708..7a3072b 100644
--- a/jena-shacl/src/main/java/org/apache/jena/shacl/engine/constraint/EqualsConstraint.java
+++ b/jena-shacl/src/main/java/org/apache/jena/shacl/engine/constraint/EqualsConstraint.java
@@ -18,7 +18,7 @@
 
 package org.apache.jena.shacl.engine.constraint;
 
-import static org.apache.jena.shacl.engine.constraint.CompactOut.compact;
+import static org.apache.jena.shacl.compact.writer.CompactOut.compact;
 import static org.apache.jena.shacl.lib.ShLib.displayStr;
 
 import java.util.Objects;
diff --git a/jena-shacl/src/main/java/org/apache/jena/shacl/engine/constraint/HasValueConstraint.java b/jena-shacl/src/main/java/org/apache/jena/shacl/engine/constraint/HasValueConstraint.java
index da50e37..8a18875 100644
--- a/jena-shacl/src/main/java/org/apache/jena/shacl/engine/constraint/HasValueConstraint.java
+++ b/jena-shacl/src/main/java/org/apache/jena/shacl/engine/constraint/HasValueConstraint.java
@@ -18,7 +18,7 @@
 
 package org.apache.jena.shacl.engine.constraint;
 
-import static org.apache.jena.shacl.engine.constraint.CompactOut.compact;
+import static org.apache.jena.shacl.compact.writer.CompactOut.compact;
 import static org.apache.jena.shacl.lib.ShLib.displayStr;
 
 import java.util.Objects;
diff --git a/jena-shacl/src/main/java/org/apache/jena/shacl/engine/constraint/InConstraint.java b/jena-shacl/src/main/java/org/apache/jena/shacl/engine/constraint/InConstraint.java
index 910040c..cb9bdeb 100644
--- a/jena-shacl/src/main/java/org/apache/jena/shacl/engine/constraint/InConstraint.java
+++ b/jena-shacl/src/main/java/org/apache/jena/shacl/engine/constraint/InConstraint.java
@@ -18,7 +18,7 @@
 
 package org.apache.jena.shacl.engine.constraint;
 
-import static org.apache.jena.shacl.engine.constraint.CompactOut.compactArrayNodes;
+import static org.apache.jena.shacl.compact.writer.CompactOut.compactArrayNodes;
 import static org.apache.jena.shacl.lib.ShLib.displayStr;
 
 import java.util.ArrayList;
diff --git a/jena-shacl/src/main/java/org/apache/jena/shacl/engine/constraint/InConstraint.java b/jena-shacl/src/main/java/org/apache/jena/shacl/engine/constraint/JLogConstraint.java
similarity index 56%
copy from jena-shacl/src/main/java/org/apache/jena/shacl/engine/constraint/InConstraint.java
copy to jena-shacl/src/main/java/org/apache/jena/shacl/engine/constraint/JLogConstraint.java
index 910040c..1a20b89 100644
--- a/jena-shacl/src/main/java/org/apache/jena/shacl/engine/constraint/InConstraint.java
+++ b/jena-shacl/src/main/java/org/apache/jena/shacl/engine/constraint/JLogConstraint.java
@@ -18,55 +18,44 @@
 
 package org.apache.jena.shacl.engine.constraint;
 
-import static org.apache.jena.shacl.engine.constraint.CompactOut.compactArrayNodes;
-import static org.apache.jena.shacl.lib.ShLib.displayStr;
-
-import java.util.ArrayList;
-import java.util.List;
 import java.util.Objects;
 
-import org.apache.jena.atlas.io.IndentedWriter;
 import org.apache.jena.graph.Node;
-import org.apache.jena.riot.out.NodeFormatter;
 import org.apache.jena.shacl.engine.ValidationContext;
+import org.apache.jena.shacl.lib.ShLib;
+import org.apache.jena.shacl.sys.ShaclSystem;
 import org.apache.jena.shacl.validation.ReportItem;
-import org.apache.jena.shacl.vocabulary.SHACL;
+import org.apache.jena.shacl.vocabulary.SHJ;
 
-/** sh:in */
-public class InConstraint extends ConstraintTerm {
+/** A constraint that logs when touched but does not causes a violation */
+public class JLogConstraint extends ConstraintTerm {
 
-    private final List<Node> values = new ArrayList<>();
+    private final String message;
 
-    public InConstraint(List<Node> list) {
-        values.addAll(list);
+    public JLogConstraint(String message) {
+        this.message = message;
     }
 
     @Override
     public Node getComponent() {
-        return SHACL.InConstraintComponent;
+        return SHJ.LogConstraintComponent;
     }
 
     @Override
     public ReportItem validate(ValidationContext vCxt, Node n) {
-        if ( values.contains(n) )
-            return null;
-        String errMsg = toString()+" : RDF term "+displayStr(n)+" not in expected values";
-        return new ReportItem(errMsg, n);
-    }
-
-    @Override
-    public void printCompact(IndentedWriter out, NodeFormatter nodeFmt) {
-        compactArrayNodes(out, nodeFmt, "in", values);
+        String msg = String.format("%s[%s]", message, ShLib.displayStr(n));
+        ShaclSystem.systemShaclLogger.warn(msg);
+        return null;
     }
 
     @Override
     public String toString() {
-        return "InConstraint"+values;
+        return "Log["+message+"]";
     }
 
     @Override
     public int hashCode() {
-        return Objects.hash(values);
+        return Objects.hash(message);
     }
 
     @Override
@@ -75,9 +64,10 @@ public class InConstraint extends ConstraintTerm {
             return true;
         if ( obj == null )
             return false;
-        if ( !(obj instanceof InConstraint) )
+        if ( getClass() != obj.getClass() )
             return false;
-        InConstraint other = (InConstraint)obj;
-        return Objects.equals(values, other.values);
+        JLogConstraint other = (JLogConstraint)obj;
+        return Objects.equals(message, other.message);
     }
 }
+
diff --git a/jena-shacl/src/main/java/org/apache/jena/shacl/engine/constraint/InConstraint.java b/jena-shacl/src/main/java/org/apache/jena/shacl/engine/constraint/JViolationConstraint.java
similarity index 63%
copy from jena-shacl/src/main/java/org/apache/jena/shacl/engine/constraint/InConstraint.java
copy to jena-shacl/src/main/java/org/apache/jena/shacl/engine/constraint/JViolationConstraint.java
index 910040c..4aac907 100644
--- a/jena-shacl/src/main/java/org/apache/jena/shacl/engine/constraint/InConstraint.java
+++ b/jena-shacl/src/main/java/org/apache/jena/shacl/engine/constraint/JViolationConstraint.java
@@ -18,55 +18,48 @@
 
 package org.apache.jena.shacl.engine.constraint;
 
-import static org.apache.jena.shacl.engine.constraint.CompactOut.compactArrayNodes;
-import static org.apache.jena.shacl.lib.ShLib.displayStr;
-
-import java.util.ArrayList;
-import java.util.List;
-import java.util.Objects;
-
 import org.apache.jena.atlas.io.IndentedWriter;
 import org.apache.jena.graph.Node;
 import org.apache.jena.riot.out.NodeFormatter;
+import org.apache.jena.shacl.compact.writer.CompactOut;
 import org.apache.jena.shacl.engine.ValidationContext;
 import org.apache.jena.shacl.validation.ReportItem;
-import org.apache.jena.shacl.vocabulary.SHACL;
+import org.apache.jena.shacl.vocabulary.SHJ;
 
-/** sh:in */
-public class InConstraint extends ConstraintTerm {
+/** A constraint that causes a violation if it's object is "true" */
+public class JViolationConstraint extends ConstraintTerm {
 
-    private final List<Node> values = new ArrayList<>();
+    private final boolean generateViolation;
 
-    public InConstraint(List<Node> list) {
-        values.addAll(list);
+    public JViolationConstraint(boolean generateViolation) {
+        this.generateViolation = generateViolation;
     }
 
     @Override
     public Node getComponent() {
-        return SHACL.InConstraintComponent;
+        return SHJ.ViolationConstraintComponent;
     }
 
     @Override
     public ReportItem validate(ValidationContext vCxt, Node n) {
-        if ( values.contains(n) )
+        if ( ! generateViolation )
             return null;
-        String errMsg = toString()+" : RDF term "+displayStr(n)+" not in expected values";
-        return new ReportItem(errMsg, n);
+        return new ReportItem("Violation");
     }
 
     @Override
     public void printCompact(IndentedWriter out, NodeFormatter nodeFmt) {
-        compactArrayNodes(out, nodeFmt, "in", values);
+        CompactOut.compactUnquotedString(out, "violation", Boolean.toString(generateViolation));
     }
 
     @Override
     public String toString() {
-        return "InConstraint"+values;
+        return "Violation["+generateViolation+"]";
     }
 
     @Override
     public int hashCode() {
-        return Objects.hash(values);
+        return 158+(generateViolation?1:2);
     }
 
     @Override
@@ -75,9 +68,10 @@ public class InConstraint extends ConstraintTerm {
             return true;
         if ( obj == null )
             return false;
-        if ( !(obj instanceof InConstraint) )
+        if ( getClass() != obj.getClass() )
             return false;
-        InConstraint other = (InConstraint)obj;
-        return Objects.equals(values, other.values);
+        JViolationConstraint other = (JViolationConstraint)obj;
+        return generateViolation == other.generateViolation;
     }
 }
+
diff --git a/jena-shacl/src/main/java/org/apache/jena/shacl/engine/constraint/LessThanConstraint.java b/jena-shacl/src/main/java/org/apache/jena/shacl/engine/constraint/LessThanConstraint.java
index 84ced0a..81a06fa 100644
--- a/jena-shacl/src/main/java/org/apache/jena/shacl/engine/constraint/LessThanConstraint.java
+++ b/jena-shacl/src/main/java/org/apache/jena/shacl/engine/constraint/LessThanConstraint.java
@@ -18,7 +18,7 @@
 
 package org.apache.jena.shacl.engine.constraint;
 
-import static org.apache.jena.shacl.engine.constraint.CompactOut.compact;
+import static org.apache.jena.shacl.compact.writer.CompactOut.compact;
 import static org.apache.jena.shacl.lib.ShLib.displayStr;
 
 import java.util.Objects;
diff --git a/jena-shacl/src/main/java/org/apache/jena/shacl/engine/constraint/LessThanOrEqualsConstraint.java b/jena-shacl/src/main/java/org/apache/jena/shacl/engine/constraint/LessThanOrEqualsConstraint.java
index a625b6c..0a36e56 100644
--- a/jena-shacl/src/main/java/org/apache/jena/shacl/engine/constraint/LessThanOrEqualsConstraint.java
+++ b/jena-shacl/src/main/java/org/apache/jena/shacl/engine/constraint/LessThanOrEqualsConstraint.java
@@ -18,7 +18,7 @@
 
 package org.apache.jena.shacl.engine.constraint;
 
-import static org.apache.jena.shacl.engine.constraint.CompactOut.compact;
+import static org.apache.jena.shacl.compact.writer.CompactOut.compact;
 import static org.apache.jena.shacl.lib.ShLib.displayStr;
 
 import java.util.Objects;
diff --git a/jena-shacl/src/main/java/org/apache/jena/shacl/engine/constraint/PatternConstraint.java b/jena-shacl/src/main/java/org/apache/jena/shacl/engine/constraint/PatternConstraint.java
index a2b3db3..c3fc4a5 100644
--- a/jena-shacl/src/main/java/org/apache/jena/shacl/engine/constraint/PatternConstraint.java
+++ b/jena-shacl/src/main/java/org/apache/jena/shacl/engine/constraint/PatternConstraint.java
@@ -18,7 +18,7 @@
 
 package org.apache.jena.shacl.engine.constraint;
 
-import static org.apache.jena.shacl.engine.constraint.CompactOut.*;
+import static org.apache.jena.shacl.compact.writer.CompactOut.*;
 
 import java.util.Objects;
 import java.util.regex.Pattern;
diff --git a/jena-shacl/src/main/java/org/apache/jena/shacl/engine/constraint/QualifiedValueShape.java b/jena-shacl/src/main/java/org/apache/jena/shacl/engine/constraint/QualifiedValueShape.java
index 14199b4..9dc8ddc 100644
--- a/jena-shacl/src/main/java/org/apache/jena/shacl/engine/constraint/QualifiedValueShape.java
+++ b/jena-shacl/src/main/java/org/apache/jena/shacl/engine/constraint/QualifiedValueShape.java
@@ -26,6 +26,7 @@ import org.apache.jena.graph.Node;
 import org.apache.jena.riot.out.NodeFormatter;
 import org.apache.jena.shacl.ShaclException;
 import org.apache.jena.shacl.ValidationReport;
+import org.apache.jena.shacl.compact.writer.CompactOut;
 import org.apache.jena.shacl.compact.writer.CompactWriter;
 import org.apache.jena.shacl.engine.ValidationContext;
 import org.apache.jena.shacl.lib.G;
diff --git a/jena-shacl/src/main/java/org/apache/jena/shacl/engine/constraint/ReportConstraint.java b/jena-shacl/src/main/java/org/apache/jena/shacl/engine/constraint/ReportConstraint.java
index e728858..b5f0be2 100644
--- a/jena-shacl/src/main/java/org/apache/jena/shacl/engine/constraint/ReportConstraint.java
+++ b/jena-shacl/src/main/java/org/apache/jena/shacl/engine/constraint/ReportConstraint.java
@@ -18,7 +18,7 @@
 
 package org.apache.jena.shacl.engine.constraint;
 
-import static org.apache.jena.shacl.engine.constraint.CompactOut.compactQuotedString;
+import static org.apache.jena.shacl.compact.writer.CompactOut.compactQuotedString;
 
 import java.util.Set;
 
diff --git a/jena-shacl/src/main/java/org/apache/jena/shacl/engine/constraint/StrLanguageIn.java b/jena-shacl/src/main/java/org/apache/jena/shacl/engine/constraint/StrLanguageIn.java
index 72a28d7..fa9027e 100644
--- a/jena-shacl/src/main/java/org/apache/jena/shacl/engine/constraint/StrLanguageIn.java
+++ b/jena-shacl/src/main/java/org/apache/jena/shacl/engine/constraint/StrLanguageIn.java
@@ -18,7 +18,7 @@
 
 package org.apache.jena.shacl.engine.constraint;
 
-import static org.apache.jena.shacl.engine.constraint.CompactOut.compactArrayString;
+import static org.apache.jena.shacl.compact.writer.CompactOut.compactArrayString;
 
 import java.util.List;
 import java.util.Objects;
diff --git a/jena-shacl/src/main/java/org/apache/jena/shacl/engine/constraint/StrMaxLengthConstraint.java b/jena-shacl/src/main/java/org/apache/jena/shacl/engine/constraint/StrMaxLengthConstraint.java
index 2eb8749..73ec972 100644
--- a/jena-shacl/src/main/java/org/apache/jena/shacl/engine/constraint/StrMaxLengthConstraint.java
+++ b/jena-shacl/src/main/java/org/apache/jena/shacl/engine/constraint/StrMaxLengthConstraint.java
@@ -18,7 +18,7 @@
 
 package org.apache.jena.shacl.engine.constraint;
 
-import static org.apache.jena.shacl.engine.constraint.CompactOut.compact;
+import static org.apache.jena.shacl.compact.writer.CompactOut.compact;
 
 import java.util.Objects;
 
diff --git a/jena-shacl/src/main/java/org/apache/jena/shacl/engine/constraint/StrMinLengthConstraint.java b/jena-shacl/src/main/java/org/apache/jena/shacl/engine/constraint/StrMinLengthConstraint.java
index e8eb511..4fdc1a0 100644
--- a/jena-shacl/src/main/java/org/apache/jena/shacl/engine/constraint/StrMinLengthConstraint.java
+++ b/jena-shacl/src/main/java/org/apache/jena/shacl/engine/constraint/StrMinLengthConstraint.java
@@ -18,7 +18,7 @@
 
 package org.apache.jena.shacl.engine.constraint;
 
-import static org.apache.jena.shacl.engine.constraint.CompactOut.compact;
+import static org.apache.jena.shacl.compact.writer.CompactOut.compact;
 
 import java.util.Objects;
 
diff --git a/jena-shacl/src/main/java/org/apache/jena/shacl/engine/constraint/UniqueLangConstraint.java b/jena-shacl/src/main/java/org/apache/jena/shacl/engine/constraint/UniqueLangConstraint.java
index 608ada5..494df61 100644
--- a/jena-shacl/src/main/java/org/apache/jena/shacl/engine/constraint/UniqueLangConstraint.java
+++ b/jena-shacl/src/main/java/org/apache/jena/shacl/engine/constraint/UniqueLangConstraint.java
@@ -18,7 +18,7 @@
 
 package org.apache.jena.shacl.engine.constraint;
 
-import static org.apache.jena.shacl.engine.constraint.CompactOut.compactUnquotedString;
+import static org.apache.jena.shacl.compact.writer.CompactOut.compactUnquotedString;
 
 import java.util.HashSet;
 import java.util.Objects;
diff --git a/jena-shacl/src/main/java/org/apache/jena/shacl/engine/constraint/ValueRangeConstraint.java b/jena-shacl/src/main/java/org/apache/jena/shacl/engine/constraint/ValueRangeConstraint.java
index f5c2b62..fddd75c 100644
--- a/jena-shacl/src/main/java/org/apache/jena/shacl/engine/constraint/ValueRangeConstraint.java
+++ b/jena-shacl/src/main/java/org/apache/jena/shacl/engine/constraint/ValueRangeConstraint.java
@@ -18,7 +18,7 @@
 
 package org.apache.jena.shacl.engine.constraint;
 
-import static org.apache.jena.shacl.engine.constraint.CompactOut.compact;
+import static org.apache.jena.shacl.compact.writer.CompactOut.compact;
 
 import java.util.Objects;
 
diff --git a/jena-shacl/src/main/java/org/apache/jena/shacl/parser/Constraints.java b/jena-shacl/src/main/java/org/apache/jena/shacl/parser/Constraints.java
index 5a1929b..5d75798 100644
--- a/jena-shacl/src/main/java/org/apache/jena/shacl/parser/Constraints.java
+++ b/jena-shacl/src/main/java/org/apache/jena/shacl/parser/Constraints.java
@@ -84,35 +84,35 @@ public class Constraints {
         dispatch.put( SHACL.nodeKind,          (g, s, p, o) -> new NodeKindConstraint(o) );
         dispatch.put( SHACL.minCount,          (g, s, p, o) -> new MinCount(intValue(o)) );
         dispatch.put( SHACL.maxCount,          (g, s, p, o) -> new MaxCount(intValue(o)) );
-    
+
         dispatch.put( SHACL.minInclusive,      (g, s, p, o) -> new ValueMinInclusiveConstraint(o) );
         dispatch.put( SHACL.minExclusive,      (g, s, p, o) -> new ValueMinExclusiveConstraint(o) );
         dispatch.put( SHACL.maxInclusive,      (g, s, p, o) -> new ValueMaxInclusiveConstraint(o) );
         dispatch.put( SHACL.maxExclusive,      (g, s, p, o) -> new ValueMaxExclusiveConstraint(o) );
-    
+
         dispatch.put( SHACL.minLength,         (g, s, p, o) -> new StrMinLengthConstraint(intValue(o)) );
         dispatch.put( SHACL.maxLength,         (g, s, p, o) -> new StrMaxLengthConstraint(intValue(o)) );
         // in parseConstraint
         //dispatch.put( SHACL.pattern,           (g, p, o) -> notImplemented(p) );
         dispatch.put( SHACL.languageIn,        (g, s, p, o) -> new StrLanguageIn(listString(g, o)) );
         dispatch.put( SHACL.uniqueLang,        (g, s, p, o) -> new UniqueLangConstraint(booleanValueStrict(o)) );
-    
+
         dispatch.put( SHACL.hasValue,          (g, s, p, o) -> new HasValueConstraint(o) );
         dispatch.put( SHACL.in,                (g, s, p, o) -> new InConstraint(list(g,o)) );
         dispatch.put( SHACL.closed,            (g, s, p, o) -> new ClosedConstraint(g,s,booleanValue(o)) );
-    
+
         dispatch.put( SHACL.equals,            (g, s, p, o) -> new EqualsConstraint(o) );
         dispatch.put( SHACL.disjoint,          (g, s, p, o) -> new DisjointConstraint(o) );
         dispatch.put( SHACL.lessThan,          (g, s, p, o) -> new LessThanConstraint(o) );
         dispatch.put( SHACL.lessThanOrEquals,  (g, s, p, o) -> new LessThanOrEqualsConstraint(o) );
-    
+
         // Below
         //dispatch.put( SHACL.not,                (g, s, p, o) -> notImplemented(p) );
         //dispatch.put( SHACL.and,                (g, s, p, o) -> notImplemented(p) );
         //dispatch.put( SHACL.or,                 (g, s, p, o) -> notImplemented(p) );
         //dispatch.put( SHACL.xone,               (g, s, p, o) -> notImplemented(p) );
         //dispatch.put( SHACL.node,               (g, s, p, o) -> notImplemented(p) );
-    
+
         dispatch.put(SHACL.sparql, (g, s, p, o) -> SparqlConstraints.parseSparqlConstraint(g, s, p, o) );
     }
 
@@ -144,7 +144,7 @@ public class Constraints {
      * parser at when the constraint uses other shapes
      * (sh:and/sh:or/sh:not/sh:xone.sh:node).
      */
-    /*package*/ static List<Constraint> parseConstraints(Graph shapesGraph, Node shape, Map<Node, Shape> parsed) {
+    /*package*/ static List<Constraint> parseConstraints(Graph shapesGraph, Node shape, Map<Node, Shape> parsed, Set<Node> traversed) {
         List<Constraint> constraints = new ArrayList<>();
         Iterator<Triple> iter = G.find(shapesGraph, shape, null, null);
         while(iter.hasNext()) {
@@ -157,18 +157,18 @@ public class Constraints {
                 continue;
             Node s = t.getSubject();
             Node o = t.getObject();
-            Constraint c = parseConstraint(shapesGraph, s, p, o, parsed);
+            Constraint c = parseConstraint(shapesGraph, s, p, o, parsed, traversed);
             if ( c != null )
                 constraints.add(c);
         }
         return constraints;
     }
 
-    /** 
-     * The translate of an RDF triple into a {@link Constraint}. 
+    /**
+     * The translate of an RDF triple into a {@link Constraint}.
      * Constraints require more that just the triple being inspected.
-     */  
-    private static Constraint parseConstraint(Graph g, Node s, Node p, Node o, Map<Node, Shape> parsed) {
+     */
+    private static Constraint parseConstraint(Graph g, Node s, Node p, Node o, Map<Node, Shape> parsed, Set<Node> traversed) {
 
         // Test for single triple constraints.
         ConstraintMaker maker = dispatch.get(p);
@@ -177,35 +177,35 @@ public class Constraints {
 
         // These require the "parsed" map.
         if ( p.equals(SHACL.not) ) {
-            Shape shape = ShapesParser.parseShapeStep(parsed, g, o);
+            Shape shape = ShapesParser.parseShapeStep(traversed, parsed, g, o);
             return new ShNot(shape);
         }
 
         if ( p.equals(SHACL.or) ) {
             List<Node> elts = list(g, o);
-            List<Shape> shapes = elts.stream().map(x->ShapesParser.parseShapeStep(parsed, g, x)).collect(Collectors.toList());
+            List<Shape> shapes = elts.stream().map(x->ShapesParser.parseShapeStep(traversed, parsed, g, x)).collect(Collectors.toList());
             return new ShOr(shapes);
         }
         if ( p.equals(SHACL.and) ) {
             List<Node> elts = list(g, o);
-            List<Shape> shapes = elts.stream().map(x->ShapesParser.parseShapeStep(parsed, g, x)).collect(Collectors.toList());
+            List<Shape> shapes = elts.stream().map(x->ShapesParser.parseShapeStep(traversed, parsed, g, x)).collect(Collectors.toList());
             return new ShAnd(shapes);
         }
 
         if ( p.equals(SHACL.xone) ) {
             List<Node> elts = list(g, o);
-            List<Shape> shapes = elts.stream().map(x->ShapesParser.parseShapeStep(parsed, g, x)).collect(Collectors.toList());
+            List<Shape> shapes = elts.stream().map(x->ShapesParser.parseShapeStep(traversed, parsed, g, x)).collect(Collectors.toList());
             return new ShXone(shapes);
         }
 
         if ( p.equals(SHACL.node) ) {
-            Shape other = ShapesParser.parseShapeStep(parsed, g, o);
+            Shape other = ShapesParser.parseShapeStep(traversed, parsed, g, o);
             if ( other instanceof PropertyShape )
                 throw new ShaclParseException("Object of sh:node must be a node shape, not a property shape");
             return new ShNode(other);
         }
 
-        // sh:pattern is influenced by an adjacent sh:flags. 
+        // sh:pattern is influenced by an adjacent sh:flags.
         if ( p.equals(SHACL.pattern) ) {
             Node pat = o;
             if ( ! Util.isSimpleString(pat) )
@@ -221,7 +221,7 @@ public class Constraints {
             return null;
 
         if ( p.equals(SHACL.qualifiedValueShape) )
-            return parseQualifiedValueShape(g, s, p, o, parsed);
+            return parseQualifiedValueShape(g, s, p, o, parsed, traversed);
 
         // sh:qualifiedValueShape parameters.
         if ( p.equals(SHACL.QualifiedMinCountConstraintComponent) ||
@@ -244,8 +244,8 @@ public class Constraints {
         return null;
     }
 
-    private static Constraint parseQualifiedValueShape(Graph g, Node s, Node p, Node o, Map<Node, Shape> parsed) {
-        Shape sub = ShapesParser.parseShapeStep(parsed, g, o);
+    private static Constraint parseQualifiedValueShape(Graph g, Node s, Node p, Node o, Map<Node, Shape> parsed, Set<Node> traversed) {
+        Shape sub = ShapesParser.parseShapeStep(traversed, parsed, g, o);
         // [PARSE] Syntax check needed
         Node qMin = G.getZeroOrOneSP(g, s, SHACL.qualifiedMinCount);
         Node qMax = G.getZeroOrOneSP(g, s, SHACL.qualifiedMaxCount);
diff --git a/jena-shacl/src/main/java/org/apache/jena/shacl/parser/NodeShape.java b/jena-shacl/src/main/java/org/apache/jena/shacl/parser/NodeShape.java
index 8cc7d30..e65629e 100644
--- a/jena-shacl/src/main/java/org/apache/jena/shacl/parser/NodeShape.java
+++ b/jena-shacl/src/main/java/org/apache/jena/shacl/parser/NodeShape.java
@@ -19,7 +19,6 @@
 package org.apache.jena.shacl.parser;
 
 import java.util.Collection;
-import java.util.List;
 
 import org.apache.jena.atlas.io.IndentedWriter;
 import org.apache.jena.graph.Graph;
@@ -31,8 +30,8 @@ import org.apache.jena.shacl.validation.Severity;
 public class NodeShape extends Shape {
 
     public NodeShape(Graph shapeGraph, Node shapeNode, boolean deactivated,
-                     Severity severity, List<Node> messages, Collection<Target> targets,
-                     List<Constraint> constraints, List<PropertyShape> propertyShapes) {
+                     Severity severity, Collection<Node> messages, Collection<Target> targets,
+                     Collection<Constraint> constraints, Collection<PropertyShape> propertyShapes) {
         super(shapeGraph, shapeNode, deactivated, severity, messages, targets, constraints, propertyShapes);
     }
 
diff --git a/jena-shacl/src/main/java/org/apache/jena/shacl/parser/PropertyShape.java b/jena-shacl/src/main/java/org/apache/jena/shacl/parser/PropertyShape.java
index f6c13f8..6259011 100644
--- a/jena-shacl/src/main/java/org/apache/jena/shacl/parser/PropertyShape.java
+++ b/jena-shacl/src/main/java/org/apache/jena/shacl/parser/PropertyShape.java
@@ -34,7 +34,7 @@ import org.apache.jena.sparql.path.Path;
 public class PropertyShape extends Shape {
 
     private final Path path;
-    public PropertyShape(Graph shapeGraph, Node shapeNode, boolean isDeactivated, Severity severity, List<Node> messages,
+    public PropertyShape(Graph shapeGraph, Node shapeNode, boolean isDeactivated, Severity severity, Collection<Node> messages,
                          Collection<Target> targets, Path path, List<Constraint> constraints, List<PropertyShape> propertyShapes) {
         super(shapeGraph, shapeNode, isDeactivated, severity, messages, targets, constraints, propertyShapes);
         this.path = Objects.requireNonNull(path, "path");
diff --git a/jena-shacl/src/main/java/org/apache/jena/shacl/parser/Shape.java b/jena-shacl/src/main/java/org/apache/jena/shacl/parser/Shape.java
index 7d725fd..74c33d4 100644
--- a/jena-shacl/src/main/java/org/apache/jena/shacl/parser/Shape.java
+++ b/jena-shacl/src/main/java/org/apache/jena/shacl/parser/Shape.java
@@ -21,7 +21,6 @@ package org.apache.jena.shacl.parser;
 import java.io.BufferedOutputStream;
 import java.io.OutputStream;
 import java.util.Collection;
-import java.util.List;
 
 import org.apache.jena.atlas.io.IndentedWriter;
 import org.apache.jena.graph.Graph;
@@ -40,11 +39,11 @@ public abstract class Shape {
     protected final Severity            severity;
     protected final Collection<Node>    messages;
     protected final Collection<Target>  targets;
-    protected final List<Constraint>    constraints;
-    protected final List<PropertyShape> propertyShapes;
+    protected final Collection<Constraint>    constraints;
+    protected final Collection<PropertyShape> propertyShapes;
 
-    public Shape(Graph shapeGraph, Node shapeNode, boolean deactivated, Severity severity, List<Node> messages,
-                 Collection<Target> targets, List<Constraint> constraints, List<PropertyShape> propertyShapes) {
+    protected Shape(Graph shapeGraph, Node shapeNode, boolean deactivated, Severity severity, Collection<Node> messages,
+                 Collection<Target> targets, Collection<Constraint> constraints, Collection<PropertyShape> propertyShapes) {
         super();
         this.shapeGraph = shapeGraph;
         this.shapeNode = shapeNode;
@@ -82,11 +81,11 @@ public abstract class Shape {
         return ! targets.isEmpty();
     }
 
-    public List<Constraint> getConstraints() {
+    public Collection<Constraint> getConstraints() {
         return constraints;
     }
 
-    public List<PropertyShape> getPropertyShapes() {
+    public Collection<PropertyShape> getPropertyShapes() {
         return propertyShapes;
     }
 
diff --git a/jena-shacl/src/main/java/org/apache/jena/shacl/parser/ShapesParser.java b/jena-shacl/src/main/java/org/apache/jena/shacl/parser/ShapesParser.java
index c201159..ed8f49e 100644
--- a/jena-shacl/src/main/java/org/apache/jena/shacl/parser/ShapesParser.java
+++ b/jena-shacl/src/main/java/org/apache/jena/shacl/parser/ShapesParser.java
@@ -36,7 +36,10 @@ import org.apache.jena.shacl.engine.ShaclPaths;
 import org.apache.jena.shacl.engine.Target;
 import org.apache.jena.shacl.engine.TargetType;
 import org.apache.jena.shacl.engine.Targets;
+import org.apache.jena.shacl.engine.constraint.JLogConstraint;
 import org.apache.jena.shacl.lib.G;
+import org.apache.jena.shacl.lib.ShLib;
+import org.apache.jena.shacl.sys.ShaclSystem;
 import org.apache.jena.shacl.validation.Severity;
 import org.apache.jena.shacl.vocabulary.SHACL;
 import org.apache.jena.shared.JenaException;
@@ -58,7 +61,6 @@ public class ShapesParser {
 
     private static final boolean DEBUG = false;
     private static IndentedWriter OUT = IndentedWriter.stdout;
-    //private static Logger LOG = LoggerFactory.getLogger(ShapesParser.class);
 
     /**
      * Parse, starting from the given targets.
@@ -67,6 +69,13 @@ public class ShapesParser {
      * Applications should call functions in {@link Shapes} rather than call the parser directly.
      */
     public static Collection<Shape> parseShapes(Graph shapesGraph, Targets targets, Map<Node, Shape> shapesMap) {
+        // Cycle detection. 
+        Set<Node> cycles = new HashSet<>();
+        return parseShapes(shapesGraph, targets, shapesMap, cycles);
+    }
+    
+    /*package*/ static Collection<Shape> parseShapes(Graph shapesGraph, Targets targets, Map<Node, Shape> shapesMap, Set<Node> cycles) {
+        
         Targets rootShapes = targets;
 
         if ( DEBUG )
@@ -163,15 +172,17 @@ public class ShapesParser {
 
     // ---- Main parser worker.
     /**
-     *  Parse shape "shNode", updating the record of shapes already parsed.
+     *  Parse one shape updating the record of shapes already parsed.
      *
      * @param shapesMap
      * @param shapesGraph
      * @param shNode
      * @return Shape
      */
+    
     public static Shape parseShape(Map<Node, Shape> shapesMap, Graph shapesGraph, Node shNode) {
-        Shape shape = parseShapeStep(shapesMap, shapesGraph, shNode);
+        Set<Node> traversed = new HashSet<>();
+        Shape shape = parseShapeStep(traversed, shapesMap, shapesGraph, shNode);
         return shape;
     }
 
@@ -218,22 +229,42 @@ public class ShapesParser {
     | sh:path         |
     -------------------
      */
+    
+    /** Do nothing placeholder shape. */
+    static Shape unshape(Graph shapesGraph, Node shapeNode) { return 
+            new NodeShape(shapesGraph, shapeNode, false, Severity.Violation,
+                          Collections.emptySet(), Collections.emptySet(),
+                          Collections.singleton(new JLogConstraint("Cycle")),
+                          Collections.emptySet());
+    }
+    
     /** parse a shape during a parsing process */
-    /*package*/ static Shape parseShapeStep(Map<Node, Shape> parsed, Graph shapesGraph, Node shapeNode) {
+    /*package*/ static Shape parseShapeStep(Set<Node> traversed, Map<Node, Shape> parsed, Graph shapesGraph, Node shapeNode) {
         // Called by Constraints
         if ( parsed.containsKey(shapeNode) )
             return parsed.get(shapeNode);
-        Shape shape = parseShape$(parsed, shapesGraph, shapeNode);
+        // Loop detection. Do before parsing.
+        if ( traversed.contains(shapeNode) ) {
+//            Log.error(ShapesParser.class,  "Cycle detected : node "+ShLib.displayStr(shapeNode));
+//            throw new ShaclParseException("Shapes cycle detected : node "+ShLib.displayStr(shapeNode));
+            ShaclSystem.systemShaclLogger.warn("Cycle detected : node "+ShLib.displayStr(shapeNode));
+            // Put in a substitute shape.
+            return unshape(shapesGraph, shapeNode);
+        }
+        
+        traversed.add(shapeNode);
+        Shape shape = parseShape$(traversed, parsed, shapesGraph, shapeNode);
         parsed.put(shapeNode, shape);
+        traversed.remove(shapeNode);
         return shape;
     }
 
-    private static Shape parseShape$(Map<Node, Shape> parsed, Graph shapesGraph, Node shapeNode) {
+    private static Shape parseShape$(Set<Node> traversed, Map<Node, Shape> parsed, Graph shapesGraph, Node shapeNode) {
         if ( DEBUG )
             OUT.printf("Parse shape : %s\n", displayStr(shapeNode));
         boolean isDeactivated = absentOrOne(shapesGraph, shapeNode, SHACL.deactivated, NodeConst.nodeTrue);
         Collection<Target> targets = targets(shapesGraph, shapeNode);
-        List<Constraint> constraints = Constraints.parseConstraints(shapesGraph, shapeNode, parsed);
+        List<Constraint> constraints = Constraints.parseConstraints(shapesGraph, shapeNode, parsed, traversed);
         Severity severity = severity(shapesGraph, shapeNode);
         List<Node> messages = listSP(shapesGraph, shapeNode, SHACL.message);
 
@@ -241,7 +272,7 @@ public class ShapesParser {
             OUT.incIndent();
         // sh:Property PropertyShapes from this shape.
         // sh:node is treated as a constraint.
-        List<PropertyShape> propertyShapes = findPropertyShapes(parsed, shapesGraph, shapeNode);
+        List<PropertyShape> propertyShapes = findPropertyShapes(traversed, parsed, shapesGraph, shapeNode);
         if ( DEBUG )
             OUT.decIndent();
 
@@ -303,7 +334,7 @@ public class ShapesParser {
         return ShaclPaths.parsePath(shapesGraph, node);
     }
 
-    private static List<PropertyShape> findPropertyShapes(Map<Node, Shape> parsed, Graph shapesGraph, Node shapeNode) {
+    private static List<PropertyShape> findPropertyShapes(Set<Node> traversed, Map<Node, Shape> parsed, Graph shapesGraph, Node shapeNode) {
         List<Triple> propertyTriples = G.find(shapesGraph, shapeNode, SHACL.property, null).toList();
         List<PropertyShape> propertyShapes = new ArrayList<>();
         for ( Triple t : propertyTriples) {
@@ -321,9 +352,9 @@ public class ShapesParser {
             }
             if ( x > 1 ) {
                 List<Node> paths = listSP(shapesGraph, propertyShape, SHACL.path);
-                throw new ShaclParseException("Muiltiple sh:path on a property shape: "+displayStr(shapeNode)+" sh:property"+displayStr(propertyShape)+ " : "+paths);
+                throw new ShaclParseException("Multiple sh:path on a property shape: "+displayStr(shapeNode)+" sh:property"+displayStr(propertyShape)+ " : "+paths);
             }
-            PropertyShape ps = (PropertyShape)parseShapeStep(parsed, shapesGraph, propertyShape);
+            PropertyShape ps = (PropertyShape)parseShapeStep(traversed, parsed, shapesGraph, propertyShape);
             propertyShapes.add(ps);
         }
         return propertyShapes;
diff --git a/jena-shacl/src/main/java/org/apache/jena/shacl/sys/ShaclSystem.java b/jena-shacl/src/main/java/org/apache/jena/shacl/sys/ShaclSystem.java
index 01ae3e9..73c32a8 100644
--- a/jena-shacl/src/main/java/org/apache/jena/shacl/sys/ShaclSystem.java
+++ b/jena-shacl/src/main/java/org/apache/jena/shacl/sys/ShaclSystem.java
@@ -18,10 +18,17 @@
 
 package org.apache.jena.shacl.sys;
 
+import org.apache.jena.riot.system.ErrorHandler;
+import org.apache.jena.riot.system.ErrorHandlerFactory;
 import org.apache.jena.shacl.ShaclValidator;
 import org.apache.jena.shacl.validation.ShaclPlainValidator;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
 
 public class ShaclSystem {
+    public static Logger systemShaclLogger = LoggerFactory.getLogger("SHACL"); 
+    public static ErrorHandler systemShaclErrorHandler = ErrorHandlerFactory.errorHandlerStd(systemShaclLogger);
+    
     private static ShaclValidator globalDefault = new ShaclPlainValidator();
     
     /** Set the current system-wide {@link ShaclValidator}. */
diff --git a/jena-shacl/src/main/java/org/apache/jena/shacl/validation/VLib.java b/jena-shacl/src/main/java/org/apache/jena/shacl/validation/VLib.java
index 184382d..451fe35 100644
--- a/jena-shacl/src/main/java/org/apache/jena/shacl/validation/VLib.java
+++ b/jena-shacl/src/main/java/org/apache/jena/shacl/validation/VLib.java
@@ -121,7 +121,7 @@ public class VLib {
             out.println();
     }
 
-    static void validationPropertyShapes(ValidationContext vCxt, Graph data, List<PropertyShape> propertyShapes, Node focusNode) {
+    static void validationPropertyShapes(ValidationContext vCxt, Graph data, Collection<PropertyShape> propertyShapes, Node focusNode) {
         if ( propertyShapes == null )
             return;
         for ( PropertyShape propertyShape : propertyShapes ) {
diff --git a/jena-shacl/src/main/java/org/apache/jena/shacl/vocabulary/SHJ.java b/jena-shacl/src/main/java/org/apache/jena/shacl/vocabulary/SHJ.java
index 061db14..3033b67 100644
--- a/jena-shacl/src/main/java/org/apache/jena/shacl/vocabulary/SHJ.java
+++ b/jena-shacl/src/main/java/org/apache/jena/shacl/vocabulary/SHJ.java
@@ -18,17 +18,35 @@
 
 package org.apache.jena.shacl.vocabulary;
 
+import java.util.Objects;
+
 import org.apache.jena.graph.Node;
 import org.apache.jena.graph.NodeFactory;
 
 /** Vocabulary for Jena additions to SHACL */
 public class SHJ {
-    private static Node createResource(String localName) { return NodeFactory.createURI(NS+localName); }
-    private static Node createProperty(String localName) { return NodeFactory.createURI(NS+localName); }
 
     /** The namespace of the vocabulary as a string */
     public static final String NS = "http://jena.apache.org/shacl#";
 
     /** The namespace of the vocabulary as a string*/
     public static String getURI() {return NS;}
+    
+    /** Namespace */
+    public String ns() { return NS; }
+        
+    private static String uri(String ns, String local) {
+        Objects.requireNonNull(ns);
+        Objects.requireNonNull(local);
+        return ns+local;
+    }
+
+    private static Node createResource(String ns, String localName) { return NodeFactory.createURI(uri(ns, localName)); }
+    private static Node createProperty(String ns, String localName) { return NodeFactory.createURI(uri(ns, localName)); }
+
+    public static final Node LogConstraintComponent         = createResource(NS, "LogConstraintComponent");
+    public static final Node logConstraint                  = createProperty(NS, "log");
+
+    public static final Node ViolationConstraintComponent   = createResource(NS, "ViolationConstraintComponent");
+    public static final Node violation                      = createProperty(NS, "violation");
 }