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 2021/06/22 19:45:58 UTC

[jena] branch main updated: JENA-2122: IDIV and MOD

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

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


The following commit(s) were added to refs/heads/main by this push:
     new abdb02e  JENA-2122: IDIV and MOD
     new 5047dff  Merge pull request #1017 from afs/decimal-divide
abdb02e is described below

commit abdb02e425e223666e7a4e67a6702691dd8a234a
Author: Andy Seaborne <an...@apache.org>
AuthorDate: Tue Jun 22 09:34:13 2021 +0100

    JENA-2122: IDIV and MOD
---
 jena-arq/Grammar/arq.jj                            |   8 +
 jena-arq/Grammar/main.jj                           |  20 +-
 jena-arq/Grammar/tokens.txt                        |   8 +-
 .../jena/sparql/expr/E_OpNumericIntegerDivide.java |  38 +
 .../apache/jena/sparql/expr/E_OpNumericMod.java    |  38 +
 .../org/apache/jena/sparql/expr/NodeValue.java     |   7 +-
 .../jena/sparql/expr/nodevalue/XSDFuncOp.java      | 103 ++-
 .../jena/sparql/function/StandardFunctions.java    |  65 +-
 .../function/library/Op_NumericIntegerDivide.java  |  32 +
 .../sparql/function/library/Op_NumericMod.java     |  32 +
 .../org/apache/jena/sparql/lang/arq/ARQParser.java | 696 +++++++-------
 .../jena/sparql/lang/arq/ARQParserConstants.java   | 254 +++---
 .../sparql/lang/arq/ARQParserTokenManager.java     | 996 +++++++++++----------
 .../main/java/org/apache/jena/sparql/sse/Tags.java |   3 +
 .../jena/sparql/sse/builders/BuilderExpr.java      |  17 +
 .../org/apache/jena/sparql/expr/LibTestExpr.java   |  24 +-
 .../java/org/apache/jena/sparql/expr/TS_Expr.java  |   1 +
 .../apache/jena/sparql/expr/TestExpressions.java   |   2 +
 .../apache/jena/sparql/expr/TestExpressions3.java  |   8 +-
 .../apache/jena/sparql/expr/TestExpressions4.java  |  87 ++
 .../jena/sparql/expr/TestExpressionsMath.java      |  35 +-
 .../jena/sparql/expr/TestLeviathanFunctions.java   |  36 +-
 .../org/apache/jena/sparql/expr/TestXSDFuncOp.java | 290 +++---
 23 files changed, 1644 insertions(+), 1156 deletions(-)

diff --git a/jena-arq/Grammar/arq.jj b/jena-arq/Grammar/arq.jj
index f2403a2..a374a34 100644
--- a/jena-arq/Grammar/arq.jj
+++ b/jena-arq/Grammar/arq.jj
@@ -1341,6 +1341,10 @@ Expr MultiplicativeExpression() : { Expr expr1, expr2 ; }
     { expr1 = new E_Multiply(expr1, expr2) ; }
   | <SLASH> expr2 = UnaryExpression()
     { expr1 = new E_Divide(expr1, expr2) ; }
+  | <MOD> expr2 = UnaryExpression()
+    { expr1 = new E_OpNumericMod(expr1, expr2) ; }
+  | <IDIV> expr2 = UnaryExpression()
+    { expr1 = new E_OpNumericIntegerDivide(expr1, expr2) ; }
   )*
     { return expr1 ; }
 }
@@ -1420,6 +1424,8 @@ Expr BuiltInCall() : { Expr expr ;
   | <CEIL> <LPAREN> expr1 = Expression() <RPAREN> { return new E_NumCeiling(expr1) ; }
   | <FLOOR> <LPAREN> expr1 = Expression() <RPAREN> { return new E_NumFloor(expr1) ; }
   | <ROUND> <LPAREN> expr1 = Expression() <RPAREN> { return new E_NumRound(expr1) ; }
+  | <MOD> <LPAREN> expr1 = Expression() <COMMA> expr2 = Expression() <RPAREN> { return new E_OpNumericMod(expr1, expr2); }
+  | <IDIV> <LPAREN> expr1 = Expression() <COMMA> expr2 = Expression() <RPAREN> { return new E_OpNumericIntegerDivide(expr1, expr2); }
   | <CONCAT> a = ExpressionList() { return new E_StrConcat(a) ; }
   | expr = SubstringExpression() { return expr ; }
   | <STRLEN> <LPAREN> expr1 = Expression() <RPAREN> { return new E_StrLength(expr1) ; }
@@ -1829,6 +1835,8 @@ TOKEN [IGNORE_CASE] :
 | < CEIL: "CEIL" >
 | < FLOOR: "FLOOR" >
 | < ROUND: "ROUND" >
+| < MOD: "MOD" >
+| < IDIV: "IDIV" >
 | < CONCAT: "CONCAT" >
 | < SUBSTR: "SUBSTR" >
 | < STRLEN: "STRLEN" >
diff --git a/jena-arq/Grammar/main.jj b/jena-arq/Grammar/main.jj
index e510c6a..ac95064 100644
--- a/jena-arq/Grammar/main.jj
+++ b/jena-arq/Grammar/main.jj
@@ -1840,8 +1840,12 @@ Expr MultiplicativeExpression() : { Expr expr1, expr2 ; }
     { expr1 = new E_Multiply(expr1, expr2) ; }
   | <SLASH> expr2 = UnaryExpression()
     { expr1 = new E_Divide(expr1, expr2) ; }
-//   | <REM>   expr2 = UnaryExpression()
-//     { expr1 = new E_Modulus(expr1, expr2) ; }
+#ifdef ARQ
+  | <MOD>   expr2 = UnaryExpression()
+    { expr1 = new E_OpNumericMod(expr1, expr2) ; }
+  | <IDIV>  expr2 = UnaryExpression()
+    { expr1 = new E_OpNumericIntegerDivide(expr1, expr2) ; }
+#endif
   )*
     { return expr1 ; }
 }
@@ -1963,6 +1967,12 @@ Expr BuiltInCall() : { Expr expr ;
   | <FLOOR> <LPAREN> expr1 = Expression() <RPAREN> { return new E_NumFloor(expr1) ; }
     
   | <ROUND> <LPAREN> expr1 = Expression() <RPAREN> { return new E_NumRound(expr1) ; }
+
+#if ARQ
+  | <MOD>  <LPAREN> expr1 = Expression() <COMMA> expr2 = Expression() <RPAREN> { return new E_OpNumericMod(expr1, expr2); }
+  
+  | <IDIV> <LPAREN> expr1 = Expression() <COMMA> expr2 = Expression() <RPAREN> { return new E_OpNumericIntegerDivide(expr1, expr2); }
+#endif
     
   | <CONCAT> a = ExpressionList() { return new E_StrConcat(a) ; }
     
@@ -2564,6 +2574,11 @@ TOKEN [IGNORE_CASE] :
 |  < CEIL:        "CEIL" >
 |  < FLOOR:       "FLOOR" >
 |  < ROUND:       "ROUND" >
+#ifdef ARQ
+|  < MOD:         "MOD" >
+|  < IDIV:        "IDIV" >
+#endif
+
 |  < CONCAT:      "CONCAT" >
 |  < SUBSTR:      "SUBSTR" >
 |  < STRLEN:      "STRLEN" >
@@ -2741,7 +2756,6 @@ TOKEN :
 | < STAR:    "*" >
 | < SLASH:   "/" >
 
-//| < AMP: "&" >
 //| < REM: "%" >
 
 | < DATATYPE: "^^">
diff --git a/jena-arq/Grammar/tokens.txt b/jena-arq/Grammar/tokens.txt
index 3be2240..bd4e4e6 100644
--- a/jena-arq/Grammar/tokens.txt
+++ b/jena-arq/Grammar/tokens.txt
@@ -125,6 +125,9 @@
 [<CEIL>]        ::= 'CEIL'
 [<FLOOR>]       ::= 'FLOOR'
 [<ROUND>]       ::= 'ROUND'
+[<IDIV>]        ::= 'IDIV'
+[<MOD>]         ::= 'MOD'
+
 [<CONCAT>]      ::= 'CONCAT'
 [<SUBSTR>]      ::= 'SUBSTR'
 [<STRLEN>]      ::= 'STRLEN'
@@ -225,11 +228,8 @@
 [<BLK1_L>]     ::= '(|'
 [<BLK1_R>]     ::= '|)'
 
-[<BLK2_L>]     ::= '{|'
-[<BLK2_R>]     ::= '|}'
-
 //[<ANON>]       ::= '[' ']'
-<ANON>       ::= '['  <WS>* ']'
+<ANON>         ::= '['  <WS>* ']'
 
 [<SEMICOLON>]  ::= ';'
 [<COMMA>]      ::= ','
diff --git a/jena-arq/src/main/java/org/apache/jena/sparql/expr/E_OpNumericIntegerDivide.java b/jena-arq/src/main/java/org/apache/jena/sparql/expr/E_OpNumericIntegerDivide.java
new file mode 100644
index 0000000..bf54214
--- /dev/null
+++ b/jena-arq/src/main/java/org/apache/jena/sparql/expr/E_OpNumericIntegerDivide.java
@@ -0,0 +1,38 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.jena.sparql.expr;
+
+import org.apache.jena.sparql.expr.nodevalue.XSDFuncOp;
+import org.apache.jena.sparql.sse.Tags;
+
+public class E_OpNumericIntegerDivide  extends ExprFunction2 {
+    private static final String symbol = Tags.tagIDiv;
+
+    public E_OpNumericIntegerDivide(Expr expr1, Expr expr2) {
+        super(expr1, expr2, symbol);
+    }
+
+    @Override
+    public NodeValue eval(NodeValue nv1, NodeValue nv2) {
+        return XSDFuncOp.numIntegerDivide(nv1, nv2);
+    }
+
+    @Override
+    public Expr copy(Expr e1, Expr e2) { return new E_OpNumericIntegerDivide(e1, e2); }
+}
diff --git a/jena-arq/src/main/java/org/apache/jena/sparql/expr/E_OpNumericMod.java b/jena-arq/src/main/java/org/apache/jena/sparql/expr/E_OpNumericMod.java
new file mode 100644
index 0000000..07797fd
--- /dev/null
+++ b/jena-arq/src/main/java/org/apache/jena/sparql/expr/E_OpNumericMod.java
@@ -0,0 +1,38 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.jena.sparql.expr;
+
+import org.apache.jena.sparql.expr.nodevalue.XSDFuncOp;
+import org.apache.jena.sparql.sse.Tags;
+
+public class E_OpNumericMod extends ExprFunction2 {
+    private static final String symbol = Tags.tagMod;
+
+    public E_OpNumericMod(Expr expr1, Expr expr2) {
+        super(expr1, expr2, symbol);
+    }
+
+    @Override
+    public NodeValue eval(NodeValue nv1, NodeValue nv2) {
+        return XSDFuncOp.numericMod(nv1, nv2);
+    }
+
+    @Override
+    public Expr copy(Expr e1, Expr e2) { return new E_OpNumericMod(e1, e2); }
+}
diff --git a/jena-arq/src/main/java/org/apache/jena/sparql/expr/NodeValue.java b/jena-arq/src/main/java/org/apache/jena/sparql/expr/NodeValue.java
index 11c78c6..b129d91 100644
--- a/jena-arq/src/main/java/org/apache/jena/sparql/expr/NodeValue.java
+++ b/jena-arq/src/main/java/org/apache/jena/sparql/expr/NodeValue.java
@@ -37,6 +37,7 @@ import org.apache.jena.atlas.logging.Log ;
 import org.apache.jena.datatypes.DatatypeFormatException ;
 import org.apache.jena.datatypes.RDFDatatype ;
 import org.apache.jena.datatypes.TypeMapper ;
+import org.apache.jena.datatypes.xsd.XSDDatatype;
 import org.apache.jena.datatypes.xsd.XSDDateTime ;
 import org.apache.jena.ext.xerces.DatatypeFactoryInst;
 import org.apache.jena.graph.Node ;
@@ -340,8 +341,10 @@ public abstract class NodeValue extends ExprNode
 
     public static NodeValue makeNodeDecimal(BigDecimal decimal)
     {
-        NodeValue nv = XSDFuncOp.canonicalDecimalNV(decimal) ;
-        return nv ;
+      String lex = XSDFuncOp.canonicalDecimalStr(decimal);
+      return NodeValue.makeNode(lex, XSDDatatype.XSDdecimal) ;
+//        NodeValue nv = XSDFuncOp.canonicalDecimalNV(decimal) ;
+//        return nv ;
     }
 
     public static NodeValue makeNodeDecimal(String lexicalForm)
diff --git a/jena-arq/src/main/java/org/apache/jena/sparql/expr/nodevalue/XSDFuncOp.java b/jena-arq/src/main/java/org/apache/jena/sparql/expr/nodevalue/XSDFuncOp.java
index 6faed1a..017cf3b 100644
--- a/jena-arq/src/main/java/org/apache/jena/sparql/expr/nodevalue/XSDFuncOp.java
+++ b/jena-arq/src/main/java/org/apache/jena/sparql/expr/nodevalue/XSDFuncOp.java
@@ -129,8 +129,6 @@ public class XSDFuncOp
     public static NodeValue numDivide(NodeValue nv1, NodeValue nv2) {
         switch (classifyNumeric("divide", nv1, nv2)) {
             case OP_INTEGER : {
-                if ( nv2.getInteger().equals(BigInteger.ZERO) )
-                    throw new ExprEvalException("Divide by zero in divide") ;
                 // Note: result is a decimal
                 BigDecimal d1 = new BigDecimal(nv1.getInteger()) ;
                 BigDecimal d2 = new BigDecimal(nv2.getInteger()) ;
@@ -157,17 +155,104 @@ public class XSDFuncOp
             throw new ExprEvalException("Divide by zero in decimal divide") ;
         BigDecimal d3;
         try {
+            // Jena 3.16.0 used d1.divide(d2, DIVIDE_PRECISION, BigDecimal.ROUND_FLOOR)
+            // which can looses precision even when there is exact answer.
+            // See JENA-1943 and JENA-2116
+            // Casting the dividend (the left hand value) to xsd:double gets approximate division always.
+
+            // Exact where possible.
+            // But this generates an exception when not exact which can be costly in some situations.
             d3 = d1.divide(d2, MathContext.UNLIMITED);
         } catch (ArithmeticException ex) {
-            // Does not throw ArithmeticException
             d3 = d1.divide(d2, DIVIDE_PRECISION, RoundingMode.HALF_EVEN);
         }
-        return canonicalDecimalNV(d3) ;
+        return NodeValue.makeDecimal(d3) ;
+    }
+
+    /** Integer divide */
+    public static NodeValue numIntegerDivide(NodeValue nv1, NodeValue nv2) {
+        switch (XSDFuncOp.classifyNumeric("idiv", nv1, nv2)) {
+            case OP_INTEGER :
+                BigInteger bi1 = nv1.getInteger();
+                BigInteger bi2 = nv2.getInteger();
+                if ( BigInteger.ZERO.equals(bi2) )
+                    throw new ExprEvalException("Divide by zero in IDIV") ;
+                BigInteger bi3 = bi1.divide(bi2);
+                return NodeValue.makeInteger(bi3);
+            case OP_DECIMAL :
+                BigDecimal bd_a = nv1.getDecimal();
+                BigDecimal bd_b = nv2.getDecimal();
+                if ( BigDecimal.ZERO.compareTo(bd_b) == 0 )
+                    throw new ExprEvalException("Divide by zero in IDIV") ;
+                BigInteger bi = bd_a.divideToIntegralValue(bd_b).toBigIntegerExact();
+                return NodeValue.makeInteger(bi);
+            case OP_FLOAT : {
+                float arg1 = nv1.getFloat();
+                float arg2 = nv2.getFloat();
+                if ( arg2 == 0.0  )
+                    throw new ExprEvalException("Divide by zero in IDIV") ;
+                if ( Float.isNaN(arg1) || Float.isNaN(arg2) )
+                    throw new ExprEvalException("Divide by NaN in IDIV") ;
+                if ( Float.isInfinite(arg1) )
+                    throw new ExprEvalException("+/-INF in IDIV") ;
+                float f = arg1 / arg2;
+                return NodeValue.makeInteger((long)f);
+            }
+            case OP_DOUBLE : {
+                double arg1 = nv1.getDouble();
+                double arg2 = nv2.getDouble();
+                if ( arg2 == 0.0  )
+                    throw new ExprEvalException("Divide by zero in IDIV") ;
+                if ( Double.isNaN(arg1) || Double.isNaN(arg2) )
+                    throw new ExprEvalException("Divide by NaN in IDIV") ;
+                if ( Double.isInfinite(arg1) )
+                    throw new ExprEvalException("+/-INF in IDIV") ;
+                double d = arg1 / arg2;
+                return NodeValue.makeInteger((long)d);
+            }
+            default :
+                throw new ARQInternalErrorException("Unrecognized numeric operation : (" + nv1 + " ," + nv2 + ")") ;
+        }
     }
 
-    public static NodeValue canonicalDecimalNV(BigDecimal d) {
-        String x = canonicalDecimalStr(d);
-        return NodeValue.makeNode(x, XSDDatatype.XSDdecimal) ;
+    public static NodeValue numericMod(NodeValue nv1, NodeValue nv2) {
+        // F&O modulus operation != Java Number.mod operations.
+        switch (XSDFuncOp.classifyNumeric("mod", nv1, nv2)) {
+            // a = (a idiv b)*b+(a mod b)
+            // => except corner cases (none or xsd:decimal except precision?)
+            // a - (a idiv b)*b
+
+            case OP_INTEGER :
+                // Not BigInteger.mod. F&O != Java.
+                BigInteger bi1 = nv1.getInteger();
+                BigInteger bi2 = nv2.getInteger();
+                if ( BigInteger.ZERO.equals(bi2) )
+                    throw new ExprEvalException("Divide by zero in MOD") ;
+                BigInteger bi3 = bi1.remainder(bi2);
+                return NodeValue.makeInteger(bi3);
+            case OP_DECIMAL :
+                BigDecimal bd_a = nv1.getDecimal();
+                BigDecimal bd_b = nv2.getDecimal();
+                if ( BigDecimal.ZERO.compareTo(bd_b) == 0 )
+                    throw new ExprEvalException("Divide by zero in MOD") ;
+                // This is the MOD for X&O
+                BigDecimal bd_mod = bd_a.remainder(bd_b);
+                return NodeValue.makeDecimal(bd_mod);
+            case OP_FLOAT :
+                float f1 = nv1.getFloat();
+                float f2 = nv2.getFloat();
+                if ( f2 == 0 )
+                    throw new ExprEvalException("Divide by zero in MOD") ;
+                return NodeValue.makeFloat( f1 % f2) ;
+            case OP_DOUBLE :
+                double d1 = nv1.getDouble();
+                double d2 = nv2.getDouble();
+                if ( d2 == 0 )
+                    throw new ExprEvalException("Divide by zero in MOD") ;
+                return NodeValue.makeDouble(d1 % d2) ;
+            default :
+                throw new ARQInternalErrorException("Unrecognized numeric operation : (" + nv1 + " ," + nv2 + ")") ;
+        }
     }
 
     /**
@@ -389,9 +474,9 @@ public class XSDFuncOp
     }
 
     // The following function 'roundXpath3' implements the definition for "fn:round" in F&O v3.
-    // This is diffrent to the "fn:round" in F&O v2.
+    // This is different to the "fn:round" in F&O v2.
     // SPARQL 1.1 references F&O v2.
-    private static BigDecimal roundDecimalValue(BigDecimal dec,int precision,boolean isHalfToEven)
+    private static BigDecimal roundDecimalValue(BigDecimal dec, int precision, boolean isHalfToEven)
     {
         if(isHalfToEven){
             return dec.setScale(precision, RoundingMode.HALF_EVEN);
diff --git a/jena-arq/src/main/java/org/apache/jena/sparql/function/StandardFunctions.java b/jena-arq/src/main/java/org/apache/jena/sparql/function/StandardFunctions.java
index 64ce126..47c6c62 100644
--- a/jena-arq/src/main/java/org/apache/jena/sparql/function/StandardFunctions.java
+++ b/jena-arq/src/main/java/org/apache/jena/sparql/function/StandardFunctions.java
@@ -30,35 +30,35 @@ public class StandardFunctions
 {
     /* JENA-508
      * Missing: (July 2016)
-     * 
+     *
      *   fn:format-dateTime
      *   fn:format-date
      *   fn:format-time
-     * 
+     *
      * and adapters to SPARQL operations that have keywords:
      *   fn:replace
      *   fn:matches
-     * and sparql:* for all the SPARQL builtins. 
+     * and sparql:* for all the SPARQL builtins.
      */
-    
+
     /* Implementation notes
      *   fn:format-dateTime / fn:format-time / fn:format-date
      *   This is not Java's SimpleDateFormat.
      *   It has its own picture syntax.
-     *     Like adjust-* we may need only one function. 
+     *     Like adjust-* we may need only one function.
      */
-    
+
     public static void loadStdDefs(FunctionRegistry registry) {
         String xfn = ARQConstants.fnPrefix ;
         String math = ARQConstants.mathPrefix ;
         String sparqlfn = ARQConstants.fnSparql ;
-        
+
         // Update documentation in xsd-support.md
-        
+
         // See also:
         // http://www.w3.org/TR/xpath-datamodel/#types-hierarchy
         // https://www.w3.org/TR/xpath-datamodel-3/
-        
+
         addCastNumeric(registry, XSDDatatype.XSDdecimal) ;
         addCastNumeric(registry, XSDDatatype.XSDinteger) ;
 
@@ -66,7 +66,7 @@ public class StandardFunctions
         addCastNumeric(registry, XSDDatatype.XSDint) ;
         addCastNumeric(registry, XSDDatatype.XSDshort) ;
         addCastNumeric(registry, XSDDatatype.XSDbyte) ;
-        
+
         addCastNumeric(registry, XSDDatatype.XSDnonPositiveInteger) ;
         addCastNumeric(registry, XSDDatatype.XSDnegativeInteger) ;
 
@@ -78,14 +78,14 @@ public class StandardFunctions
 
         addCastNumeric(registry, XSDDatatype.XSDdouble) ;
         addCastNumeric(registry, XSDDatatype.XSDfloat) ;
-        
+
         addCastXSD(registry, XSDDatatype.XSDboolean) ;
         addCastXSD(registry, XSDDatatype.XSDduration) ;
         addCastXSD(registry, XSDDatatype.XSDdayTimeDuration) ;
         addCastXSD(registry, XSDDatatype.XSDyearMonthDuration) ;
         addCastXSD(registry, XSDDatatype.XSDstring) ;
         addCastXSD(registry, XSDDatatype.XSDanyURI) ;
-        
+
         addCastTemporal(registry, XSDDatatype.XSDdateTime) ;
         addCastTemporal(registry, XSDDatatype.XSDdate) ;
         addCastTemporal(registry, XSDDatatype.XSDtime) ;
@@ -100,14 +100,14 @@ public class StandardFunctions
 
         //TODO op:numeric-greater-than etc.
         //TODO sparql:* for all the SPARQL builtins.
-        
+
         // Sections refer to XQ/XP Expression 3.1
         // https://www.w3.org/TR/xpath-functions-3/
 
         // 3.1.1 fn:error
         add(registry, xfn+"error",         FN_Error.class) ;
 
-        
+
 //      5.4.1 fn:concat
 //      5.4.3 fn:substring
 //      5.4.4 fn:string-length
@@ -120,7 +120,7 @@ public class StandardFunctions
 //      5.5.3 fn:ends-with
 //      5.5.4 fn:substring-before
 //      5.5.5 fn:substring-after
-        
+
         //add(registry, xfn+"string-join",   FN_StrJoin.class) ;    // Works fn:string-join works on a sequence.
         add(registry, xfn+"concat",         FN_StrConcat.class) ;
         add(registry, xfn+"substring",      FN_StrSubstring.class) ;
@@ -145,7 +145,7 @@ public class StandardFunctions
         add(registry, xfn+"replace",        FN_StrReplace.class) ;
 
 //      Not 5.6.4 fn:tokenize - returns a sequence.
-        
+
 //        4.7.2 fn:format-number
         add(registry, xfn+"format-number",  FN_FormatNumber.class) ;
 
@@ -163,7 +163,7 @@ public class StandardFunctions
 //        6.2 fn:encode-for-uri
 //        6.3 fn:iri-to-uri         -- meaningless in SPARQL.
 //        6.4 fn:escape-html-uri
-        
+
         add(registry, xfn+"encode-for-uri", FN_StrEncodeForURI.class) ;
 
         add(registry, xfn+"years-from-date",        FN_YearsFromDate.class) ;
@@ -175,7 +175,7 @@ public class StandardFunctions
         add(registry, xfn+"minutes-from-time",      FN_MinutesFromTime.class) ;
         add(registry, xfn+"seconds-from-time",      FN_SecondsFromTime.class) ;
         add(registry, xfn+"timezone-from-time",     FN_TimezoneFromTime.class) ;
-        
+
         add(registry, xfn+"dateTime",               FN_DateTime.class) ;
         add(registry, xfn+"years-from-dateTime",    FN_YearsFromDateTime.class) ;
         add(registry, xfn+"months-from-dateTime",   FN_MonthsFromDateTime.class) ;
@@ -191,12 +191,12 @@ public class StandardFunctions
         add(registry, xfn+"hours-from-duration",    FN_HoursFromDuration.class) ;
         add(registry, xfn+"minutes-from-duration",  FN_MinutesFromDuration.class) ;
         add(registry, xfn+"seconds-from-duration",  FN_SecondsFromDuration.class) ;
-        
+
 //      7.3.1 fn:boolean
 //      7.3.2 fn:not
       add(registry, xfn+"boolean",        FN_BEV.class) ;
       add(registry, xfn+"not",            FN_Not.class) ;
-        
+
         // XQ/XP 3.
 //        9.6.1 fn:adjust-dateTime-to-timezone
         add(registry, xfn+"adjust-dateTime-to-timezone",  FN_AdjustDatetimeToTimezone.class) ;
@@ -207,12 +207,12 @@ public class StandardFunctions
 //        9.8.1 fn:format-dateTime
 //        9.8.2 fn:format-date
 //        9.8.3 fn:format-time
-        
-        
+
+
 //        15.6 fn:implicit-timezone -> xsd:dayTimeDuration
         add(registry, xfn+"implicit-timezone",  FN_Timezone.class) ;
         // Also available as afn:timezone.
-        
+
         // math:
 //        4.8 Trigonometric and exponential functions
 //        4.8.1 math:pi
@@ -229,19 +229,19 @@ public class StandardFunctions
 //        4.8.12 math:acos
 //        4.8.13 math:atan
 //        4.8.14 math:atan2
-        
+
         // check.
-        add(registry, math+"pi",        pi.class) ;        
+        add(registry, math+"pi",        pi.class) ;
         add(registry, math+"exp",       Math_exp.class) ;      // -> XSDFuncOp
         add(registry, math+"exp10",     Math_exp10.class) ;    // -> XSDFuncOp
-        // Levianthan "log" is a function which takes one or two arguments.  
+        // Levianthan "log" is a function which takes one or two arguments.
         add(registry, math+"log",       Math_log.class) ;      // -> XSDFuncOp   ln.class?
         add(registry, math+"log10",     Math_log10.class) ;    // -> XSDFuncOp                 // - rename
 
-        // math_pow : integer preserving, otherwise doubles. 
+        // math_pow : integer preserving, otherwise doubles.
         add(registry, math+"pow",       Math_pow.class) ;      // -> XSDFuncOp
         add(registry, math+"sqrt",      sqrt.class) ;
-    
+
         // From leviathan, with math: naming.
         add(registry, math+"sin",       sin.class) ;
         add(registry, math+"cos",       cos.class) ;
@@ -249,13 +249,16 @@ public class StandardFunctions
         add(registry, math+"asin",      sin1.class) ;
         add(registry, math+"acos",      cos1.class) ;
         add(registry, math+"atan",      tan1.class) ;
-        
+
         add(registry, math+"atan2",     Math_atan2.class) ;
-        
+
         // F&O 3.1
         add(registry, xfn+"apply",           FN_Apply.class);
         add(registry, xfn+"collation-key",   FN_CollationKey.class);
 
+        add(registry, xfn+"numeric-mod",              Op_NumericMod.class);
+        add(registry, xfn+"numeric-integer-divide",   Op_NumericIntegerDivide.class);
+
         // And add op:'s
 //        4.2.1 op:numeric-add
 //        4.2.2 op:numeric-subtract
@@ -314,7 +317,7 @@ public class StandardFunctions
 //        9.7.13 op:add-dayTimeDuration-to-time
 //        9.7.14 op:subtract-dayTimeDuration-from-time
     }
-    
+
     private static void addCastXSD(FunctionRegistry registry, XSDDatatype dt) {
         registry.put(dt.getURI(), new FunctionCastXSD(dt)) ;
     }
diff --git a/jena-arq/src/main/java/org/apache/jena/sparql/function/library/Op_NumericIntegerDivide.java b/jena-arq/src/main/java/org/apache/jena/sparql/function/library/Op_NumericIntegerDivide.java
new file mode 100644
index 0000000..5fa70d8
--- /dev/null
+++ b/jena-arq/src/main/java/org/apache/jena/sparql/function/library/Op_NumericIntegerDivide.java
@@ -0,0 +1,32 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.jena.sparql.function.library;
+
+import org.apache.jena.sparql.expr.NodeValue;
+import org.apache.jena.sparql.expr.nodevalue.XSDFuncOp;
+import org.apache.jena.sparql.function.FunctionBase2;
+
+public class Op_NumericIntegerDivide extends FunctionBase2 {
+    public Op_NumericIntegerDivide() { super() ; }
+
+    @Override
+    public NodeValue exec(NodeValue v1, NodeValue v2) {
+        return XSDFuncOp.numIntegerDivide(v1, v2);
+    }
+}
diff --git a/jena-arq/src/main/java/org/apache/jena/sparql/function/library/Op_NumericMod.java b/jena-arq/src/main/java/org/apache/jena/sparql/function/library/Op_NumericMod.java
new file mode 100644
index 0000000..6f89cca
--- /dev/null
+++ b/jena-arq/src/main/java/org/apache/jena/sparql/function/library/Op_NumericMod.java
@@ -0,0 +1,32 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.jena.sparql.function.library;
+
+import org.apache.jena.sparql.expr.NodeValue;
+import org.apache.jena.sparql.expr.nodevalue.XSDFuncOp;
+import org.apache.jena.sparql.function.FunctionBase2;
+
+public class Op_NumericMod extends FunctionBase2 {
+    public Op_NumericMod() { super() ; }
+
+    @Override
+    public NodeValue exec(NodeValue v1, NodeValue v2) {
+        return XSDFuncOp.numericMod(v1, v2);
+    }
+}
diff --git a/jena-arq/src/main/java/org/apache/jena/sparql/lang/arq/ARQParser.java b/jena-arq/src/main/java/org/apache/jena/sparql/lang/arq/ARQParser.java
index 5275c77..3044f80 100644
--- a/jena-arq/src/main/java/org/apache/jena/sparql/lang/arq/ARQParser.java
+++ b/jena-arq/src/main/java/org/apache/jena/sparql/lang/arq/ARQParser.java
@@ -228,6 +228,8 @@ setAllowAggregatesInExpressions(true) ;
     case CEIL:
     case FLOOR:
     case ROUND:
+    case MOD:
+    case IDIV:
     case CONCAT:
     case SUBSTR:
     case STRLEN:
@@ -333,6 +335,8 @@ getQuery().addResultVar(v) ;
         case CEIL:
         case FLOOR:
         case ROUND:
+        case MOD:
+        case IDIV:
         case CONCAT:
         case SUBSTR:
         case STRLEN:
@@ -502,6 +506,8 @@ getQuery().setQueryResultStar(false) ;
         case CEIL:
         case FLOOR:
         case ROUND:
+        case MOD:
+        case IDIV:
         case CONCAT:
         case SUBSTR:
         case STRLEN:
@@ -954,6 +960,8 @@ finishWherePattern() ;
       case CEIL:
       case FLOOR:
       case ROUND:
+      case MOD:
+      case IDIV:
       case CONCAT:
       case SUBSTR:
       case STRLEN:
@@ -1044,6 +1052,8 @@ finishWherePattern() ;
     case CEIL:
     case FLOOR:
     case ROUND:
+    case MOD:
+    case IDIV:
     case CONCAT:
     case SUBSTR:
     case STRLEN:
@@ -1172,6 +1182,8 @@ setAllowAggregatesInExpressions(true) ;
       case CEIL:
       case FLOOR:
       case ROUND:
+      case MOD:
+      case IDIV:
       case CONCAT:
       case SUBSTR:
       case STRLEN:
@@ -1281,6 +1293,8 @@ setAllowAggregatesInExpressions(true) ;
       case CEIL:
       case FLOOR:
       case ROUND:
+      case MOD:
+      case IDIV:
       case CONCAT:
       case SUBSTR:
       case STRLEN:
@@ -1399,6 +1413,8 @@ direction = Query.ORDER_DESCENDING ;
     case CEIL:
     case FLOOR:
     case ROUND:
+    case MOD:
+    case IDIV:
     case CONCAT:
     case SUBSTR:
     case STRLEN:
@@ -1481,6 +1497,8 @@ direction = Query.ORDER_DESCENDING ;
       case CEIL:
       case FLOOR:
       case ROUND:
+      case MOD:
+      case IDIV:
       case CONCAT:
       case SUBSTR:
       case STRLEN:
@@ -2988,6 +3006,8 @@ el2.addElement(el) ;
     case CEIL:
     case FLOOR:
     case ROUND:
+    case MOD:
+    case IDIV:
     case CONCAT:
     case SUBSTR:
     case STRLEN:
@@ -4676,6 +4696,8 @@ if ( addition )
     label_41:
     while (true) {
       switch ((jj_ntk==-1)?jj_ntk_f():jj_ntk) {
+      case MOD:
+      case IDIV:
       case STAR:
       case SLASH:{
         ;
@@ -4698,6 +4720,18 @@ expr1 = new E_Multiply(expr1, expr2) ;
 expr1 = new E_Divide(expr1, expr2) ;
         break;
         }
+      case MOD:{
+        jj_consume_token(MOD);
+        expr2 = UnaryExpression();
+expr1 = new E_OpNumericMod(expr1, expr2) ;
+        break;
+        }
+      case IDIV:{
+        jj_consume_token(IDIV);
+        expr2 = UnaryExpression();
+expr1 = new E_OpNumericIntegerDivide(expr1, expr2) ;
+        break;
+        }
       default:
         jj_la1[150] = jj_gen;
         jj_consume_token(-1);
@@ -4781,6 +4815,8 @@ expr1 = new E_Divide(expr1, expr2) ;
     case CEIL:
     case FLOOR:
     case ROUND:
+    case MOD:
+    case IDIV:
     case CONCAT:
     case SUBSTR:
     case STRLEN:
@@ -4894,6 +4930,8 @@ expr1 = new E_Divide(expr1, expr2) ;
     case CEIL:
     case FLOOR:
     case ROUND:
+    case MOD:
+    case IDIV:
     case CONCAT:
     case SUBSTR:
     case STRLEN:
@@ -5192,6 +5230,26 @@ n = createTripleTerm(s, p, o, t.beginLine, t.beginColumn);
 {if ("" != null) return new E_NumRound(expr1) ;}
       break;
       }
+    case MOD:{
+      jj_consume_token(MOD);
+      jj_consume_token(LPAREN);
+      expr1 = Expression();
+      jj_consume_token(COMMA);
+      expr2 = Expression();
+      jj_consume_token(RPAREN);
+{if ("" != null) return new E_OpNumericMod(expr1, expr2);}
+      break;
+      }
+    case IDIV:{
+      jj_consume_token(IDIV);
+      jj_consume_token(LPAREN);
+      expr1 = Expression();
+      jj_consume_token(COMMA);
+      expr2 = Expression();
+      jj_consume_token(RPAREN);
+{if ("" != null) return new E_OpNumericIntegerDivide(expr1, expr2);}
+      break;
+      }
     case CONCAT:{
       jj_consume_token(CONCAT);
       a = ExpressionList();
@@ -5756,6 +5814,8 @@ distinct = true ;
       case CEIL:
       case FLOOR:
       case ROUND:
+      case MOD:
+      case IDIV:
       case CONCAT:
       case SUBSTR:
       case STRLEN:
@@ -6457,30 +6517,44 @@ checkString(lex, t.beginLine, t.beginColumn) ;
     finally { jj_save(4, xla); }
   }
 
-  private boolean jj_3R_116()
+  private boolean jj_3R_117()
  {
-    if (jj_scan_token(REPLACE)) return true;
+    if (jj_scan_token(SUBSTR)) return true;
     if (jj_scan_token(LPAREN)) return true;
     return false;
   }
 
-  private boolean jj_3R_115()
+  private boolean jj_3R_119()
  {
-    if (jj_scan_token(SUBSTR)) return true;
+    if (jj_scan_token(REGEX)) return true;
     if (jj_scan_token(LPAREN)) return true;
     return false;
   }
 
-  private boolean jj_3R_117()
+  private boolean jj_3R_109()
  {
-    if (jj_scan_token(REGEX)) return true;
+    if (jj_scan_token(OBJECT)) return true;
+    if (jj_scan_token(LPAREN)) return true;
+    return false;
+  }
+
+  private boolean jj_3R_108()
+ {
+    if (jj_scan_token(PREDICATE)) return true;
     if (jj_scan_token(LPAREN)) return true;
     return false;
   }
 
   private boolean jj_3R_107()
  {
-    if (jj_scan_token(OBJECT)) return true;
+    if (jj_scan_token(SUBJECT)) return true;
+    if (jj_scan_token(LPAREN)) return true;
+    return false;
+  }
+
+  private boolean jj_3R_106()
+ {
+    if (jj_scan_token(TRIPLE)) return true;
     if (jj_scan_token(LPAREN)) return true;
     return false;
   }
@@ -6491,33 +6565,33 @@ checkString(lex, t.beginLine, t.beginColumn) ;
     if (jj_3R_44()) return true;
     Token xsp;
     xsp = jj_scanpos;
-    if (jj_scan_token(143)) {
-    jj_scanpos = xsp;
-    if (jj_scan_token(144)) {
-    jj_scanpos = xsp;
-    if (jj_scan_token(151)) {
+    if (jj_scan_token(145)) {
     jj_scanpos = xsp;
     if (jj_scan_token(146)) {
     jj_scanpos = xsp;
-    if (jj_scan_token(147)) {
+    if (jj_scan_token(153)) {
     jj_scanpos = xsp;
     if (jj_scan_token(148)) {
     jj_scanpos = xsp;
-    if (jj_scan_token(145)) {
+    if (jj_scan_token(149)) {
     jj_scanpos = xsp;
-    if (jj_scan_token(156)) {
+    if (jj_scan_token(150)) {
     jj_scanpos = xsp;
-    if (jj_scan_token(139)) {
+    if (jj_scan_token(147)) {
     jj_scanpos = xsp;
-    if (jj_scan_token(138)) {
+    if (jj_scan_token(158)) {
     jj_scanpos = xsp;
-    if (jj_scan_token(157)) {
+    if (jj_scan_token(141)) {
     jj_scanpos = xsp;
     if (jj_scan_token(140)) {
     jj_scanpos = xsp;
-    if (jj_scan_token(141)) {
+    if (jj_scan_token(159)) {
+    jj_scanpos = xsp;
+    if (jj_scan_token(142)) {
+    jj_scanpos = xsp;
+    if (jj_scan_token(143)) {
     jj_scanpos = xsp;
-    if (jj_scan_token(142)) return true;
+    if (jj_scan_token(144)) return true;
     }
     }
     }
@@ -6534,362 +6608,355 @@ checkString(lex, t.beginLine, t.beginColumn) ;
     return false;
   }
 
-  private boolean jj_3R_106()
- {
-    if (jj_scan_token(PREDICATE)) return true;
-    if (jj_scan_token(LPAREN)) return true;
-    return false;
-  }
-
   private boolean jj_3R_105()
  {
-    if (jj_scan_token(SUBJECT)) return true;
+    if (jj_scan_token(IS_TRIPLE)) return true;
     if (jj_scan_token(LPAREN)) return true;
     return false;
   }
 
   private boolean jj_3R_104()
  {
-    if (jj_scan_token(TRIPLE)) return true;
-    if (jj_scan_token(LPAREN)) return true;
+    if (jj_3R_121()) return true;
     return false;
   }
 
   private boolean jj_3R_103()
  {
-    if (jj_scan_token(IS_TRIPLE)) return true;
-    if (jj_scan_token(LPAREN)) return true;
+    if (jj_3R_120()) return true;
     return false;
   }
 
-  private boolean jj_3R_154()
+  private boolean jj_3R_102()
  {
-    if (jj_scan_token(LPAREN)) return true;
+    if (jj_3R_119()) return true;
     return false;
   }
 
-  private boolean jj_3R_102()
+  private boolean jj_3R_101()
  {
-    if (jj_3R_119()) return true;
+    if (jj_scan_token(IS_NUMERIC)) return true;
+    if (jj_scan_token(LPAREN)) return true;
     return false;
   }
 
-  private boolean jj_3R_101()
+  private boolean jj_3R_156()
  {
-    if (jj_3R_118()) return true;
+    if (jj_scan_token(LPAREN)) return true;
     return false;
   }
 
   private boolean jj_3R_100()
  {
-    if (jj_3R_117()) return true;
+    if (jj_scan_token(IS_LITERAL)) return true;
+    if (jj_scan_token(LPAREN)) return true;
     return false;
   }
 
   private boolean jj_3R_99()
  {
-    if (jj_scan_token(IS_NUMERIC)) return true;
+    if (jj_scan_token(IS_BLANK)) return true;
     if (jj_scan_token(LPAREN)) return true;
     return false;
   }
 
   private boolean jj_3R_98()
  {
-    if (jj_scan_token(IS_LITERAL)) return true;
+    if (jj_scan_token(IS_URI)) return true;
     if (jj_scan_token(LPAREN)) return true;
     return false;
   }
 
   private boolean jj_3R_97()
  {
-    if (jj_scan_token(IS_BLANK)) return true;
+    if (jj_scan_token(IS_IRI)) return true;
     if (jj_scan_token(LPAREN)) return true;
     return false;
   }
 
   private boolean jj_3R_96()
  {
-    if (jj_scan_token(IS_URI)) return true;
+    if (jj_scan_token(SAME_TERM)) return true;
     if (jj_scan_token(LPAREN)) return true;
     return false;
   }
 
   private boolean jj_3R_95()
  {
-    if (jj_scan_token(IS_IRI)) return true;
+    if (jj_scan_token(STRDT)) return true;
     if (jj_scan_token(LPAREN)) return true;
     return false;
   }
 
   private boolean jj_3R_94()
  {
-    if (jj_scan_token(SAME_TERM)) return true;
+    if (jj_scan_token(STRLANG)) return true;
     if (jj_scan_token(LPAREN)) return true;
     return false;
   }
 
   private boolean jj_3R_93()
  {
-    if (jj_scan_token(STRDT)) return true;
+    if (jj_scan_token(IF)) return true;
     if (jj_scan_token(LPAREN)) return true;
     return false;
   }
 
-  private boolean jj_3R_92()
+  private boolean jj_3R_157()
  {
-    if (jj_scan_token(STRLANG)) return true;
-    if (jj_scan_token(LPAREN)) return true;
+    if (jj_scan_token(LBRACKET)) return true;
     return false;
   }
 
-  private boolean jj_3R_155()
+  private boolean jj_3R_92()
  {
-    if (jj_scan_token(LBRACKET)) return true;
+    if (jj_scan_token(CALL)) return true;
+    if (jj_scan_token(LPAREN)) return true;
     return false;
   }
 
   private boolean jj_3R_91()
  {
-    if (jj_scan_token(IF)) return true;
-    if (jj_scan_token(LPAREN)) return true;
+    if (jj_scan_token(COALESCE)) return true;
+    if (jj_3R_116()) return true;
     return false;
   }
 
-  private boolean jj_3R_148()
+  private boolean jj_3R_150()
  {
-    if (jj_3R_155()) return true;
+    if (jj_3R_157()) return true;
     return false;
   }
 
-  private boolean jj_3R_123()
+  private boolean jj_3R_90()
  {
-    Token xsp;
-    xsp = jj_scanpos;
-    if (jj_3R_147()) {
-    jj_scanpos = xsp;
-    if (jj_3R_148()) return true;
-    }
+    if (jj_scan_token(VERSION)) return true;
+    if (jj_scan_token(NIL)) return true;
     return false;
   }
 
-  private boolean jj_3R_147()
+  private boolean jj_3R_89()
  {
-    if (jj_3R_154()) return true;
+    if (jj_scan_token(SHA512)) return true;
+    if (jj_scan_token(LPAREN)) return true;
     return false;
   }
 
-  private boolean jj_3R_90()
+  private boolean jj_3R_125()
  {
-    if (jj_scan_token(CALL)) return true;
-    if (jj_scan_token(LPAREN)) return true;
+    Token xsp;
+    xsp = jj_scanpos;
+    if (jj_3R_149()) {
+    jj_scanpos = xsp;
+    if (jj_3R_150()) return true;
+    }
     return false;
   }
 
-  private boolean jj_3R_89()
+  private boolean jj_3R_149()
  {
-    if (jj_scan_token(COALESCE)) return true;
-    if (jj_3R_114()) return true;
+    if (jj_3R_156()) return true;
     return false;
   }
 
   private boolean jj_3R_88()
  {
-    if (jj_scan_token(VERSION)) return true;
-    if (jj_scan_token(NIL)) return true;
+    if (jj_scan_token(SHA384)) return true;
+    if (jj_scan_token(LPAREN)) return true;
     return false;
   }
 
   private boolean jj_3R_87()
  {
-    if (jj_scan_token(SHA512)) return true;
+    if (jj_scan_token(SHA256)) return true;
     if (jj_scan_token(LPAREN)) return true;
     return false;
   }
 
   private boolean jj_3R_86()
  {
-    if (jj_scan_token(SHA384)) return true;
+    if (jj_scan_token(SHA1)) return true;
     if (jj_scan_token(LPAREN)) return true;
     return false;
   }
 
   private boolean jj_3R_85()
  {
-    if (jj_scan_token(SHA256)) return true;
+    if (jj_scan_token(MD5)) return true;
     if (jj_scan_token(LPAREN)) return true;
     return false;
   }
 
   private boolean jj_3R_84()
  {
-    if (jj_scan_token(SHA1)) return true;
-    if (jj_scan_token(LPAREN)) return true;
+    if (jj_scan_token(STRUUID)) return true;
+    if (jj_scan_token(NIL)) return true;
     return false;
   }
 
   private boolean jj_3R_83()
  {
-    if (jj_scan_token(MD5)) return true;
-    if (jj_scan_token(LPAREN)) return true;
+    if (jj_scan_token(UUID)) return true;
+    if (jj_scan_token(NIL)) return true;
     return false;
   }
 
   private boolean jj_3R_82()
  {
-    if (jj_scan_token(STRUUID)) return true;
+    if (jj_scan_token(NOW)) return true;
     if (jj_scan_token(NIL)) return true;
     return false;
   }
 
   private boolean jj_3R_81()
  {
-    if (jj_scan_token(UUID)) return true;
-    if (jj_scan_token(NIL)) return true;
+    if (jj_scan_token(TZ)) return true;
+    if (jj_scan_token(LPAREN)) return true;
     return false;
   }
 
   private boolean jj_3R_80()
  {
-    if (jj_scan_token(NOW)) return true;
-    if (jj_scan_token(NIL)) return true;
+    if (jj_scan_token(TIMEZONE)) return true;
+    if (jj_scan_token(LPAREN)) return true;
     return false;
   }
 
   private boolean jj_3R_79()
  {
-    if (jj_scan_token(TZ)) return true;
+    if (jj_scan_token(SECONDS)) return true;
     if (jj_scan_token(LPAREN)) return true;
     return false;
   }
 
   private boolean jj_3R_78()
  {
-    if (jj_scan_token(TIMEZONE)) return true;
+    if (jj_scan_token(MINUTES)) return true;
     if (jj_scan_token(LPAREN)) return true;
     return false;
   }
 
   private boolean jj_3R_77()
  {
-    if (jj_scan_token(SECONDS)) return true;
+    if (jj_scan_token(HOURS)) return true;
     if (jj_scan_token(LPAREN)) return true;
     return false;
   }
 
   private boolean jj_3R_76()
  {
-    if (jj_scan_token(MINUTES)) return true;
+    if (jj_scan_token(DAY)) return true;
     if (jj_scan_token(LPAREN)) return true;
     return false;
   }
 
   private boolean jj_3R_75()
  {
-    if (jj_scan_token(HOURS)) return true;
+    if (jj_scan_token(MONTH)) return true;
     if (jj_scan_token(LPAREN)) return true;
     return false;
   }
 
   private boolean jj_3R_74()
  {
-    if (jj_scan_token(DAY)) return true;
+    if (jj_scan_token(YEAR)) return true;
     if (jj_scan_token(LPAREN)) return true;
     return false;
   }
 
   private boolean jj_3R_73()
  {
-    if (jj_scan_token(MONTH)) return true;
+    if (jj_scan_token(STRAFTER)) return true;
     if (jj_scan_token(LPAREN)) return true;
     return false;
   }
 
   private boolean jj_3R_72()
  {
-    if (jj_scan_token(YEAR)) return true;
+    if (jj_scan_token(STRBEFORE)) return true;
     if (jj_scan_token(LPAREN)) return true;
     return false;
   }
 
   private boolean jj_3R_71()
  {
-    if (jj_scan_token(STRAFTER)) return true;
+    if (jj_scan_token(STRENDS)) return true;
     if (jj_scan_token(LPAREN)) return true;
     return false;
   }
 
   private boolean jj_3R_70()
  {
-    if (jj_scan_token(STRBEFORE)) return true;
+    if (jj_scan_token(STRSTARTS)) return true;
     if (jj_scan_token(LPAREN)) return true;
     return false;
   }
 
   private boolean jj_3R_69()
  {
-    if (jj_scan_token(STRENDS)) return true;
+    if (jj_scan_token(CONTAINS)) return true;
     if (jj_scan_token(LPAREN)) return true;
     return false;
   }
 
   private boolean jj_3R_68()
  {
-    if (jj_scan_token(STRSTARTS)) return true;
+    if (jj_scan_token(ENCODE_FOR_URI)) return true;
     if (jj_scan_token(LPAREN)) return true;
     return false;
   }
 
   private boolean jj_3R_67()
  {
-    if (jj_scan_token(CONTAINS)) return true;
+    if (jj_scan_token(LCASE)) return true;
     if (jj_scan_token(LPAREN)) return true;
     return false;
   }
 
   private boolean jj_3R_66()
  {
-    if (jj_scan_token(ENCODE_FOR_URI)) return true;
+    if (jj_scan_token(UCASE)) return true;
     if (jj_scan_token(LPAREN)) return true;
     return false;
   }
 
   private boolean jj_3R_65()
  {
-    if (jj_scan_token(LCASE)) return true;
-    if (jj_scan_token(LPAREN)) return true;
+    if (jj_3R_118()) return true;
     return false;
   }
 
   private boolean jj_3R_64()
  {
-    if (jj_scan_token(UCASE)) return true;
+    if (jj_scan_token(STRLEN)) return true;
     if (jj_scan_token(LPAREN)) return true;
     return false;
   }
 
   private boolean jj_3R_63()
  {
-    if (jj_3R_116()) return true;
+    if (jj_3R_117()) return true;
     return false;
   }
 
   private boolean jj_3R_62()
  {
-    if (jj_scan_token(STRLEN)) return true;
-    if (jj_scan_token(LPAREN)) return true;
+    if (jj_scan_token(CONCAT)) return true;
+    if (jj_3R_116()) return true;
     return false;
   }
 
   private boolean jj_3R_61()
  {
-    if (jj_3R_115()) return true;
+    if (jj_scan_token(IDIV)) return true;
+    if (jj_scan_token(LPAREN)) return true;
     return false;
   }
 
   private boolean jj_3R_60()
  {
-    if (jj_scan_token(CONCAT)) return true;
-    if (jj_3R_114()) return true;
+    if (jj_scan_token(MOD)) return true;
+    if (jj_scan_token(LPAREN)) return true;
     return false;
   }
 
@@ -6928,13 +6995,13 @@ checkString(lex, t.beginLine, t.beginColumn) ;
     return false;
   }
 
-  private boolean jj_3R_113()
+  private boolean jj_3R_115()
  {
     if (jj_scan_token(NIL)) return true;
     return false;
   }
 
-  private boolean jj_3R_112()
+  private boolean jj_3R_114()
  {
     if (jj_scan_token(LPAREN)) return true;
     return false;
@@ -6945,9 +7012,9 @@ checkString(lex, t.beginLine, t.beginColumn) ;
     if (jj_scan_token(BNODE)) return true;
     Token xsp;
     xsp = jj_scanpos;
-    if (jj_3R_112()) {
+    if (jj_3R_114()) {
     jj_scanpos = xsp;
-    if (jj_3R_113()) return true;
+    if (jj_3R_115()) return true;
     }
     return false;
   }
@@ -7003,7 +7070,7 @@ checkString(lex, t.beginLine, t.beginColumn) ;
 
   private boolean jj_3R_46()
  {
-    if (jj_3R_111()) return true;
+    if (jj_3R_113()) return true;
     return false;
   }
 
@@ -7133,7 +7200,13 @@ checkString(lex, t.beginLine, t.beginColumn) ;
     jj_scanpos = xsp;
     if (jj_3R_106()) {
     jj_scanpos = xsp;
-    if (jj_3R_107()) return true;
+    if (jj_3R_107()) {
+    jj_scanpos = xsp;
+    if (jj_3R_108()) {
+    jj_scanpos = xsp;
+    if (jj_3R_109()) return true;
+    }
+    }
     }
     }
     }
@@ -7198,281 +7271,281 @@ checkString(lex, t.beginLine, t.beginColumn) ;
     return false;
   }
 
-  private boolean jj_3R_150()
+  private boolean jj_3R_152()
  {
     if (jj_scan_token(IRIref)) return true;
     return false;
   }
 
-  private boolean jj_3R_141()
- {
-    if (jj_scan_token(LBRACE)) return true;
-    return false;
-  }
-
-  private boolean jj_3R_178()
+  private boolean jj_3R_180()
  {
     if (jj_scan_token(ANON)) return true;
     return false;
   }
 
-  private boolean jj_3_3()
- {
-    if (jj_scan_token(DOT)) return true;
-    if (jj_3R_45()) return true;
-    return false;
-  }
-
-  private boolean jj_3R_168()
+  private boolean jj_3R_170()
  {
     Token xsp;
     xsp = jj_scanpos;
-    if (jj_3R_177()) {
+    if (jj_3R_179()) {
     jj_scanpos = xsp;
-    if (jj_3R_178()) return true;
+    if (jj_3R_180()) return true;
     }
     return false;
   }
 
-  private boolean jj_3R_177()
+  private boolean jj_3R_179()
  {
     if (jj_scan_token(BLANK_NODE_LABEL)) return true;
     return false;
   }
 
-  private boolean jj_3R_170()
+  private boolean jj_3R_143()
+ {
+    if (jj_scan_token(LBRACE)) return true;
+    return false;
+  }
+
+  private boolean jj_3R_172()
  {
     if (jj_scan_token(PNAME_NS)) return true;
     return false;
   }
 
-  private boolean jj_3R_169()
+  private boolean jj_3_3()
+ {
+    if (jj_scan_token(DOT)) return true;
+    if (jj_3R_45()) return true;
+    return false;
+  }
+
+  private boolean jj_3R_171()
  {
     if (jj_scan_token(PNAME_LN)) return true;
     return false;
   }
 
-  private boolean jj_3R_164()
+  private boolean jj_3R_166()
  {
     Token xsp;
     xsp = jj_scanpos;
-    if (jj_3R_169()) {
+    if (jj_3R_171()) {
     jj_scanpos = xsp;
-    if (jj_3R_170()) return true;
+    if (jj_3R_172()) return true;
     }
     return false;
   }
 
-  private boolean jj_3R_157()
+  private boolean jj_3R_159()
  {
-    if (jj_3R_164()) return true;
+    if (jj_3R_166()) return true;
     return false;
   }
 
-  private boolean jj_3R_149()
+  private boolean jj_3R_151()
  {
     Token xsp;
     xsp = jj_scanpos;
-    if (jj_3R_156()) {
+    if (jj_3R_158()) {
     jj_scanpos = xsp;
-    if (jj_3R_157()) return true;
+    if (jj_3R_159()) return true;
     }
     return false;
   }
 
-  private boolean jj_3R_156()
+  private boolean jj_3R_158()
  {
-    if (jj_3R_150()) return true;
+    if (jj_3R_152()) return true;
     return false;
   }
 
-  private boolean jj_3R_182()
+  private boolean jj_3R_184()
  {
     if (jj_scan_token(STRING_LITERAL_LONG2)) return true;
     return false;
   }
 
-  private boolean jj_3R_181()
+  private boolean jj_3R_183()
  {
     if (jj_scan_token(STRING_LITERAL_LONG1)) return true;
     return false;
   }
 
-  private boolean jj_3R_180()
+  private boolean jj_3R_182()
  {
     if (jj_scan_token(STRING_LITERAL2)) return true;
     return false;
   }
 
-  private boolean jj_3R_179()
+  private boolean jj_3R_181()
  {
     if (jj_scan_token(STRING_LITERAL1)) return true;
     return false;
   }
 
-  private boolean jj_3R_171()
+  private boolean jj_3R_173()
  {
     Token xsp;
     xsp = jj_scanpos;
-    if (jj_3R_179()) {
+    if (jj_3R_181()) {
     jj_scanpos = xsp;
-    if (jj_3R_180()) {
+    if (jj_3R_182()) {
     jj_scanpos = xsp;
-    if (jj_3R_181()) {
+    if (jj_3R_183()) {
     jj_scanpos = xsp;
-    if (jj_3R_182()) return true;
+    if (jj_3R_184()) return true;
     }
     }
     }
     return false;
   }
 
-  private boolean jj_3R_176()
+  private boolean jj_3R_178()
  {
     if (jj_scan_token(FALSE)) return true;
     return false;
   }
 
-  private boolean jj_3R_167()
+  private boolean jj_3R_169()
  {
     Token xsp;
     xsp = jj_scanpos;
-    if (jj_3R_175()) {
+    if (jj_3R_177()) {
     jj_scanpos = xsp;
-    if (jj_3R_176()) return true;
+    if (jj_3R_178()) return true;
     }
     return false;
   }
 
-  private boolean jj_3R_175()
+  private boolean jj_3R_177()
  {
     if (jj_scan_token(TRUE)) return true;
     return false;
   }
 
-  private boolean jj_3R_194()
+  private boolean jj_3R_196()
  {
     if (jj_scan_token(DOUBLE_NEGATIVE)) return true;
     return false;
   }
 
-  private boolean jj_3R_193()
+  private boolean jj_3R_195()
  {
     if (jj_scan_token(DECIMAL_NEGATIVE)) return true;
     return false;
   }
 
-  private boolean jj_3R_192()
+  private boolean jj_3R_194()
  {
     if (jj_scan_token(INTEGER_NEGATIVE)) return true;
     return false;
   }
 
-  private boolean jj_3R_185()
+  private boolean jj_3R_187()
  {
     Token xsp;
     xsp = jj_scanpos;
-    if (jj_3R_192()) {
+    if (jj_3R_194()) {
     jj_scanpos = xsp;
-    if (jj_3R_193()) {
+    if (jj_3R_195()) {
     jj_scanpos = xsp;
-    if (jj_3R_194()) return true;
+    if (jj_3R_196()) return true;
     }
     }
     return false;
   }
 
-  private boolean jj_3R_191()
+  private boolean jj_3R_193()
  {
     if (jj_scan_token(DOUBLE_POSITIVE)) return true;
     return false;
   }
 
-  private boolean jj_3R_190()
+  private boolean jj_3R_192()
  {
     if (jj_scan_token(DECIMAL_POSITIVE)) return true;
     return false;
   }
 
-  private boolean jj_3R_189()
+  private boolean jj_3R_191()
  {
     if (jj_scan_token(INTEGER_POSITIVE)) return true;
     return false;
   }
 
-  private boolean jj_3R_184()
+  private boolean jj_3R_186()
  {
     Token xsp;
     xsp = jj_scanpos;
-    if (jj_3R_189()) {
+    if (jj_3R_191()) {
     jj_scanpos = xsp;
-    if (jj_3R_190()) {
+    if (jj_3R_192()) {
     jj_scanpos = xsp;
-    if (jj_3R_191()) return true;
+    if (jj_3R_193()) return true;
     }
     }
     return false;
   }
 
-  private boolean jj_3R_188()
+  private boolean jj_3R_190()
  {
     if (jj_scan_token(DOUBLE)) return true;
     return false;
   }
 
-  private boolean jj_3R_187()
+  private boolean jj_3R_189()
  {
     if (jj_scan_token(DECIMAL)) return true;
     return false;
   }
 
-  private boolean jj_3R_186()
+  private boolean jj_3R_188()
  {
     if (jj_scan_token(INTEGER)) return true;
     return false;
   }
 
-  private boolean jj_3R_183()
+  private boolean jj_3R_185()
  {
     Token xsp;
     xsp = jj_scanpos;
-    if (jj_3R_186()) {
+    if (jj_3R_188()) {
     jj_scanpos = xsp;
-    if (jj_3R_187()) {
+    if (jj_3R_189()) {
     jj_scanpos = xsp;
-    if (jj_3R_188()) return true;
+    if (jj_3R_190()) return true;
     }
     }
     return false;
   }
 
-  private boolean jj_3R_174()
+  private boolean jj_3R_176()
  {
-    if (jj_3R_185()) return true;
+    if (jj_3R_187()) return true;
     return false;
   }
 
-  private boolean jj_3R_173()
+  private boolean jj_3R_175()
  {
-    if (jj_3R_184()) return true;
+    if (jj_3R_186()) return true;
     return false;
   }
 
-  private boolean jj_3R_172()
+  private boolean jj_3R_174()
  {
-    if (jj_3R_183()) return true;
+    if (jj_3R_185()) return true;
     return false;
   }
 
-  private boolean jj_3R_166()
+  private boolean jj_3R_168()
  {
     Token xsp;
     xsp = jj_scanpos;
-    if (jj_3R_172()) {
+    if (jj_3R_174()) {
     jj_scanpos = xsp;
-    if (jj_3R_173()) {
+    if (jj_3R_175()) {
     jj_scanpos = xsp;
-    if (jj_3R_174()) return true;
+    if (jj_3R_176()) return true;
     }
     }
     return false;
@@ -7484,63 +7557,63 @@ checkString(lex, t.beginLine, t.beginColumn) ;
     return false;
   }
 
-  private boolean jj_3R_165()
+  private boolean jj_3R_167()
  {
-    if (jj_3R_171()) return true;
+    if (jj_3R_173()) return true;
     return false;
   }
 
-  private boolean jj_3R_163()
+  private boolean jj_3R_165()
  {
     if (jj_scan_token(NIL)) return true;
     return false;
   }
 
-  private boolean jj_3R_162()
+  private boolean jj_3R_164()
  {
-    if (jj_3R_168()) return true;
+    if (jj_3R_170()) return true;
     return false;
   }
 
-  private boolean jj_3R_161()
+  private boolean jj_3R_163()
  {
-    if (jj_3R_167()) return true;
+    if (jj_3R_169()) return true;
     return false;
   }
 
-  private boolean jj_3R_160()
+  private boolean jj_3R_162()
  {
-    if (jj_3R_166()) return true;
+    if (jj_3R_168()) return true;
     return false;
   }
 
-  private boolean jj_3R_159()
+  private boolean jj_3R_161()
  {
-    if (jj_3R_165()) return true;
+    if (jj_3R_167()) return true;
     return false;
   }
 
-  private boolean jj_3R_110()
+  private boolean jj_3R_112()
  {
-    if (jj_3R_123()) return true;
+    if (jj_3R_125()) return true;
     return false;
   }
 
-  private boolean jj_3R_153()
+  private boolean jj_3R_155()
  {
     Token xsp;
     xsp = jj_scanpos;
-    if (jj_3R_158()) {
-    jj_scanpos = xsp;
-    if (jj_3R_159()) {
-    jj_scanpos = xsp;
     if (jj_3R_160()) {
     jj_scanpos = xsp;
     if (jj_3R_161()) {
     jj_scanpos = xsp;
     if (jj_3R_162()) {
     jj_scanpos = xsp;
-    if (jj_3R_163()) return true;
+    if (jj_3R_163()) {
+    jj_scanpos = xsp;
+    if (jj_3R_164()) {
+    jj_scanpos = xsp;
+    if (jj_3R_165()) return true;
     }
     }
     }
@@ -7549,9 +7622,9 @@ checkString(lex, t.beginLine, t.beginColumn) ;
     return false;
   }
 
-  private boolean jj_3R_158()
+  private boolean jj_3R_160()
  {
-    if (jj_3R_149()) return true;
+    if (jj_3R_151()) return true;
     return false;
   }
 
@@ -7559,20 +7632,20 @@ checkString(lex, t.beginLine, t.beginColumn) ;
  {
     Token xsp;
     xsp = jj_scanpos;
-    if (jj_3R_109()) {
+    if (jj_3R_111()) {
     jj_scanpos = xsp;
-    if (jj_3R_110()) return true;
+    if (jj_3R_112()) return true;
     }
     return false;
   }
 
-  private boolean jj_3R_109()
+  private boolean jj_3R_111()
  {
-    if (jj_3R_122()) return true;
+    if (jj_3R_124()) return true;
     return false;
   }
 
-  private boolean jj_3R_152()
+  private boolean jj_3R_154()
  {
     Token xsp;
     xsp = jj_scanpos;
@@ -7590,120 +7663,120 @@ checkString(lex, t.beginLine, t.beginColumn) ;
     return false;
   }
 
-  private boolean jj_3R_121()
+  private boolean jj_3R_123()
  {
-    if (jj_3R_143()) return true;
+    if (jj_3R_145()) return true;
     return false;
   }
 
-  private boolean jj_3R_143()
+  private boolean jj_3R_145()
  {
     if (jj_scan_token(PREFIX)) return true;
     if (jj_scan_token(PNAME_NS)) return true;
-    if (jj_3R_150()) return true;
+    if (jj_3R_152()) return true;
     return false;
   }
 
-  private boolean jj_3R_142()
+  private boolean jj_3R_141()
  {
-    if (jj_scan_token(BASE)) return true;
-    if (jj_3R_150()) return true;
+    if (jj_scan_token(AGG)) return true;
+    if (jj_3R_151()) return true;
     return false;
   }
 
-  private boolean jj_3R_108()
+  private boolean jj_3R_140()
  {
-    Token xsp;
-    xsp = jj_scanpos;
-    if (jj_3R_120()) {
-    jj_scanpos = xsp;
-    if (jj_3R_121()) return true;
-    }
+    if (jj_scan_token(VAR_POP)) return true;
+    if (jj_scan_token(LPAREN)) return true;
     return false;
   }
 
-  private boolean jj_3R_120()
+  private boolean jj_3R_144()
  {
-    if (jj_3R_142()) return true;
+    if (jj_scan_token(BASE)) return true;
+    if (jj_3R_152()) return true;
     return false;
   }
 
   private boolean jj_3R_139()
  {
-    if (jj_scan_token(AGG)) return true;
-    if (jj_3R_149()) return true;
+    if (jj_scan_token(VAR_SAMP)) return true;
+    if (jj_scan_token(LPAREN)) return true;
     return false;
   }
 
-  private boolean jj_3R_44()
+  private boolean jj_3R_110()
  {
     Token xsp;
-    while (true) {
-      xsp = jj_scanpos;
-      if (jj_3R_108()) { jj_scanpos = xsp; break; }
+    xsp = jj_scanpos;
+    if (jj_3R_122()) {
+    jj_scanpos = xsp;
+    if (jj_3R_123()) return true;
     }
     return false;
   }
 
+  private boolean jj_3R_122()
+ {
+    if (jj_3R_144()) return true;
+    return false;
+  }
+
   private boolean jj_3R_138()
  {
-    if (jj_scan_token(VAR_POP)) return true;
+    if (jj_scan_token(VARIANCE)) return true;
     if (jj_scan_token(LPAREN)) return true;
     return false;
   }
 
-  private boolean jj_3R_137()
+  private boolean jj_3R_44()
  {
-    if (jj_scan_token(VAR_SAMP)) return true;
-    if (jj_scan_token(LPAREN)) return true;
+    Token xsp;
+    while (true) {
+      xsp = jj_scanpos;
+      if (jj_3R_110()) { jj_scanpos = xsp; break; }
+    }
     return false;
   }
 
-  private boolean jj_3R_136()
+  private boolean jj_3R_137()
  {
-    if (jj_scan_token(VARIANCE)) return true;
+    if (jj_scan_token(STDEV_POP)) return true;
     if (jj_scan_token(LPAREN)) return true;
     return false;
   }
 
-  private boolean jj_3R_140()
+  private boolean jj_3R_136()
  {
+    if (jj_scan_token(STDEV_SAMP)) return true;
     if (jj_scan_token(LPAREN)) return true;
     return false;
   }
 
   private boolean jj_3R_135()
  {
-    if (jj_scan_token(STDEV_POP)) return true;
+    if (jj_scan_token(STDEV)) return true;
     if (jj_scan_token(LPAREN)) return true;
     return false;
   }
 
-  private boolean jj_3R_134()
+  private boolean jj_3R_142()
  {
-    if (jj_scan_token(STDEV_SAMP)) return true;
     if (jj_scan_token(LPAREN)) return true;
     return false;
   }
 
-  private boolean jj_3R_114()
+  private boolean jj_3R_116()
  {
     Token xsp;
     xsp = jj_scanpos;
-    if (jj_scan_token(181)) {
+    if (jj_scan_token(183)) {
     jj_scanpos = xsp;
-    if (jj_3R_140()) return true;
+    if (jj_3R_142()) return true;
     }
     return false;
   }
 
-  private boolean jj_3R_133()
- {
-    if (jj_scan_token(STDEV)) return true;
-    if (jj_scan_token(LPAREN)) return true;
-    return false;
-  }
-
   private boolean jj_3_5()
  {
     if (jj_scan_token(SEMICOLON)) return true;
@@ -7711,115 +7784,111 @@ checkString(lex, t.beginLine, t.beginColumn) ;
     return false;
   }
 
-  private boolean jj_3R_151()
+  private boolean jj_3R_134()
  {
-    if (jj_scan_token(LT2)) return true;
+    if (jj_scan_token(GROUP_CONCAT)) return true;
+    if (jj_scan_token(LPAREN)) return true;
     return false;
   }
 
-  private boolean jj_3R_132()
+  private boolean jj_3R_133()
  {
-    if (jj_scan_token(GROUP_CONCAT)) return true;
+    if (jj_scan_token(SAMPLE)) return true;
     if (jj_scan_token(LPAREN)) return true;
     return false;
   }
 
-  private boolean jj_3R_131()
+  private boolean jj_3R_132()
  {
-    if (jj_scan_token(SAMPLE)) return true;
+    if (jj_scan_token(MODE)) return true;
     if (jj_scan_token(LPAREN)) return true;
     return false;
   }
 
-  private boolean jj_3R_146()
+  private boolean jj_3R_153()
  {
-    if (jj_3R_153()) return true;
+    if (jj_scan_token(LT2)) return true;
     return false;
   }
 
-  private boolean jj_3R_145()
+  private boolean jj_3R_131()
  {
-    if (jj_3R_152()) return true;
+    if (jj_scan_token(MEDIAN)) return true;
+    if (jj_scan_token(LPAREN)) return true;
     return false;
   }
 
   private boolean jj_3R_130()
  {
-    if (jj_scan_token(MODE)) return true;
+    if (jj_scan_token(AVG)) return true;
     if (jj_scan_token(LPAREN)) return true;
     return false;
   }
 
-  private boolean jj_3R_144()
+  private boolean jj_3R_148()
  {
-    if (jj_3R_151()) return true;
+    if (jj_3R_155()) return true;
     return false;
   }
 
-  private boolean jj_3R_129()
+  private boolean jj_3R_147()
  {
-    if (jj_scan_token(MEDIAN)) return true;
-    if (jj_scan_token(LPAREN)) return true;
+    if (jj_3R_154()) return true;
     return false;
   }
 
-  private boolean jj_3R_122()
+  private boolean jj_3R_129()
  {
-    Token xsp;
-    xsp = jj_scanpos;
-    if (jj_3R_144()) {
-    jj_scanpos = xsp;
-    if (jj_3R_145()) {
-    jj_scanpos = xsp;
-    if (jj_3R_146()) return true;
-    }
-    }
+    if (jj_scan_token(MAX)) return true;
+    if (jj_scan_token(LPAREN)) return true;
     return false;
   }
 
-  private boolean jj_3R_128()
+  private boolean jj_3R_146()
  {
-    if (jj_scan_token(AVG)) return true;
-    if (jj_scan_token(LPAREN)) return true;
+    if (jj_3R_153()) return true;
     return false;
   }
 
-  private boolean jj_3R_127()
+  private boolean jj_3R_128()
  {
-    if (jj_scan_token(MAX)) return true;
+    if (jj_scan_token(MIN)) return true;
     if (jj_scan_token(LPAREN)) return true;
     return false;
   }
 
-  private boolean jj_3R_126()
+  private boolean jj_3R_124()
  {
-    if (jj_scan_token(MIN)) return true;
-    if (jj_scan_token(LPAREN)) return true;
+    Token xsp;
+    xsp = jj_scanpos;
+    if (jj_3R_146()) {
+    jj_scanpos = xsp;
+    if (jj_3R_147()) {
+    jj_scanpos = xsp;
+    if (jj_3R_148()) return true;
+    }
+    }
     return false;
   }
 
-  private boolean jj_3R_125()
+  private boolean jj_3R_127()
  {
     if (jj_scan_token(SUM)) return true;
     if (jj_scan_token(LPAREN)) return true;
     return false;
   }
 
-  private boolean jj_3R_124()
+  private boolean jj_3R_126()
  {
     if (jj_scan_token(COUNT)) return true;
     if (jj_scan_token(LPAREN)) return true;
     return false;
   }
 
-  private boolean jj_3R_111()
+  private boolean jj_3R_113()
  {
     Token xsp;
     xsp = jj_scanpos;
-    if (jj_3R_124()) {
-    jj_scanpos = xsp;
-    if (jj_3R_125()) {
-    jj_scanpos = xsp;
     if (jj_3R_126()) {
     jj_scanpos = xsp;
     if (jj_3R_127()) {
@@ -7846,7 +7915,11 @@ checkString(lex, t.beginLine, t.beginColumn) ;
     jj_scanpos = xsp;
     if (jj_3R_138()) {
     jj_scanpos = xsp;
-    if (jj_3R_139()) return true;
+    if (jj_3R_139()) {
+    jj_scanpos = xsp;
+    if (jj_3R_140()) {
+    jj_scanpos = xsp;
+    if (jj_3R_141()) return true;
     }
     }
     }
@@ -7865,17 +7938,24 @@ checkString(lex, t.beginLine, t.beginColumn) ;
     return false;
   }
 
-  private boolean jj_3R_119()
+  private boolean jj_3R_121()
  {
     if (jj_scan_token(NOT)) return true;
     if (jj_scan_token(EXISTS)) return true;
     return false;
   }
 
-  private boolean jj_3R_118()
+  private boolean jj_3R_120()
  {
     if (jj_scan_token(EXISTS)) return true;
-    if (jj_3R_141()) return true;
+    if (jj_3R_143()) return true;
+    return false;
+  }
+
+  private boolean jj_3R_118()
+ {
+    if (jj_scan_token(REPLACE)) return true;
+    if (jj_scan_token(LPAREN)) return true;
     return false;
   }
 
@@ -7919,16 +7999,16 @@ checkString(lex, t.beginLine, t.beginColumn) ;
       jj_la1_2 = new int[] {0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0xff97b7ff,0xff97b7ff,0xff97b7ff,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0xff97b7ff,0x0,0xff97b7ff,0xff97b7ff,0xff97b7ff,0x0,0xff97b7ff,0xff97b7ff,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,0x800,0x0,0x0,0x0,0x0,0x800,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0xff97b7ff,0x0,0x0,0x0,0x0,0x0,0x0,0x [...]
    }
    private static void jj_la1_init_3() {
-      jj_la1_3 = new int[] {0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0xffffffff,0xffffffff,0xffffffff,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0xffffffff,0x0,0xffffffff,0xffffffff,0xffffffff,0x0,0xffffffff,0xffffffff,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,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0xffffffff,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x [...]
+      jj_la1_3 = new int[] {0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0xffffffff,0xffffffff,0xffffffff,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0xffffffff,0x0,0xffffffff,0xffffffff,0xffffffff,0x0,0xffffffff,0xffffffff,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,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0xffffffff,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x [...]
    }
    private static void jj_la1_init_4() {
-      jj_la1_4 = new int[] {0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x80000180,0x0,0x800001f7,0x800001f7,0x800001f7,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x80000180,0x0,0x0,0x0,0x0,0x0,0x0,0x77,0x0,0x77,0x77,0x77,0x0,0x77,0x77,0x0,0x0,0x0,0x0,0x0,0x109ffc00,0x109ffc00,0x400000,0x1000000,0x400000,0x400000,0x400000,0x400000,0x400000,0x400000,0x10000000,0x400,0xc00,0x20000000,0x0,0x0,0x4000000,0xc000000,0x80000180,0x0,0x0,0x80000180,0x80000180,0x80000180,0x0,0x0,0x80000180,0x0,0x80000180,0x0,0x0,0x80 [...]
+      jj_la1_4 = new int[] {0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x600,0x0,0x7df,0x7df,0x7df,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x600,0x0,0x0,0x0,0x0,0x0,0x0,0x1df,0x0,0x1df,0x1df,0x1df,0x0,0x1df,0x1df,0x0,0x0,0x0,0x0,0x0,0x427ff000,0x427ff000,0x1000000,0x4000000,0x1000000,0x1000000,0x1000000,0x1000000,0x1000000,0x1000000,0x40000000,0x1000,0x3000,0x80000000,0x0,0x0,0x10000000,0x30000000,0x600,0x0,0x0,0x600,0x600,0x600,0x0,0x0,0x600,0x0,0x600,0x0,0x0,0x600,0x0,0x0,0x600,0x600,0x0,0x0,0x100000 [...]
    }
    private static void jj_la1_init_5() {
-      jj_la1_5 = new int[] {0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x780ff,0x0,0xf80ff,0xf80ff,0xf80ff,0x0,0x0,0x400000,0x0,0x0,0x0,0x400000,0x0,0x0,0x10000000,0x780ff,0x0,0x0,0x0,0x0,0x0,0x0,0x80000,0x0,0x80000,0x80000,0x80000,0x0,0x80000,0x80000,0x0,0x0,0x0,0x0,0x8000000,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x52f80ff,0x0,0x20000000,0x52f80ff,0x52f80ff,0x52f80ff,0x400000,0x20000000,0x52f80ff,0x0,0x52f80ff,0x20000000,0x0,0x52f80ff,0x400000,0x20000000,0x52f80ff,0x5 [...]
+      jj_la1_5 = new int[] {0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x1e03fe,0x0,0x3e03fe,0x3e03fe,0x3e03fe,0x0,0x0,0x1000000,0x0,0x0,0x0,0x1000000,0x0,0x0,0x40000000,0x1e03fe,0x0,0x0,0x0,0x0,0x0,0x0,0x200000,0x0,0x200000,0x200000,0x200000,0x0,0x200000,0x200000,0x0,0x0,0x0,0x0,0x20000000,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x14be03fe,0x0,0x80000000,0x14be03fe,0x14be03fe,0x14be03fe,0x1000000,0x80000000,0x14be03fe,0x0,0x14be03fe,0x80000000,0x0,0x14be03fe,0x1000000,0 [...]
    }
    private static void jj_la1_init_6() {
-      jj_la1_6 = new int[] {0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x8000,0x0,0x0,0x0,0x0,0x8000,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,0x0,0x0,0x0,0x20,0x0,0x0,0x20,0x20,0x20,0x0,0x0,0x20,0x0,0x20,0x0,0x0,0x20,0x0,0x0,0x20,0x20,0x0,0x0,0x0,0x0,0x20,0x0,0x0,0x0,0x20,0x0,0x20,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x20,0x0,0x0,0x0,0x0,0x0,0x20,0x200100,0x200100,0x0,0x2001 [...]
+      jj_la1_6 = new int[] {0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x20000,0x0,0x0,0x0,0x0,0x20000,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,0x0,0x0,0x0,0x80,0x0,0x0,0x80,0x80,0x80,0x0,0x0,0x80,0x0,0x80,0x0,0x0,0x80,0x0,0x0,0x80,0x80,0x0,0x0,0x0,0x0,0x80,0x0,0x0,0x0,0x80,0x0,0x80,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x80,0x0,0x0,0x0,0x0,0x0,0x80,0x800400,0x800400,0x0,0x80 [...]
    }
    private static void jj_la1_init_7() {
       jj_la1_7 = 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,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,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, [...]
@@ -8118,7 +8198,7 @@ checkString(lex, t.beginLine, t.beginColumn) ;
   /** Generate ParseException. */
   public ParseException generateParseException() {
     jj_expentries.clear();
-    boolean[] la1tokens = new boolean[229];
+    boolean[] la1tokens = new boolean[231];
     if (jj_kind >= 0) {
       la1tokens[jj_kind] = true;
       jj_kind = -1;
@@ -8153,7 +8233,7 @@ checkString(lex, t.beginLine, t.beginColumn) ;
         }
       }
     }
-    for (int i = 0; i < 229; i++) {
+    for (int i = 0; i < 231; i++) {
       if (la1tokens[i]) {
         jj_expentry = new int[1];
         jj_expentry[0] = i;
diff --git a/jena-arq/src/main/java/org/apache/jena/sparql/lang/arq/ARQParserConstants.java b/jena-arq/src/main/java/org/apache/jena/sparql/lang/arq/ARQParserConstants.java
index 38c8965..9efd44f 100644
--- a/jena-arq/src/main/java/org/apache/jena/sparql/lang/arq/ARQParserConstants.java
+++ b/jena-arq/src/main/java/org/apache/jena/sparql/lang/arq/ARQParserConstants.java
@@ -209,253 +209,257 @@ public interface ARQParserConstants {
   /** RegularExpression Id. */
   int ROUND = 104;
   /** RegularExpression Id. */
-  int CONCAT = 105;
+  int MOD = 105;
   /** RegularExpression Id. */
-  int SUBSTR = 106;
+  int IDIV = 106;
   /** RegularExpression Id. */
-  int STRLEN = 107;
+  int CONCAT = 107;
   /** RegularExpression Id. */
-  int REPLACE = 108;
+  int SUBSTR = 108;
   /** RegularExpression Id. */
-  int UCASE = 109;
+  int STRLEN = 109;
   /** RegularExpression Id. */
-  int LCASE = 110;
+  int REPLACE = 110;
   /** RegularExpression Id. */
-  int ENCODE_FOR_URI = 111;
+  int UCASE = 111;
   /** RegularExpression Id. */
-  int CONTAINS = 112;
+  int LCASE = 112;
   /** RegularExpression Id. */
-  int STRSTARTS = 113;
+  int ENCODE_FOR_URI = 113;
   /** RegularExpression Id. */
-  int STRENDS = 114;
+  int CONTAINS = 114;
   /** RegularExpression Id. */
-  int STRBEFORE = 115;
+  int STRSTARTS = 115;
   /** RegularExpression Id. */
-  int STRAFTER = 116;
+  int STRENDS = 116;
   /** RegularExpression Id. */
-  int YEAR = 117;
+  int STRBEFORE = 117;
   /** RegularExpression Id. */
-  int MONTH = 118;
+  int STRAFTER = 118;
   /** RegularExpression Id. */
-  int DAY = 119;
+  int YEAR = 119;
   /** RegularExpression Id. */
-  int HOURS = 120;
+  int MONTH = 120;
   /** RegularExpression Id. */
-  int MINUTES = 121;
+  int DAY = 121;
   /** RegularExpression Id. */
-  int SECONDS = 122;
+  int HOURS = 122;
   /** RegularExpression Id. */
-  int TIMEZONE = 123;
+  int MINUTES = 123;
   /** RegularExpression Id. */
-  int TZ = 124;
+  int SECONDS = 124;
   /** RegularExpression Id. */
-  int NOW = 125;
+  int TIMEZONE = 125;
   /** RegularExpression Id. */
-  int UUID = 126;
+  int TZ = 126;
   /** RegularExpression Id. */
-  int STRUUID = 127;
+  int NOW = 127;
   /** RegularExpression Id. */
-  int VERSION = 128;
+  int UUID = 128;
   /** RegularExpression Id. */
-  int MD5 = 129;
+  int STRUUID = 129;
   /** RegularExpression Id. */
-  int SHA1 = 130;
+  int VERSION = 130;
   /** RegularExpression Id. */
-  int SHA224 = 131;
+  int MD5 = 131;
   /** RegularExpression Id. */
-  int SHA256 = 132;
+  int SHA1 = 132;
   /** RegularExpression Id. */
-  int SHA384 = 133;
+  int SHA224 = 133;
   /** RegularExpression Id. */
-  int SHA512 = 134;
+  int SHA256 = 134;
   /** RegularExpression Id. */
-  int TRUE = 135;
+  int SHA384 = 135;
   /** RegularExpression Id. */
-  int FALSE = 136;
+  int SHA512 = 136;
   /** RegularExpression Id. */
-  int DATA = 137;
+  int TRUE = 137;
   /** RegularExpression Id. */
-  int INSERT = 138;
+  int FALSE = 138;
   /** RegularExpression Id. */
-  int DELETE = 139;
+  int DATA = 139;
   /** RegularExpression Id. */
-  int INSERT_DATA = 140;
+  int INSERT = 140;
   /** RegularExpression Id. */
-  int DELETE_DATA = 141;
+  int DELETE = 141;
   /** RegularExpression Id. */
-  int DELETE_WHERE = 142;
+  int INSERT_DATA = 142;
   /** RegularExpression Id. */
-  int LOAD = 143;
+  int DELETE_DATA = 143;
   /** RegularExpression Id. */
-  int CLEAR = 144;
+  int DELETE_WHERE = 144;
   /** RegularExpression Id. */
-  int CREATE = 145;
+  int LOAD = 145;
   /** RegularExpression Id. */
-  int ADD = 146;
+  int CLEAR = 146;
   /** RegularExpression Id. */
-  int MOVE = 147;
+  int CREATE = 147;
   /** RegularExpression Id. */
-  int COPY = 148;
+  int ADD = 148;
   /** RegularExpression Id. */
-  int META = 149;
+  int MOVE = 149;
   /** RegularExpression Id. */
-  int SILENT = 150;
+  int COPY = 150;
   /** RegularExpression Id. */
-  int DROP = 151;
+  int META = 151;
   /** RegularExpression Id. */
-  int INTO = 152;
+  int SILENT = 152;
   /** RegularExpression Id. */
-  int TO = 153;
+  int DROP = 153;
   /** RegularExpression Id. */
-  int DFT = 154;
+  int INTO = 154;
   /** RegularExpression Id. */
-  int ALL = 155;
+  int TO = 155;
   /** RegularExpression Id. */
-  int WITH = 156;
+  int DFT = 156;
   /** RegularExpression Id. */
-  int USING = 157;
+  int ALL = 157;
   /** RegularExpression Id. */
-  int DIGITS = 158;
+  int WITH = 158;
   /** RegularExpression Id. */
-  int INTEGER = 159;
+  int USING = 159;
   /** RegularExpression Id. */
-  int DECIMAL = 160;
+  int DIGITS = 160;
   /** RegularExpression Id. */
-  int DOUBLE = 161;
+  int INTEGER = 161;
   /** RegularExpression Id. */
-  int INTEGER_POSITIVE = 162;
+  int DECIMAL = 162;
   /** RegularExpression Id. */
-  int DECIMAL_POSITIVE = 163;
+  int DOUBLE = 163;
   /** RegularExpression Id. */
-  int DOUBLE_POSITIVE = 164;
+  int INTEGER_POSITIVE = 164;
   /** RegularExpression Id. */
-  int INTEGER_NEGATIVE = 165;
+  int DECIMAL_POSITIVE = 165;
   /** RegularExpression Id. */
-  int DECIMAL_NEGATIVE = 166;
+  int DOUBLE_POSITIVE = 166;
   /** RegularExpression Id. */
-  int DOUBLE_NEGATIVE = 167;
+  int INTEGER_NEGATIVE = 167;
   /** RegularExpression Id. */
-  int EXPONENT = 168;
+  int DECIMAL_NEGATIVE = 168;
   /** RegularExpression Id. */
-  int QUOTE_3D = 169;
+  int DOUBLE_NEGATIVE = 169;
   /** RegularExpression Id. */
-  int QUOTE_3S = 170;
+  int EXPONENT = 170;
   /** RegularExpression Id. */
-  int ECHAR = 171;
+  int QUOTE_3D = 171;
   /** RegularExpression Id. */
-  int UCHAR = 172;
+  int QUOTE_3S = 172;
   /** RegularExpression Id. */
-  int UCHAR4 = 173;
+  int ECHAR = 173;
   /** RegularExpression Id. */
-  int UCHAR8 = 174;
+  int UCHAR = 174;
   /** RegularExpression Id. */
-  int STRING_LITERAL1 = 175;
+  int UCHAR4 = 175;
   /** RegularExpression Id. */
-  int STRING_LITERAL2 = 176;
+  int UCHAR8 = 176;
   /** RegularExpression Id. */
-  int STRING_LITERAL_LONG1 = 177;
+  int STRING_LITERAL1 = 177;
   /** RegularExpression Id. */
-  int STRING_LITERAL_LONG2 = 178;
+  int STRING_LITERAL2 = 178;
   /** RegularExpression Id. */
-  int LPAREN = 179;
+  int STRING_LITERAL_LONG1 = 179;
   /** RegularExpression Id. */
-  int RPAREN = 180;
+  int STRING_LITERAL_LONG2 = 180;
   /** RegularExpression Id. */
-  int NIL = 181;
+  int LPAREN = 181;
   /** RegularExpression Id. */
-  int LBRACE = 182;
+  int RPAREN = 182;
   /** RegularExpression Id. */
-  int RBRACE = 183;
+  int NIL = 183;
   /** RegularExpression Id. */
-  int LBRACKET = 184;
+  int LBRACE = 184;
   /** RegularExpression Id. */
-  int RBRACKET = 185;
+  int RBRACE = 185;
   /** RegularExpression Id. */
-  int ANON = 186;
+  int LBRACKET = 186;
   /** RegularExpression Id. */
-  int SEMICOLON = 187;
+  int RBRACKET = 187;
   /** RegularExpression Id. */
-  int COMMA = 188;
+  int ANON = 188;
   /** RegularExpression Id. */
-  int DOT = 189;
+  int SEMICOLON = 189;
   /** RegularExpression Id. */
-  int EQ = 190;
+  int COMMA = 190;
   /** RegularExpression Id. */
-  int NE = 191;
+  int DOT = 191;
   /** RegularExpression Id. */
-  int GT = 192;
+  int EQ = 192;
   /** RegularExpression Id. */
-  int LT = 193;
+  int NE = 193;
   /** RegularExpression Id. */
-  int LE = 194;
+  int GT = 194;
   /** RegularExpression Id. */
-  int GE = 195;
+  int LT = 195;
   /** RegularExpression Id. */
-  int GT2 = 196;
+  int LE = 196;
   /** RegularExpression Id. */
-  int LT2 = 197;
+  int GE = 197;
   /** RegularExpression Id. */
-  int L_ANN = 198;
+  int GT2 = 198;
   /** RegularExpression Id. */
-  int R_ANN = 199;
+  int LT2 = 199;
   /** RegularExpression Id. */
-  int BANG = 200;
+  int L_ANN = 200;
   /** RegularExpression Id. */
-  int TILDE = 201;
+  int R_ANN = 201;
   /** RegularExpression Id. */
-  int COLON = 202;
+  int BANG = 202;
   /** RegularExpression Id. */
-  int SC_OR = 203;
+  int TILDE = 203;
   /** RegularExpression Id. */
-  int SC_AND = 204;
+  int COLON = 204;
   /** RegularExpression Id. */
-  int PLUS = 205;
+  int SC_OR = 205;
   /** RegularExpression Id. */
-  int MINUS = 206;
+  int SC_AND = 206;
   /** RegularExpression Id. */
-  int STAR = 207;
+  int PLUS = 207;
   /** RegularExpression Id. */
-  int SLASH = 208;
+  int MINUS = 208;
   /** RegularExpression Id. */
-  int DATATYPE = 209;
+  int STAR = 209;
   /** RegularExpression Id. */
-  int AT = 210;
+  int SLASH = 210;
   /** RegularExpression Id. */
-  int ASSIGN = 211;
+  int DATATYPE = 211;
   /** RegularExpression Id. */
-  int VBAR = 212;
+  int AT = 212;
   /** RegularExpression Id. */
-  int CARAT = 213;
+  int ASSIGN = 213;
   /** RegularExpression Id. */
-  int FPATH = 214;
+  int VBAR = 214;
   /** RegularExpression Id. */
-  int RPATH = 215;
+  int CARAT = 215;
   /** RegularExpression Id. */
-  int QMARK = 216;
+  int FPATH = 216;
   /** RegularExpression Id. */
-  int SURROGATE_PAIR = 217;
+  int RPATH = 217;
   /** RegularExpression Id. */
-  int PN_CHARS_BASE = 218;
+  int QMARK = 218;
   /** RegularExpression Id. */
-  int PN_CHARS_U = 219;
+  int SURROGATE_PAIR = 219;
   /** RegularExpression Id. */
-  int PN_CHARS = 220;
+  int PN_CHARS_BASE = 220;
   /** RegularExpression Id. */
-  int PN_PREFIX = 221;
+  int PN_CHARS_U = 221;
   /** RegularExpression Id. */
-  int PN_LOCAL = 222;
+  int PN_CHARS = 222;
   /** RegularExpression Id. */
-  int VARNAME = 223;
+  int PN_PREFIX = 223;
   /** RegularExpression Id. */
-  int PN_LOCAL_ESC = 224;
+  int PN_LOCAL = 224;
   /** RegularExpression Id. */
-  int PLX = 225;
+  int VARNAME = 225;
   /** RegularExpression Id. */
-  int HEX = 226;
+  int PN_LOCAL_ESC = 226;
   /** RegularExpression Id. */
-  int PERCENT = 227;
+  int PLX = 227;
   /** RegularExpression Id. */
-  int UNKNOWN = 228;
+  int HEX = 228;
+  /** RegularExpression Id. */
+  int PERCENT = 229;
+  /** RegularExpression Id. */
+  int UNKNOWN = 230;
 
   /** Lexical state. */
   int DEFAULT = 0;
@@ -567,6 +571,8 @@ public interface ARQParserConstants {
     "\"CEIL\"",
     "\"FLOOR\"",
     "\"ROUND\"",
+    "\"MOD\"",
+    "\"IDIV\"",
     "\"CONCAT\"",
     "\"SUBSTR\"",
     "\"STRLEN\"",
diff --git a/jena-arq/src/main/java/org/apache/jena/sparql/lang/arq/ARQParserTokenManager.java b/jena-arq/src/main/java/org/apache/jena/sparql/lang/arq/ARQParserTokenManager.java
index e923936..e6aac7c 100644
--- a/jena-arq/src/main/java/org/apache/jena/sparql/lang/arq/ARQParserTokenManager.java
+++ b/jena-arq/src/main/java/org/apache/jena/sparql/lang/arq/ARQParserTokenManager.java
@@ -45,164 +45,164 @@ private int jjMoveStringLiteralDfa0_0(){
          jjmatchedKind = 1;
          return jjMoveNfa_0(0, 0);
       case 33:
-         jjmatchedKind = 200;
-         return jjMoveStringLiteralDfa1_0(0x0L, 0x0L, 0x8000000000000000L, 0x0L);
+         jjmatchedKind = 202;
+         return jjMoveStringLiteralDfa1_0(0x0L, 0x0L, 0x0L, 0x2L);
       case 38:
-         return jjMoveStringLiteralDfa1_0(0x0L, 0x0L, 0x0L, 0x1000L);
+         return jjMoveStringLiteralDfa1_0(0x0L, 0x0L, 0x0L, 0x4000L);
       case 40:
-         jjmatchedKind = 179;
+         jjmatchedKind = 181;
          return jjMoveNfa_0(0, 0);
       case 41:
-         jjmatchedKind = 180;
+         jjmatchedKind = 182;
          return jjMoveNfa_0(0, 0);
       case 42:
-         jjmatchedKind = 207;
+         jjmatchedKind = 209;
          return jjMoveNfa_0(0, 0);
       case 43:
-         jjmatchedKind = 205;
+         jjmatchedKind = 207;
          return jjMoveNfa_0(0, 0);
       case 44:
-         jjmatchedKind = 188;
+         jjmatchedKind = 190;
          return jjMoveNfa_0(0, 0);
       case 45:
-         jjmatchedKind = 206;
-         return jjMoveStringLiteralDfa1_0(0x0L, 0x0L, 0x0L, 0x400000L);
+         jjmatchedKind = 208;
+         return jjMoveStringLiteralDfa1_0(0x0L, 0x0L, 0x0L, 0x1000000L);
       case 46:
-         jjmatchedKind = 189;
+         jjmatchedKind = 191;
          return jjMoveNfa_0(0, 0);
       case 47:
-         jjmatchedKind = 208;
+         jjmatchedKind = 210;
          return jjMoveNfa_0(0, 0);
       case 58:
-         jjmatchedKind = 202;
-         return jjMoveStringLiteralDfa1_0(0x0L, 0x0L, 0x0L, 0x80000L);
+         jjmatchedKind = 204;
+         return jjMoveStringLiteralDfa1_0(0x0L, 0x0L, 0x0L, 0x200000L);
       case 59:
-         jjmatchedKind = 187;
+         jjmatchedKind = 189;
          return jjMoveNfa_0(0, 0);
       case 60:
-         jjmatchedKind = 193;
-         return jjMoveStringLiteralDfa1_0(0x0L, 0x0L, 0x0L, 0x800024L);
+         jjmatchedKind = 195;
+         return jjMoveStringLiteralDfa1_0(0x0L, 0x0L, 0x0L, 0x2000090L);
       case 61:
-         jjmatchedKind = 190;
+         jjmatchedKind = 192;
          return jjMoveNfa_0(0, 0);
       case 62:
-         jjmatchedKind = 192;
-         return jjMoveStringLiteralDfa1_0(0x0L, 0x0L, 0x0L, 0x18L);
+         jjmatchedKind = 194;
+         return jjMoveStringLiteralDfa1_0(0x0L, 0x0L, 0x0L, 0x60L);
       case 63:
-         jjmatchedKind = 216;
+         jjmatchedKind = 218;
          return jjMoveNfa_0(0, 0);
       case 64:
-         jjmatchedKind = 210;
+         jjmatchedKind = 212;
          return jjMoveNfa_0(0, 0);
       case 65:
-         return jjMoveStringLiteralDfa1_0(0x880010810000000L, 0x2000000001L, 0x8040000L, 0x0L);
+         return jjMoveStringLiteralDfa1_0(0x880010810000000L, 0x2000000001L, 0x20100000L, 0x0L);
       case 66:
          return jjMoveStringLiteralDfa1_0(0x200100100000L, 0x11000L, 0x0L, 0x0L);
       case 67:
-         return jjMoveStringLiteralDfa1_0(0x1000000008000000L, 0x1024000182000L, 0x130000L, 0x0L);
+         return jjMoveStringLiteralDfa1_0(0x1000000008000000L, 0x4084000182000L, 0x4c0000L, 0x0L);
       case 68:
-         return jjMoveStringLiteralDfa1_0(0x1004800000L, 0x80000004000000L, 0x4800a00L, 0x0L);
+         return jjMoveStringLiteralDfa1_0(0x1004800000L, 0x200000004000000L, 0x12002800L, 0x0L);
       case 69:
-         return jjMoveStringLiteralDfa1_0(0x20000000000000L, 0x800000000000L, 0x0L, 0x0L);
+         return jjMoveStringLiteralDfa1_0(0x20000000000000L, 0x2000000000000L, 0x0L, 0x0L);
       case 70:
-         return jjMoveStringLiteralDfa1_0(0x4000000000L, 0x8000000800L, 0x100L, 0x0L);
+         return jjMoveStringLiteralDfa1_0(0x4000000000L, 0x8000000800L, 0x400L, 0x0L);
       case 71:
          return jjMoveStringLiteralDfa1_0(0x100020000000000L, 0x400L, 0x0L, 0x0L);
       case 72:
-         return jjMoveStringLiteralDfa1_0(0x200000000000000L, 0x100000000000000L, 0x0L, 0x0L);
+         return jjMoveStringLiteralDfa1_0(0x200000000000000L, 0x400000000000000L, 0x0L, 0x0L);
       case 73:
-         return jjMoveStringLiteralDfa1_0(0x2000000000000L, 0x3e002c000L, 0x1000400L, 0x0L);
+         return jjMoveStringLiteralDfa1_0(0x2000000000000L, 0x403e002c000L, 0x4001000L, 0x0L);
       case 74:
          return jjMoveStringLiteralDfa1_0(0x2000000L, 0x0L, 0x0L, 0x0L);
       case 76:
-         return jjMoveStringLiteralDfa1_0(0x800020000000L, 0x400018000000L, 0x8000L, 0x0L);
+         return jjMoveStringLiteralDfa1_0(0x800020000000L, 0x1000018000000L, 0x20000L, 0x0L);
       case 77:
-         return jjMoveStringLiteralDfa1_0(0x6000100000000000L, 0x240000000200006L, 0x280002L, 0x0L);
+         return jjMoveStringLiteralDfa1_0(0x6000100000000000L, 0x900020000200006L, 0xa00008L, 0x0L);
       case 78:
-         return jjMoveStringLiteralDfa1_0(0x40002000000000L, 0x2000000000000000L, 0x0L, 0x0L);
+         return jjMoveStringLiteralDfa1_0(0x40002000000000L, 0x8000000000000000L, 0x0L, 0x0L);
       case 79:
          return jjMoveStringLiteralDfa1_0(0x100400c0000000L, 0x0L, 0x0L, 0x0L);
       case 80:
          return jjMoveStringLiteralDfa1_0(0x8000000200000L, 0x0L, 0x0L, 0x0L);
       case 82:
-         return jjMoveStringLiteralDfa1_0(0x1000000L, 0x111400000000L, 0x0L, 0x0L);
+         return jjMoveStringLiteralDfa1_0(0x1000000L, 0x411400000000L, 0x0L, 0x0L);
       case 83:
-         return jjMoveStringLiteralDfa1_0(0x8404400000400000L, 0x841e0c0803c00238L, 0x40007cL, 0x0L);
+         return jjMoveStringLiteralDfa1_0(0x8404400000400000L, 0x1078300803c00238L, 0x10001f2L, 0x0L);
       case 84:
-         return jjMoveStringLiteralDfa1_0(0x1000000000000L, 0x1800000000000000L, 0x2000080L, 0x0L);
+         return jjMoveStringLiteralDfa1_0(0x1000000000000L, 0x6000000000000000L, 0x8000200L, 0x0L);
       case 85:
-         return jjMoveStringLiteralDfa1_0(0x80400000000L, 0x4000200000040000L, 0x20000000L, 0x0L);
+         return jjMoveStringLiteralDfa1_0(0x80400000000L, 0x800000040000L, 0x80000001L, 0x0L);
       case 86:
-         return jjMoveStringLiteralDfa1_0(0x200000000L, 0x1c0L, 0x1L, 0x0L);
+         return jjMoveStringLiteralDfa1_0(0x200000000L, 0x1c0L, 0x4L, 0x0L);
       case 87:
-         return jjMoveStringLiteralDfa1_0(0x8000000000L, 0x0L, 0x10000000L, 0x0L);
+         return jjMoveStringLiteralDfa1_0(0x8000000000L, 0x0L, 0x40000000L, 0x0L);
       case 89:
-         return jjMoveStringLiteralDfa1_0(0x0L, 0x20000000000000L, 0x0L, 0x0L);
+         return jjMoveStringLiteralDfa1_0(0x0L, 0x80000000000000L, 0x0L, 0x0L);
       case 91:
-         jjmatchedKind = 184;
+         jjmatchedKind = 186;
          return jjMoveNfa_0(0, 0);
       case 93:
-         jjmatchedKind = 185;
+         jjmatchedKind = 187;
          return jjMoveNfa_0(0, 0);
       case 94:
-         jjmatchedKind = 213;
-         return jjMoveStringLiteralDfa1_0(0x0L, 0x0L, 0x0L, 0x20000L);
+         jjmatchedKind = 215;
+         return jjMoveStringLiteralDfa1_0(0x0L, 0x0L, 0x0L, 0x80000L);
       case 97:
          jjmatchedKind = 19;
-         return jjMoveStringLiteralDfa1_0(0x880010810000000L, 0x2000000001L, 0x8040000L, 0x0L);
+         return jjMoveStringLiteralDfa1_0(0x880010810000000L, 0x2000000001L, 0x20100000L, 0x0L);
       case 98:
          return jjMoveStringLiteralDfa1_0(0x200100100000L, 0x11000L, 0x0L, 0x0L);
       case 99:
-         return jjMoveStringLiteralDfa1_0(0x1000000008000000L, 0x1024000182000L, 0x130000L, 0x0L);
+         return jjMoveStringLiteralDfa1_0(0x1000000008000000L, 0x4084000182000L, 0x4c0000L, 0x0L);
       case 100:
-         return jjMoveStringLiteralDfa1_0(0x1004800000L, 0x80000004000000L, 0x4800a00L, 0x0L);
+         return jjMoveStringLiteralDfa1_0(0x1004800000L, 0x200000004000000L, 0x12002800L, 0x0L);
       case 101:
-         return jjMoveStringLiteralDfa1_0(0x20000000000000L, 0x800000000000L, 0x0L, 0x0L);
+         return jjMoveStringLiteralDfa1_0(0x20000000000000L, 0x2000000000000L, 0x0L, 0x0L);
       case 102:
-         return jjMoveStringLiteralDfa1_0(0x4000000000L, 0x8000000800L, 0x100L, 0x0L);
+         return jjMoveStringLiteralDfa1_0(0x4000000000L, 0x8000000800L, 0x400L, 0x0L);
       case 103:
          return jjMoveStringLiteralDfa1_0(0x100020000000000L, 0x400L, 0x0L, 0x0L);
       case 104:
-         return jjMoveStringLiteralDfa1_0(0x200000000000000L, 0x100000000000000L, 0x0L, 0x0L);
+         return jjMoveStringLiteralDfa1_0(0x200000000000000L, 0x400000000000000L, 0x0L, 0x0L);
       case 105:
-         return jjMoveStringLiteralDfa1_0(0x2000000000000L, 0x3e002c000L, 0x1000400L, 0x0L);
+         return jjMoveStringLiteralDfa1_0(0x2000000000000L, 0x403e002c000L, 0x4001000L, 0x0L);
       case 106:
          return jjMoveStringLiteralDfa1_0(0x2000000L, 0x0L, 0x0L, 0x0L);
       case 108:
-         return jjMoveStringLiteralDfa1_0(0x800020000000L, 0x400018000000L, 0x8000L, 0x0L);
+         return jjMoveStringLiteralDfa1_0(0x800020000000L, 0x1000018000000L, 0x20000L, 0x0L);
       case 109:
-         return jjMoveStringLiteralDfa1_0(0x6000100000000000L, 0x240000000200006L, 0x280002L, 0x0L);
+         return jjMoveStringLiteralDfa1_0(0x6000100000000000L, 0x900020000200006L, 0xa00008L, 0x0L);
       case 110:
-         return jjMoveStringLiteralDfa1_0(0x40002000000000L, 0x2000000000000000L, 0x0L, 0x0L);
+         return jjMoveStringLiteralDfa1_0(0x40002000000000L, 0x8000000000000000L, 0x0L, 0x0L);
       case 111:
          return jjMoveStringLiteralDfa1_0(0x100400c0000000L, 0x0L, 0x0L, 0x0L);
       case 112:
          return jjMoveStringLiteralDfa1_0(0x8000000200000L, 0x0L, 0x0L, 0x0L);
       case 114:
-         return jjMoveStringLiteralDfa1_0(0x1000000L, 0x111400000000L, 0x0L, 0x0L);
+         return jjMoveStringLiteralDfa1_0(0x1000000L, 0x411400000000L, 0x0L, 0x0L);
       case 115:
-         return jjMoveStringLiteralDfa1_0(0x8404400000400000L, 0x841e0c0803c00238L, 0x40007cL, 0x0L);
+         return jjMoveStringLiteralDfa1_0(0x8404400000400000L, 0x1078300803c00238L, 0x10001f2L, 0x0L);
       case 116:
-         return jjMoveStringLiteralDfa1_0(0x1000000000000L, 0x1800000000000000L, 0x2000080L, 0x0L);
+         return jjMoveStringLiteralDfa1_0(0x1000000000000L, 0x6000000000000000L, 0x8000200L, 0x0L);
       case 117:
-         return jjMoveStringLiteralDfa1_0(0x80400000000L, 0x4000200000040000L, 0x20000000L, 0x0L);
+         return jjMoveStringLiteralDfa1_0(0x80400000000L, 0x800000040000L, 0x80000001L, 0x0L);
       case 118:
-         return jjMoveStringLiteralDfa1_0(0x200000000L, 0x1c0L, 0x1L, 0x0L);
+         return jjMoveStringLiteralDfa1_0(0x200000000L, 0x1c0L, 0x4L, 0x0L);
       case 119:
-         return jjMoveStringLiteralDfa1_0(0x8000000000L, 0x0L, 0x10000000L, 0x0L);
+         return jjMoveStringLiteralDfa1_0(0x8000000000L, 0x0L, 0x40000000L, 0x0L);
       case 121:
-         return jjMoveStringLiteralDfa1_0(0x0L, 0x20000000000000L, 0x0L, 0x0L);
+         return jjMoveStringLiteralDfa1_0(0x0L, 0x80000000000000L, 0x0L, 0x0L);
       case 123:
-         jjmatchedKind = 182;
-         return jjMoveStringLiteralDfa1_0(0x0L, 0x0L, 0x0L, 0x40L);
+         jjmatchedKind = 184;
+         return jjMoveStringLiteralDfa1_0(0x0L, 0x0L, 0x0L, 0x100L);
       case 124:
-         jjmatchedKind = 212;
-         return jjMoveStringLiteralDfa1_0(0x0L, 0x0L, 0x0L, 0x880L);
+         jjmatchedKind = 214;
+         return jjMoveStringLiteralDfa1_0(0x0L, 0x0L, 0x0L, 0x2200L);
       case 125:
-         jjmatchedKind = 183;
+         jjmatchedKind = 185;
          return jjMoveNfa_0(0, 0);
       case 126:
-         jjmatchedKind = 201;
+         jjmatchedKind = 203;
          return jjMoveNfa_0(0, 0);
       case 65279:
          jjmatchedKind = 9;
@@ -219,70 +219,70 @@ private int jjMoveStringLiteralDfa1_0(long active0, long active1, long active2,
    switch(curChar)
    {
       case 38:
-         if ((active3 & 0x1000L) != 0L)
+         if ((active3 & 0x4000L) != 0L)
          {
-            jjmatchedKind = 204;
+            jjmatchedKind = 206;
             jjmatchedPos = 1;
          }
          break;
       case 45:
-         if ((active3 & 0x800000L) != 0L)
+         if ((active3 & 0x2000000L) != 0L)
          {
-            jjmatchedKind = 215;
+            jjmatchedKind = 217;
             jjmatchedPos = 1;
          }
          break;
       case 60:
-         if ((active3 & 0x20L) != 0L)
+         if ((active3 & 0x80L) != 0L)
          {
-            jjmatchedKind = 197;
+            jjmatchedKind = 199;
             jjmatchedPos = 1;
          }
          break;
       case 61:
-         if ((active2 & 0x8000000000000000L) != 0L)
+         if ((active3 & 0x2L) != 0L)
          {
-            jjmatchedKind = 191;
+            jjmatchedKind = 193;
             jjmatchedPos = 1;
          }
-         else if ((active3 & 0x4L) != 0L)
+         else if ((active3 & 0x10L) != 0L)
          {
-            jjmatchedKind = 194;
+            jjmatchedKind = 196;
             jjmatchedPos = 1;
          }
-         else if ((active3 & 0x8L) != 0L)
+         else if ((active3 & 0x20L) != 0L)
          {
-            jjmatchedKind = 195;
+            jjmatchedKind = 197;
             jjmatchedPos = 1;
          }
-         else if ((active3 & 0x80000L) != 0L)
+         else if ((active3 & 0x200000L) != 0L)
          {
-            jjmatchedKind = 211;
+            jjmatchedKind = 213;
             jjmatchedPos = 1;
          }
          break;
       case 62:
-         if ((active3 & 0x10L) != 0L)
+         if ((active3 & 0x40L) != 0L)
          {
-            jjmatchedKind = 196;
+            jjmatchedKind = 198;
             jjmatchedPos = 1;
          }
-         else if ((active3 & 0x400000L) != 0L)
+         else if ((active3 & 0x1000000L) != 0L)
          {
-            jjmatchedKind = 214;
+            jjmatchedKind = 216;
             jjmatchedPos = 1;
          }
          break;
       case 65:
-         return jjMoveStringLiteralDfa2_0(active0, 0x4200002200100000L, active1, 0x8000181c1803c0L, active2, 0x300L, active3, 0L);
+         return jjMoveStringLiteralDfa2_0(active0, 0x4200002200100000L, active1, 0x20000181c1803c0L, active2, 0xc00L, active3, 0L);
       case 66:
          return jjMoveStringLiteralDfa2_0(active0, 0x10000000000000L, active1, 0x2000000000L, active2, 0L, active3, 0L);
       case 67:
-         return jjMoveStringLiteralDfa2_0(active0, 0L, active1, 0x600000000000L, active2, 0L, active3, 0L);
+         return jjMoveStringLiteralDfa2_0(active0, 0L, active1, 0x1800000000000L, active2, 0L, active3, 0L);
       case 68:
-         return jjMoveStringLiteralDfa2_0(active0, 0L, active1, 0L, active2, 0x40002L, active3, 0L);
+         return jjMoveStringLiteralDfa2_0(active0, 0L, active1, 0x40000000000L, active2, 0x100008L, active3, 0L);
       case 69:
-         return jjMoveStringLiteralDfa2_0(active0, 0x400c01005400000L, active1, 0x420104400000002L, active2, 0x4200801L, active3, 0L);
+         return jjMoveStringLiteralDfa2_0(active0, 0x400c01005400000L, active1, 0x1080404400000002L, active2, 0x10802004L, active3, 0L);
       case 70:
          if ((active1 & 0x8000L) != 0L)
          {
@@ -293,40 +293,40 @@ private int jjMoveStringLiteralDfa1_0(long active0, long active1, long active2,
       case 71:
          return jjMoveStringLiteralDfa2_0(active0, 0x800000000000000L, active1, 0L, active2, 0L, active3, 0L);
       case 72:
-         return jjMoveStringLiteralDfa2_0(active0, 0x8000000000L, active1, 0x400000L, active2, 0x7cL, active3, 0L);
+         return jjMoveStringLiteralDfa2_0(active0, 0x8000000000L, active1, 0x400000L, active2, 0x1f0L, active3, 0L);
       case 73:
-         return jjMoveStringLiteralDfa2_0(active0, 0x2000300020800000L, active1, 0xa00000000000800L, active2, 0x10400000L, active3, 0L);
+         return jjMoveStringLiteralDfa2_0(active0, 0x2000300020800000L, active1, 0x2800000000000800L, active2, 0x41000000L, active3, 0L);
       case 76:
-         return jjMoveStringLiteralDfa2_0(active0, 0L, active1, 0x8000000000L, active2, 0x8010000L, active3, 0L);
+         return jjMoveStringLiteralDfa2_0(active0, 0L, active1, 0x8000000000L, active2, 0x20040000L, active3, 0L);
       case 78:
          if ((active1 & 0x4000L) != 0L)
          {
             jjmatchedKind = 78;
             jjmatchedPos = 1;
          }
-         return jjMoveStringLiteralDfa2_0(active0, 0x90400000000L, active1, 0x800000010000L, active2, 0x1000400L, active3, 0L);
+         return jjMoveStringLiteralDfa2_0(active0, 0x90400000000L, active1, 0x2000000010000L, active2, 0x4001000L, active3, 0L);
       case 79:
-         if ((active2 & 0x2000000L) != 0L)
+         if ((active2 & 0x8000000L) != 0L)
          {
-            jjmatchedKind = 153;
+            jjmatchedKind = 155;
             jjmatchedPos = 1;
          }
-         return jjMoveStringLiteralDfa2_0(active0, 0x1040000008000000L, active1, 0x2141030000003004L, active2, 0x188000L, active3, 0L);
+         return jjMoveStringLiteralDfa2_0(active0, 0x1040000008000000L, active1, 0x85040b0000003004L, active2, 0x620000L, active3, 0L);
       case 80:
          return jjMoveStringLiteralDfa2_0(active0, 0x40000000000L, active1, 0L, active2, 0L, active3, 0L);
       case 82:
-         return jjMoveStringLiteralDfa2_0(active0, 0x109024080200000L, active1, 0x60400L, active2, 0x820080L, active3, 0L);
+         return jjMoveStringLiteralDfa2_0(active0, 0x109024080200000L, active1, 0x60400L, active2, 0x2080200L, active3, 0L);
       case 83:
          if ((active0 & 0x80000000000000L) != 0L)
          {
             jjmatchedKind = 55;
             jjmatchedPos = 1;
          }
-         return jjMoveStringLiteralDfa2_0(active0, 0x2000812000000L, active1, 0x3e0000000L, active2, 0x20000000L, active3, 0L);
+         return jjMoveStringLiteralDfa2_0(active0, 0x2000812000000L, active1, 0x3e0000000L, active2, 0x80000000L, active3, 0L);
       case 84:
-         return jjMoveStringLiteralDfa2_0(active0, 0L, active1, 0x801e080003800038L, active2, 0L, active3, 0L);
+         return jjMoveStringLiteralDfa2_0(active0, 0L, active1, 0x78200003800038L, active2, 0x2L, active3, 0L);
       case 85:
-         return jjMoveStringLiteralDfa2_0(active0, 0x8004000000000000L, active1, 0x4000040000200000L, active2, 0L, active3, 0L);
+         return jjMoveStringLiteralDfa2_0(active0, 0x8004000000000000L, active1, 0x100000200000L, active2, 0x1L, active3, 0L);
       case 86:
          return jjMoveStringLiteralDfa2_0(active0, 0L, active1, 0x1L, active2, 0L, active3, 0L);
       case 88:
@@ -339,29 +339,29 @@ private int jjMoveStringLiteralDfa1_0(long active0, long active1, long active2,
          }
          break;
       case 90:
-         if ((active1 & 0x1000000000000000L) != 0L)
+         if ((active1 & 0x4000000000000000L) != 0L)
          {
-            jjmatchedKind = 124;
+            jjmatchedKind = 126;
             jjmatchedPos = 1;
          }
          break;
       case 94:
-         if ((active3 & 0x20000L) != 0L)
+         if ((active3 & 0x80000L) != 0L)
          {
-            jjmatchedKind = 209;
+            jjmatchedKind = 211;
             jjmatchedPos = 1;
          }
          break;
       case 97:
-         return jjMoveStringLiteralDfa2_0(active0, 0x4200002200100000L, active1, 0x8000181c1803c0L, active2, 0x300L, active3, 0L);
+         return jjMoveStringLiteralDfa2_0(active0, 0x4200002200100000L, active1, 0x20000181c1803c0L, active2, 0xc00L, active3, 0L);
       case 98:
          return jjMoveStringLiteralDfa2_0(active0, 0x10000000000000L, active1, 0x2000000000L, active2, 0L, active3, 0L);
       case 99:
-         return jjMoveStringLiteralDfa2_0(active0, 0L, active1, 0x600000000000L, active2, 0L, active3, 0L);
+         return jjMoveStringLiteralDfa2_0(active0, 0L, active1, 0x1800000000000L, active2, 0L, active3, 0L);
       case 100:
-         return jjMoveStringLiteralDfa2_0(active0, 0L, active1, 0L, active2, 0x40002L, active3, 0L);
+         return jjMoveStringLiteralDfa2_0(active0, 0L, active1, 0x40000000000L, active2, 0x100008L, active3, 0L);
       case 101:
-         return jjMoveStringLiteralDfa2_0(active0, 0x400c01005400000L, active1, 0x420104400000002L, active2, 0x4200801L, active3, 0L);
+         return jjMoveStringLiteralDfa2_0(active0, 0x400c01005400000L, active1, 0x1080404400000002L, active2, 0x10802004L, active3, 0L);
       case 102:
          if ((active1 & 0x8000L) != 0L)
          {
@@ -372,40 +372,40 @@ private int jjMoveStringLiteralDfa1_0(long active0, long active1, long active2,
       case 103:
          return jjMoveStringLiteralDfa2_0(active0, 0x800000000000000L, active1, 0L, active2, 0L, active3, 0L);
       case 104:
-         return jjMoveStringLiteralDfa2_0(active0, 0x8000000000L, active1, 0x400000L, active2, 0x7cL, active3, 0L);
+         return jjMoveStringLiteralDfa2_0(active0, 0x8000000000L, active1, 0x400000L, active2, 0x1f0L, active3, 0L);
       case 105:
-         return jjMoveStringLiteralDfa2_0(active0, 0x2000300020800000L, active1, 0xa00000000000800L, active2, 0x10400000L, active3, 0L);
+         return jjMoveStringLiteralDfa2_0(active0, 0x2000300020800000L, active1, 0x2800000000000800L, active2, 0x41000000L, active3, 0L);
       case 108:
-         return jjMoveStringLiteralDfa2_0(active0, 0L, active1, 0x8000000000L, active2, 0x8010000L, active3, 0L);
+         return jjMoveStringLiteralDfa2_0(active0, 0L, active1, 0x8000000000L, active2, 0x20040000L, active3, 0L);
       case 110:
          if ((active1 & 0x4000L) != 0L)
          {
             jjmatchedKind = 78;
             jjmatchedPos = 1;
          }
-         return jjMoveStringLiteralDfa2_0(active0, 0x90400000000L, active1, 0x800000010000L, active2, 0x1000400L, active3, 0L);
+         return jjMoveStringLiteralDfa2_0(active0, 0x90400000000L, active1, 0x2000000010000L, active2, 0x4001000L, active3, 0L);
       case 111:
-         if ((active2 & 0x2000000L) != 0L)
+         if ((active2 & 0x8000000L) != 0L)
          {
-            jjmatchedKind = 153;
+            jjmatchedKind = 155;
             jjmatchedPos = 1;
          }
-         return jjMoveStringLiteralDfa2_0(active0, 0x1040000008000000L, active1, 0x2141030000003004L, active2, 0x188000L, active3, 0L);
+         return jjMoveStringLiteralDfa2_0(active0, 0x1040000008000000L, active1, 0x85040b0000003004L, active2, 0x620000L, active3, 0L);
       case 112:
          return jjMoveStringLiteralDfa2_0(active0, 0x40000000000L, active1, 0L, active2, 0L, active3, 0L);
       case 114:
-         return jjMoveStringLiteralDfa2_0(active0, 0x109024080200000L, active1, 0x60400L, active2, 0x820080L, active3, 0L);
+         return jjMoveStringLiteralDfa2_0(active0, 0x109024080200000L, active1, 0x60400L, active2, 0x2080200L, active3, 0L);
       case 115:
          if ((active0 & 0x80000000000000L) != 0L)
          {
             jjmatchedKind = 55;
             jjmatchedPos = 1;
          }
-         return jjMoveStringLiteralDfa2_0(active0, 0x2000812000000L, active1, 0x3e0000000L, active2, 0x20000000L, active3, 0L);
+         return jjMoveStringLiteralDfa2_0(active0, 0x2000812000000L, active1, 0x3e0000000L, active2, 0x80000000L, active3, 0L);
       case 116:
-         return jjMoveStringLiteralDfa2_0(active0, 0L, active1, 0x801e080003800038L, active2, 0L, active3, 0L);
+         return jjMoveStringLiteralDfa2_0(active0, 0L, active1, 0x78200003800038L, active2, 0x2L, active3, 0L);
       case 117:
-         return jjMoveStringLiteralDfa2_0(active0, 0x8004000000000000L, active1, 0x4000040000200000L, active2, 0L, active3, 0L);
+         return jjMoveStringLiteralDfa2_0(active0, 0x8004000000000000L, active1, 0x100000200000L, active2, 0x1L, active3, 0L);
       case 118:
          return jjMoveStringLiteralDfa2_0(active0, 0L, active1, 0x1L, active2, 0L, active3, 0L);
       case 120:
@@ -418,28 +418,28 @@ private int jjMoveStringLiteralDfa1_0(long active0, long active1, long active2,
          }
          break;
       case 122:
-         if ((active1 & 0x1000000000000000L) != 0L)
+         if ((active1 & 0x4000000000000000L) != 0L)
          {
-            jjmatchedKind = 124;
+            jjmatchedKind = 126;
             jjmatchedPos = 1;
          }
          break;
       case 124:
-         if ((active3 & 0x40L) != 0L)
+         if ((active3 & 0x100L) != 0L)
          {
-            jjmatchedKind = 198;
+            jjmatchedKind = 200;
             jjmatchedPos = 1;
          }
-         else if ((active3 & 0x800L) != 0L)
+         else if ((active3 & 0x2000L) != 0L)
          {
-            jjmatchedKind = 203;
+            jjmatchedKind = 205;
             jjmatchedPos = 1;
          }
          break;
       case 125:
-         if ((active3 & 0x80L) != 0L)
+         if ((active3 & 0x200L) != 0L)
          {
-            jjmatchedKind = 199;
+            jjmatchedKind = 201;
             jjmatchedPos = 1;
          }
          break;
@@ -458,39 +458,44 @@ private int jjMoveStringLiteralDfa2_0(long old0, long active0, long old1, long a
    switch(curChar)
    {
       case 53:
-         if ((active2 & 0x2L) != 0L)
+         if ((active2 & 0x8L) != 0L)
          {
-            jjmatchedKind = 129;
+            jjmatchedKind = 131;
             jjmatchedPos = 2;
          }
          break;
       case 65:
-         return jjMoveStringLiteralDfa3_0(active0, 0x20000000000L, active1, 0x20600000002000L, active2, 0x807cL);
+         return jjMoveStringLiteralDfa3_0(active0, 0x20000000000L, active1, 0x81800000002000L, active2, 0x201f0L);
       case 66:
-         return jjMoveStringLiteralDfa3_0(active0, 0x4000000000000L, active1, 0x40080000000L, active2, 0L);
+         return jjMoveStringLiteralDfa3_0(active0, 0x4000000000000L, active1, 0x100080000000L, active2, 0L);
       case 67:
          if ((active0 & 0x800000000L) != 0L)
          {
             jjmatchedKind = 35;
             jjmatchedPos = 2;
          }
-         return jjMoveStringLiteralDfa3_0(active0, 0L, active1, 0x400800000000000L, active2, 0L);
+         return jjMoveStringLiteralDfa3_0(active0, 0L, active1, 0x1002000000000000L, active2, 0L);
       case 68:
          if ((active0 & 0x10000000000L) != 0L)
          {
             jjmatchedKind = 40;
             jjmatchedPos = 2;
          }
-         else if ((active2 & 0x40000L) != 0L)
+         else if ((active1 & 0x20000000000L) != 0L)
          {
-            jjmatchedKind = 146;
+            jjmatchedKind = 105;
+            jjmatchedPos = 2;
+         }
+         else if ((active2 & 0x100000L) != 0L)
+         {
+            jjmatchedKind = 148;
             jjmatchedPos = 2;
          }
          return jjMoveStringLiteralDfa3_0(active0, 0x481000000L, active1, 0x3eL, active2, 0L);
       case 69:
-         return jjMoveStringLiteralDfa3_0(active0, 0x8008000200000L, active1, 0L, active2, 0x30000L);
+         return jjMoveStringLiteralDfa3_0(active0, 0x8008000200000L, active1, 0L, active2, 0xc0000L);
       case 70:
-         return jjMoveStringLiteralDfa3_0(active0, 0x40000000L, active1, 0L, active2, 0x4000000L);
+         return jjMoveStringLiteralDfa3_0(active0, 0x40000000L, active1, 0L, active2, 0x10000000L);
       case 71:
          if ((active0 & 0x800000000000000L) != 0L)
          {
@@ -514,7 +519,7 @@ private int jjMoveStringLiteralDfa2_0(long old0, long active0, long old1, long a
             jjmatchedKind = 82;
             jjmatchedPos = 2;
          }
-         return jjMoveStringLiteralDfa3_0(active0, 0x21080000000000L, active1, 0x4000004040000000L, active2, 0x20000000L);
+         return jjMoveStringLiteralDfa3_0(active0, 0x21080000000000L, active1, 0x44040000000L, active2, 0x80000001L);
       case 74:
          return jjMoveStringLiteralDfa3_0(active0, 0x10000000000000L, active1, 0L, active2, 0L);
       case 75:
@@ -525,44 +530,44 @@ private int jjMoveStringLiteralDfa2_0(long old0, long active0, long old1, long a
          }
          break;
       case 76:
-         if ((active2 & 0x8000000L) != 0L)
+         if ((active2 & 0x20000000L) != 0L)
          {
-            jjmatchedKind = 155;
+            jjmatchedKind = 157;
             jjmatchedPos = 2;
          }
-         return jjMoveStringLiteralDfa3_0(active0, 0x200400000L, active1, 0x100300800L, active2, 0x400900L);
+         return jjMoveStringLiteralDfa3_0(active0, 0x200400000L, active1, 0x100300800L, active2, 0x1002400L);
       case 77:
          if ((active0 & 0x8000000000000000L) != 0L)
          {
             jjmatchedKind = 63;
             jjmatchedPos = 2;
          }
-         return jjMoveStringLiteralDfa3_0(active0, 0x2020000000L, active1, 0x800000800000200L, active2, 0L);
+         return jjMoveStringLiteralDfa3_0(active0, 0x2020000000L, active1, 0x2000000800000200L, active2, 0L);
       case 78:
          if ((active0 & 0x2000000000000000L) != 0L)
          {
             jjmatchedKind = 61;
             jjmatchedPos = 2;
          }
-         return jjMoveStringLiteralDfa3_0(active0, 0x300008000000L, active1, 0x241021218000000L, active2, 0L);
+         return jjMoveStringLiteralDfa3_0(active0, 0x300008000000L, active1, 0x904081218000000L, active2, 0L);
       case 79:
-         return jjMoveStringLiteralDfa3_0(active0, 0x100004002000000L, active1, 0x8000410400L, active2, 0x800000L);
+         return jjMoveStringLiteralDfa3_0(active0, 0x100004002000000L, active1, 0x8000410400L, active2, 0x2000000L);
       case 80:
-         return jjMoveStringLiteralDfa3_0(active0, 0x400000000000000L, active1, 0x100000000000L, active2, 0x100000L);
+         return jjMoveStringLiteralDfa3_0(active0, 0x400000000000000L, active1, 0x400000000000L, active2, 0x400000L);
       case 82:
          if ((active1 & 0x800000L) != 0L)
          {
             jjmatchedKind = 87;
             jjmatchedPos = 2;
          }
-         return jjMoveStringLiteralDfa3_0(active0, 0x400000000000L, active1, 0x801e0800030001c0L, active2, 0x1L);
+         return jjMoveStringLiteralDfa3_0(active0, 0x400000000000L, active1, 0x782000030001c0L, active2, 0x6L);
       case 83:
          if ((active1 & 0x2000000000L) != 0L)
          {
             jjmatchedKind = 101;
             jjmatchedPos = 2;
          }
-         return jjMoveStringLiteralDfa3_0(active0, 0x1004900000L, active1, 0x80000L, active2, 0x400L);
+         return jjMoveStringLiteralDfa3_0(active0, 0x1004900000L, active1, 0x80000L, active2, 0x1000L);
       case 84:
          if ((active0 & 0x800000000000L) != 0L)
          {
@@ -574,15 +579,15 @@ private int jjMoveStringLiteralDfa2_0(long old0, long active0, long old1, long a
             jjmatchedKind = 54;
             jjmatchedPos = 2;
          }
-         return jjMoveStringLiteralDfa3_0(active0, 0x2040000000000L, active1, 0x4000000L, active2, 0x11200200L);
+         return jjMoveStringLiteralDfa3_0(active0, 0x2040000000000L, active1, 0x4000000L, active2, 0x44800800L);
       case 85:
-         return jjMoveStringLiteralDfa3_0(active0, 0x1000000000000000L, active1, 0x100010020001000L, active2, 0x80L);
+         return jjMoveStringLiteralDfa3_0(active0, 0x1000000000000000L, active1, 0x400010020001000L, active2, 0x200L);
       case 86:
-         return jjMoveStringLiteralDfa3_0(active0, 0x200000000000000L, active1, 0L, active2, 0x80000L);
+         return jjMoveStringLiteralDfa3_0(active0, 0x200000000000000L, active1, 0L, active2, 0x200000L);
       case 87:
-         if ((active1 & 0x2000000000000000L) != 0L)
+         if ((active1 & 0x8000000000000000L) != 0L)
          {
-            jjmatchedKind = 125;
+            jjmatchedKind = 127;
             jjmatchedPos = 2;
          }
          break;
@@ -594,39 +599,44 @@ private int jjMoveStringLiteralDfa2_0(long old0, long active0, long old1, long a
          }
          break;
       case 89:
-         if ((active1 & 0x80000000000000L) != 0L)
+         if ((active1 & 0x200000000000000L) != 0L)
          {
-            jjmatchedKind = 119;
+            jjmatchedKind = 121;
             jjmatchedPos = 2;
          }
          break;
       case 97:
-         return jjMoveStringLiteralDfa3_0(active0, 0x20000000000L, active1, 0x20600000002000L, active2, 0x807cL);
+         return jjMoveStringLiteralDfa3_0(active0, 0x20000000000L, active1, 0x81800000002000L, active2, 0x201f0L);
       case 98:
-         return jjMoveStringLiteralDfa3_0(active0, 0x4000000000000L, active1, 0x40080000000L, active2, 0L);
+         return jjMoveStringLiteralDfa3_0(active0, 0x4000000000000L, active1, 0x100080000000L, active2, 0L);
       case 99:
          if ((active0 & 0x800000000L) != 0L)
          {
             jjmatchedKind = 35;
             jjmatchedPos = 2;
          }
-         return jjMoveStringLiteralDfa3_0(active0, 0L, active1, 0x400800000000000L, active2, 0L);
+         return jjMoveStringLiteralDfa3_0(active0, 0L, active1, 0x1002000000000000L, active2, 0L);
       case 100:
          if ((active0 & 0x10000000000L) != 0L)
          {
             jjmatchedKind = 40;
             jjmatchedPos = 2;
          }
-         else if ((active2 & 0x40000L) != 0L)
+         else if ((active1 & 0x20000000000L) != 0L)
          {
-            jjmatchedKind = 146;
+            jjmatchedKind = 105;
+            jjmatchedPos = 2;
+         }
+         else if ((active2 & 0x100000L) != 0L)
+         {
+            jjmatchedKind = 148;
             jjmatchedPos = 2;
          }
          return jjMoveStringLiteralDfa3_0(active0, 0x481000000L, active1, 0x3eL, active2, 0L);
       case 101:
-         return jjMoveStringLiteralDfa3_0(active0, 0x8008000200000L, active1, 0L, active2, 0x30000L);
+         return jjMoveStringLiteralDfa3_0(active0, 0x8008000200000L, active1, 0L, active2, 0xc0000L);
       case 102:
-         return jjMoveStringLiteralDfa3_0(active0, 0x40000000L, active1, 0L, active2, 0x4000000L);
+         return jjMoveStringLiteralDfa3_0(active0, 0x40000000L, active1, 0L, active2, 0x10000000L);
       case 103:
          if ((active0 & 0x800000000000000L) != 0L)
          {
@@ -650,7 +660,7 @@ private int jjMoveStringLiteralDfa2_0(long old0, long active0, long old1, long a
             jjmatchedKind = 82;
             jjmatchedPos = 2;
          }
-         return jjMoveStringLiteralDfa3_0(active0, 0x21080000000000L, active1, 0x4000004040000000L, active2, 0x20000000L);
+         return jjMoveStringLiteralDfa3_0(active0, 0x21080000000000L, active1, 0x44040000000L, active2, 0x80000001L);
       case 106:
          return jjMoveStringLiteralDfa3_0(active0, 0x10000000000000L, active1, 0L, active2, 0L);
       case 107:
@@ -661,44 +671,44 @@ private int jjMoveStringLiteralDfa2_0(long old0, long active0, long old1, long a
          }
          break;
       case 108:
-         if ((active2 & 0x8000000L) != 0L)
+         if ((active2 & 0x20000000L) != 0L)
          {
-            jjmatchedKind = 155;
+            jjmatchedKind = 157;
             jjmatchedPos = 2;
          }
-         return jjMoveStringLiteralDfa3_0(active0, 0x200400000L, active1, 0x100300800L, active2, 0x400900L);
+         return jjMoveStringLiteralDfa3_0(active0, 0x200400000L, active1, 0x100300800L, active2, 0x1002400L);
       case 109:
          if ((active0 & 0x8000000000000000L) != 0L)
          {
             jjmatchedKind = 63;
             jjmatchedPos = 2;
          }
-         return jjMoveStringLiteralDfa3_0(active0, 0x2020000000L, active1, 0x800000800000200L, active2, 0L);
+         return jjMoveStringLiteralDfa3_0(active0, 0x2020000000L, active1, 0x2000000800000200L, active2, 0L);
       case 110:
          if ((active0 & 0x2000000000000000L) != 0L)
          {
             jjmatchedKind = 61;
             jjmatchedPos = 2;
          }
-         return jjMoveStringLiteralDfa3_0(active0, 0x300008000000L, active1, 0x241021218000000L, active2, 0L);
+         return jjMoveStringLiteralDfa3_0(active0, 0x300008000000L, active1, 0x904081218000000L, active2, 0L);
       case 111:
-         return jjMoveStringLiteralDfa3_0(active0, 0x100004002000000L, active1, 0x8000410400L, active2, 0x800000L);
+         return jjMoveStringLiteralDfa3_0(active0, 0x100004002000000L, active1, 0x8000410400L, active2, 0x2000000L);
       case 112:
-         return jjMoveStringLiteralDfa3_0(active0, 0x400000000000000L, active1, 0x100000000000L, active2, 0x100000L);
+         return jjMoveStringLiteralDfa3_0(active0, 0x400000000000000L, active1, 0x400000000000L, active2, 0x400000L);
       case 114:
          if ((active1 & 0x800000L) != 0L)
          {
             jjmatchedKind = 87;
             jjmatchedPos = 2;
          }
-         return jjMoveStringLiteralDfa3_0(active0, 0x400000000000L, active1, 0x801e0800030001c0L, active2, 0x1L);
+         return jjMoveStringLiteralDfa3_0(active0, 0x400000000000L, active1, 0x782000030001c0L, active2, 0x6L);
       case 115:
          if ((active1 & 0x2000000000L) != 0L)
          {
             jjmatchedKind = 101;
             jjmatchedPos = 2;
          }
-         return jjMoveStringLiteralDfa3_0(active0, 0x1004900000L, active1, 0x80000L, active2, 0x400L);
+         return jjMoveStringLiteralDfa3_0(active0, 0x1004900000L, active1, 0x80000L, active2, 0x1000L);
       case 116:
          if ((active0 & 0x800000000000L) != 0L)
          {
@@ -710,15 +720,15 @@ private int jjMoveStringLiteralDfa2_0(long old0, long active0, long old1, long a
             jjmatchedKind = 54;
             jjmatchedPos = 2;
          }
-         return jjMoveStringLiteralDfa3_0(active0, 0x2040000000000L, active1, 0x4000000L, active2, 0x11200200L);
+         return jjMoveStringLiteralDfa3_0(active0, 0x2040000000000L, active1, 0x4000000L, active2, 0x44800800L);
       case 117:
-         return jjMoveStringLiteralDfa3_0(active0, 0x1000000000000000L, active1, 0x100010020001000L, active2, 0x80L);
+         return jjMoveStringLiteralDfa3_0(active0, 0x1000000000000000L, active1, 0x400010020001000L, active2, 0x200L);
       case 118:
-         return jjMoveStringLiteralDfa3_0(active0, 0x200000000000000L, active1, 0L, active2, 0x80000L);
+         return jjMoveStringLiteralDfa3_0(active0, 0x200000000000000L, active1, 0L, active2, 0x200000L);
       case 119:
-         if ((active1 & 0x2000000000000000L) != 0L)
+         if ((active1 & 0x8000000000000000L) != 0L)
          {
-            jjmatchedKind = 125;
+            jjmatchedKind = 127;
             jjmatchedPos = 2;
          }
          break;
@@ -730,9 +740,9 @@ private int jjMoveStringLiteralDfa2_0(long old0, long active0, long old1, long a
          }
          break;
       case 121:
-         if ((active1 & 0x80000000000000L) != 0L)
+         if ((active1 & 0x200000000000000L) != 0L)
          {
-            jjmatchedKind = 119;
+            jjmatchedKind = 121;
             jjmatchedPos = 2;
          }
          break;
@@ -751,39 +761,39 @@ private int jjMoveStringLiteralDfa3_0(long old0, long active0, long old1, long a
    switch(curChar)
    {
       case 49:
-         if ((active2 & 0x4L) != 0L)
+         if ((active2 & 0x10L) != 0L)
          {
-            jjmatchedKind = 130;
+            jjmatchedKind = 132;
             jjmatchedPos = 3;
          }
          break;
       case 50:
-         return jjMoveStringLiteralDfa4_0(active0, 0L, active1, 0L, active2, 0x18L);
+         return jjMoveStringLiteralDfa4_0(active0, 0L, active1, 0L, active2, 0x60L);
       case 51:
-         return jjMoveStringLiteralDfa4_0(active0, 0L, active1, 0L, active2, 0x20L);
+         return jjMoveStringLiteralDfa4_0(active0, 0L, active1, 0L, active2, 0x80L);
       case 53:
-         return jjMoveStringLiteralDfa4_0(active0, 0L, active1, 0L, active2, 0x40L);
+         return jjMoveStringLiteralDfa4_0(active0, 0L, active1, 0L, active2, 0x100L);
       case 65:
-         if ((active2 & 0x200L) != 0L)
+         if ((active2 & 0x800L) != 0L)
          {
-            jjmatchedKind = 137;
+            jjmatchedKind = 139;
             jjmatchedPos = 3;
          }
-         else if ((active2 & 0x200000L) != 0L)
+         else if ((active2 & 0x800000L) != 0L)
          {
-            jjmatchedKind = 149;
+            jjmatchedKind = 151;
             jjmatchedPos = 3;
          }
-         return jjMoveStringLiteralDfa4_0(active0, 0x400000000000000L, active1, 0x10000004000000L, active2, 0x4030000L);
+         return jjMoveStringLiteralDfa4_0(active0, 0x400000000000000L, active1, 0x40000004000000L, active2, 0x100c0000L);
       case 66:
-         return jjMoveStringLiteralDfa4_0(active0, 0L, active1, 0x8000000000000L, active2, 0L);
+         return jjMoveStringLiteralDfa4_0(active0, 0L, active1, 0x20000000000000L, active2, 0L);
       case 67:
          if ((active0 & 0x1000000000L) != 0L)
          {
             jjmatchedKind = 36;
             jjmatchedPos = 3;
          }
-         return jjMoveStringLiteralDfa4_0(active0, 0x4000000L, active1, 0x20000000000L, active2, 0L);
+         return jjMoveStringLiteralDfa4_0(active0, 0x4000000L, active1, 0x80000000000L, active2, 0L);
       case 68:
          if ((active0 & 0x200000000000L) != 0L)
          {
@@ -795,14 +805,14 @@ private int jjMoveStringLiteralDfa3_0(long old0, long active0, long old1, long a
             jjmatchedKind = 100;
             jjmatchedPos = 3;
          }
-         else if ((active1 & 0x4000000000000000L) != 0L)
+         else if ((active2 & 0x1L) != 0L)
          {
-            jjmatchedKind = 126;
+            jjmatchedKind = 128;
             jjmatchedPos = 3;
          }
-         else if ((active2 & 0x8000L) != 0L)
+         else if ((active2 & 0x20000L) != 0L)
          {
-            jjmatchedKind = 143;
+            jjmatchedKind = 145;
             jjmatchedPos = 3;
          }
          return jjMoveStringLiteralDfa4_0(active0, 0x8000000000000L, active1, 0x2010000L, active2, 0L);
@@ -817,17 +827,17 @@ private int jjMoveStringLiteralDfa3_0(long old0, long active0, long old1, long a
             jjmatchedKind = 66;
             jjmatchedPos = 3;
          }
-         else if ((active2 & 0x80L) != 0L)
+         else if ((active2 & 0x200L) != 0L)
          {
-            jjmatchedKind = 135;
+            jjmatchedKind = 137;
             jjmatchedPos = 3;
          }
-         else if ((active2 & 0x80000L) != 0L)
+         else if ((active2 & 0x200000L) != 0L)
          {
-            jjmatchedKind = 147;
+            jjmatchedKind = 149;
             jjmatchedPos = 3;
          }
-         return jjMoveStringLiteralDfa4_0(active0, 0x10002480400000L, active1, 0x804000c00000038L, active2, 0x400c00L);
+         return jjMoveStringLiteralDfa4_0(active0, 0x10002480400000L, active1, 0x2010000c00000038L, active2, 0x1003000L);
       case 70:
          return jjMoveStringLiteralDfa4_0(active0, 0x200000L, active1, 0L, active2, 0L);
       case 71:
@@ -838,9 +848,9 @@ private int jjMoveStringLiteralDfa3_0(long old0, long active0, long old1, long a
          }
          return jjMoveStringLiteralDfa4_0(active0, 0L, active1, 0x10000000L, active2, 0L);
       case 72:
-         if ((active2 & 0x10000000L) != 0L)
+         if ((active2 & 0x40000000L) != 0L)
          {
-            jjmatchedKind = 156;
+            jjmatchedKind = 158;
             jjmatchedPos = 3;
          }
          break;
@@ -859,7 +869,7 @@ private int jjMoveStringLiteralDfa3_0(long old0, long active0, long old1, long a
             jjmatchedKind = 102;
             jjmatchedPos = 3;
          }
-         return jjMoveStringLiteralDfa4_0(active0, 0L, active1, 0x180081002000L, active2, 0L);
+         return jjMoveStringLiteralDfa4_0(active0, 0L, active1, 0x600081002000L, active2, 0L);
       case 77:
          if ((active0 & 0x4000000000L) != 0L)
          {
@@ -873,71 +883,76 @@ private int jjMoveStringLiteralDfa3_0(long old0, long active0, long old1, long a
             jjmatchedKind = 25;
             jjmatchedPos = 3;
          }
-         return jjMoveStringLiteralDfa4_0(active0, 0x1000000000000000L, active1, 0x10000001000L, active2, 0x20000000L);
+         return jjMoveStringLiteralDfa4_0(active0, 0x1000000000000000L, active1, 0x10000001000L, active2, 0x80000000L);
       case 79:
-         if ((active2 & 0x1000000L) != 0L)
+         if ((active2 & 0x4000000L) != 0L)
          {
-            jjmatchedKind = 152;
+            jjmatchedKind = 154;
             jjmatchedPos = 3;
          }
-         return jjMoveStringLiteralDfa4_0(active0, 0x80000000000L, active1, 0x400808000000000L, active2, 0L);
+         return jjMoveStringLiteralDfa4_0(active0, 0x80000000000L, active1, 0x1002008000000000L, active2, 0L);
       case 80:
-         if ((active2 & 0x800000L) != 0L)
+         if ((active2 & 0x2000000L) != 0L)
          {
-            jjmatchedKind = 151;
+            jjmatchedKind = 153;
             jjmatchedPos = 3;
          }
          return jjMoveStringLiteralDfa4_0(active0, 0x1020000000000L, active1, 0x200L, active2, 0L);
       case 82:
-         if ((active1 & 0x20000000000000L) != 0L)
+         if ((active1 & 0x80000000000000L) != 0L)
          {
-            jjmatchedKind = 117;
+            jjmatchedKind = 119;
             jjmatchedPos = 3;
          }
-         return jjMoveStringLiteralDfa4_0(active0, 0x2008000000000L, active1, 0x100000060400000L, active2, 0L);
+         return jjMoveStringLiteralDfa4_0(active0, 0x2008000000000L, active1, 0x400000060400000L, active2, 0L);
       case 83:
-         return jjMoveStringLiteralDfa4_0(active0, 0x20000048000000L, active1, 0x2640000000000L, active2, 0x101L);
+         return jjMoveStringLiteralDfa4_0(active0, 0x20000048000000L, active1, 0x9900000000000L, active2, 0x404L);
       case 84:
          if ((active1 & 0x80000L) != 0L)
          {
             jjmatchedKind = 83;
             jjmatchedPos = 3;
          }
-         return jjMoveStringLiteralDfa4_0(active0, 0x800000L, active1, 0x41000000200800L, active2, 0L);
+         return jjMoveStringLiteralDfa4_0(active0, 0x800000L, active1, 0x104000000200800L, active2, 0L);
       case 85:
-         return jjMoveStringLiteralDfa4_0(active0, 0x100100201000000L, active1, 0x8200000200000400L, active2, 0L);
+         return jjMoveStringLiteralDfa4_0(active0, 0x100100201000000L, active1, 0x800000200000400L, active2, 0x2L);
       case 86:
+         if ((active1 & 0x40000000000L) != 0L)
+         {
+            jjmatchedKind = 106;
+            jjmatchedPos = 3;
+         }
          return jjMoveStringLiteralDfa4_0(active0, 0x400000000000L, active1, 0L, active2, 0L);
       case 89:
-         if ((active2 & 0x100000L) != 0L)
+         if ((active2 & 0x400000L) != 0L)
          {
-            jjmatchedKind = 148;
+            jjmatchedKind = 150;
             jjmatchedPos = 3;
          }
          break;
       case 95:
          return jjMoveStringLiteralDfa4_0(active0, 0L, active1, 0x180L, active2, 0L);
       case 97:
-         if ((active2 & 0x200L) != 0L)
+         if ((active2 & 0x800L) != 0L)
          {
-            jjmatchedKind = 137;
+            jjmatchedKind = 139;
             jjmatchedPos = 3;
          }
-         else if ((active2 & 0x200000L) != 0L)
+         else if ((active2 & 0x800000L) != 0L)
          {
-            jjmatchedKind = 149;
+            jjmatchedKind = 151;
             jjmatchedPos = 3;
          }
-         return jjMoveStringLiteralDfa4_0(active0, 0x400000000000000L, active1, 0x10000004000000L, active2, 0x4030000L);
+         return jjMoveStringLiteralDfa4_0(active0, 0x400000000000000L, active1, 0x40000004000000L, active2, 0x100c0000L);
       case 98:
-         return jjMoveStringLiteralDfa4_0(active0, 0L, active1, 0x8000000000000L, active2, 0L);
+         return jjMoveStringLiteralDfa4_0(active0, 0L, active1, 0x20000000000000L, active2, 0L);
       case 99:
          if ((active0 & 0x1000000000L) != 0L)
          {
             jjmatchedKind = 36;
             jjmatchedPos = 3;
          }
-         return jjMoveStringLiteralDfa4_0(active0, 0x4000000L, active1, 0x20000000000L, active2, 0L);
+         return jjMoveStringLiteralDfa4_0(active0, 0x4000000L, active1, 0x80000000000L, active2, 0L);
       case 100:
          if ((active0 & 0x200000000000L) != 0L)
          {
@@ -949,14 +964,14 @@ private int jjMoveStringLiteralDfa3_0(long old0, long active0, long old1, long a
             jjmatchedKind = 100;
             jjmatchedPos = 3;
          }
-         else if ((active1 & 0x4000000000000000L) != 0L)
+         else if ((active2 & 0x1L) != 0L)
          {
-            jjmatchedKind = 126;
+            jjmatchedKind = 128;
             jjmatchedPos = 3;
          }
-         else if ((active2 & 0x8000L) != 0L)
+         else if ((active2 & 0x20000L) != 0L)
          {
-            jjmatchedKind = 143;
+            jjmatchedKind = 145;
             jjmatchedPos = 3;
          }
          return jjMoveStringLiteralDfa4_0(active0, 0x8000000000000L, active1, 0x2010000L, active2, 0L);
@@ -971,17 +986,17 @@ private int jjMoveStringLiteralDfa3_0(long old0, long active0, long old1, long a
             jjmatchedKind = 66;
             jjmatchedPos = 3;
          }
-         else if ((active2 & 0x80L) != 0L)
+         else if ((active2 & 0x200L) != 0L)
          {
-            jjmatchedKind = 135;
+            jjmatchedKind = 137;
             jjmatchedPos = 3;
          }
-         else if ((active2 & 0x80000L) != 0L)
+         else if ((active2 & 0x200000L) != 0L)
          {
-            jjmatchedKind = 147;
+            jjmatchedKind = 149;
             jjmatchedPos = 3;
          }
-         return jjMoveStringLiteralDfa4_0(active0, 0x10002480400000L, active1, 0x804000c00000038L, active2, 0x400c00L);
+         return jjMoveStringLiteralDfa4_0(active0, 0x10002480400000L, active1, 0x2010000c00000038L, active2, 0x1003000L);
       case 102:
          return jjMoveStringLiteralDfa4_0(active0, 0x200000L, active1, 0L, active2, 0L);
       case 103:
@@ -992,9 +1007,9 @@ private int jjMoveStringLiteralDfa3_0(long old0, long active0, long old1, long a
          }
          return jjMoveStringLiteralDfa4_0(active0, 0L, active1, 0x10000000L, active2, 0L);
       case 104:
-         if ((active2 & 0x10000000L) != 0L)
+         if ((active2 & 0x40000000L) != 0L)
          {
-            jjmatchedKind = 156;
+            jjmatchedKind = 158;
             jjmatchedPos = 3;
          }
          break;
@@ -1013,7 +1028,7 @@ private int jjMoveStringLiteralDfa3_0(long old0, long active0, long old1, long a
             jjmatchedKind = 102;
             jjmatchedPos = 3;
          }
-         return jjMoveStringLiteralDfa4_0(active0, 0L, active1, 0x180081002000L, active2, 0L);
+         return jjMoveStringLiteralDfa4_0(active0, 0L, active1, 0x600081002000L, active2, 0L);
       case 109:
          if ((active0 & 0x4000000000L) != 0L)
          {
@@ -1027,45 +1042,50 @@ private int jjMoveStringLiteralDfa3_0(long old0, long active0, long old1, long a
             jjmatchedKind = 25;
             jjmatchedPos = 3;
          }
-         return jjMoveStringLiteralDfa4_0(active0, 0x1000000000000000L, active1, 0x10000001000L, active2, 0x20000000L);
+         return jjMoveStringLiteralDfa4_0(active0, 0x1000000000000000L, active1, 0x10000001000L, active2, 0x80000000L);
       case 111:
-         if ((active2 & 0x1000000L) != 0L)
+         if ((active2 & 0x4000000L) != 0L)
          {
-            jjmatchedKind = 152;
+            jjmatchedKind = 154;
             jjmatchedPos = 3;
          }
-         return jjMoveStringLiteralDfa4_0(active0, 0x80000000000L, active1, 0x400808000000000L, active2, 0L);
+         return jjMoveStringLiteralDfa4_0(active0, 0x80000000000L, active1, 0x1002008000000000L, active2, 0L);
       case 112:
-         if ((active2 & 0x800000L) != 0L)
+         if ((active2 & 0x2000000L) != 0L)
          {
-            jjmatchedKind = 151;
+            jjmatchedKind = 153;
             jjmatchedPos = 3;
          }
          return jjMoveStringLiteralDfa4_0(active0, 0x1020000000000L, active1, 0x200L, active2, 0L);
       case 114:
-         if ((active1 & 0x20000000000000L) != 0L)
+         if ((active1 & 0x80000000000000L) != 0L)
          {
-            jjmatchedKind = 117;
+            jjmatchedKind = 119;
             jjmatchedPos = 3;
          }
-         return jjMoveStringLiteralDfa4_0(active0, 0x2008000000000L, active1, 0x100000060400000L, active2, 0L);
+         return jjMoveStringLiteralDfa4_0(active0, 0x2008000000000L, active1, 0x400000060400000L, active2, 0L);
       case 115:
-         return jjMoveStringLiteralDfa4_0(active0, 0x20000048000000L, active1, 0x2640000000000L, active2, 0x101L);
+         return jjMoveStringLiteralDfa4_0(active0, 0x20000048000000L, active1, 0x9900000000000L, active2, 0x404L);
       case 116:
          if ((active1 & 0x80000L) != 0L)
          {
             jjmatchedKind = 83;
             jjmatchedPos = 3;
          }
-         return jjMoveStringLiteralDfa4_0(active0, 0x800000L, active1, 0x41000000200800L, active2, 0L);
+         return jjMoveStringLiteralDfa4_0(active0, 0x800000L, active1, 0x104000000200800L, active2, 0L);
       case 117:
-         return jjMoveStringLiteralDfa4_0(active0, 0x100100201000000L, active1, 0x8200000200000400L, active2, 0L);
+         return jjMoveStringLiteralDfa4_0(active0, 0x100100201000000L, active1, 0x800000200000400L, active2, 0x2L);
       case 118:
+         if ((active1 & 0x40000000000L) != 0L)
+         {
+            jjmatchedKind = 106;
+            jjmatchedPos = 3;
+         }
          return jjMoveStringLiteralDfa4_0(active0, 0x400000000000L, active1, 0L, active2, 0L);
       case 121:
-         if ((active2 & 0x100000L) != 0L)
+         if ((active2 & 0x400000L) != 0L)
          {
-            jjmatchedKind = 148;
+            jjmatchedKind = 150;
             jjmatchedPos = 3;
          }
          break;
@@ -1084,15 +1104,15 @@ private int jjMoveStringLiteralDfa4_0(long old0, long active0, long old1, long a
    switch(curChar)
    {
       case 49:
-         return jjMoveStringLiteralDfa5_0(active0, 0L, active1, 0L, active2, 0x40L);
+         return jjMoveStringLiteralDfa5_0(active0, 0L, active1, 0L, active2, 0x100L);
       case 50:
-         return jjMoveStringLiteralDfa5_0(active0, 0L, active1, 0L, active2, 0x8L);
+         return jjMoveStringLiteralDfa5_0(active0, 0L, active1, 0L, active2, 0x20L);
       case 53:
-         return jjMoveStringLiteralDfa5_0(active0, 0L, active1, 0L, active2, 0x10L);
+         return jjMoveStringLiteralDfa5_0(active0, 0L, active1, 0L, active2, 0x40L);
       case 56:
-         return jjMoveStringLiteralDfa5_0(active0, 0L, active1, 0L, active2, 0x20L);
+         return jjMoveStringLiteralDfa5_0(active0, 0L, active1, 0L, active2, 0x80L);
       case 65:
-         return jjMoveStringLiteralDfa5_0(active0, 0L, active1, 0x1120081000042L, active2, 0L);
+         return jjMoveStringLiteralDfa5_0(active0, 0L, active1, 0x4480081000042L, active2, 0L);
       case 67:
          return jjMoveStringLiteralDfa5_0(active0, 0x10000001400000L, active1, 0L, active2, 0L);
       case 68:
@@ -1111,7 +1131,7 @@ private int jjMoveStringLiteralDfa4_0(long old0, long active0, long old1, long a
             jjmatchedKind = 104;
             jjmatchedPos = 4;
          }
-         return jjMoveStringLiteralDfa5_0(active0, 0L, active1, 0x800000000000L, active2, 0L);
+         return jjMoveStringLiteralDfa5_0(active0, 0L, active1, 0x2000000000000L, active2, 0L);
       case 69:
          if ((active0 & 0x8000000000L) != 0L)
          {
@@ -1123,33 +1143,33 @@ private int jjMoveStringLiteralDfa4_0(long old0, long active0, long old1, long a
             jjmatchedKind = 80;
             jjmatchedPos = 4;
          }
-         else if ((active1 & 0x200000000000L) != 0L)
+         else if ((active1 & 0x800000000000L) != 0L)
          {
-            jjmatchedKind = 109;
+            jjmatchedKind = 111;
             jjmatchedPos = 4;
          }
-         else if ((active1 & 0x400000000000L) != 0L)
+         else if ((active1 & 0x1000000000000L) != 0L)
          {
-            jjmatchedKind = 110;
+            jjmatchedKind = 112;
             jjmatchedPos = 4;
          }
-         else if ((active2 & 0x100L) != 0L)
+         else if ((active2 & 0x400L) != 0L)
          {
-            jjmatchedKind = 136;
+            jjmatchedKind = 138;
             jjmatchedPos = 4;
          }
-         return jjMoveStringLiteralDfa5_0(active0, 0x4000240000000L, active1, 0x8080000002800L, active2, 0L);
+         return jjMoveStringLiteralDfa5_0(active0, 0x4000240000000L, active1, 0x20200000002800L, active2, 0L);
       case 70:
          if ((active0 & 0x400000000L) != 0L)
          {
             jjmatchedKind = 34;
             jjmatchedPos = 4;
          }
-         return jjMoveStringLiteralDfa5_0(active0, 0L, active1, 0x10000000000000L, active2, 0L);
+         return jjMoveStringLiteralDfa5_0(active0, 0L, active1, 0x40000000000000L, active2, 0L);
       case 71:
-         if ((active2 & 0x20000000L) != 0L)
+         if ((active2 & 0x80000000L) != 0L)
          {
-            jjmatchedKind = 157;
+            jjmatchedKind = 159;
             jjmatchedPos = 4;
          }
          break;
@@ -1159,9 +1179,9 @@ private int jjMoveStringLiteralDfa4_0(long old0, long active0, long old1, long a
             jjmatchedKind = 41;
             jjmatchedPos = 4;
          }
-         else if ((active1 & 0x40000000000000L) != 0L)
+         else if ((active1 & 0x100000000000000L) != 0L)
          {
-            jjmatchedKind = 118;
+            jjmatchedKind = 120;
             jjmatchedPos = 4;
          }
          break;
@@ -1181,7 +1201,7 @@ private int jjMoveStringLiteralDfa4_0(long old0, long active0, long old1, long a
             jjmatchedKind = 94;
             jjmatchedPos = 4;
          }
-         return jjMoveStringLiteralDfa5_0(active0, 0xa400000a00000L, active1, 0L, active2, 0x1L);
+         return jjMoveStringLiteralDfa5_0(active0, 0xa400000a00000L, active1, 0L, active2, 0x4L);
       case 76:
          return jjMoveStringLiteralDfa5_0(active0, 0x1000000000000L, active1, 0x200L, active2, 0L);
       case 77:
@@ -1192,7 +1212,7 @@ private int jjMoveStringLiteralDfa4_0(long old0, long active0, long old1, long a
             jjmatchedKind = 43;
             jjmatchedPos = 4;
          }
-         return jjMoveStringLiteralDfa5_0(active0, 0x200000000000000L, active1, 0x404000000000000L, active2, 0x400000L);
+         return jjMoveStringLiteralDfa5_0(active0, 0x200000000000000L, active1, 0x1010000000000000L, active2, 0x1000000L);
       case 79:
          return jjMoveStringLiteralDfa5_0(active0, 0x40000000000L, active1, 0L, active2, 0L);
       case 80:
@@ -1213,21 +1233,21 @@ private int jjMoveStringLiteralDfa4_0(long old0, long active0, long old1, long a
             jjmatchedKind = 103;
             jjmatchedPos = 4;
          }
-         else if ((active2 & 0x10000L) != 0L)
+         else if ((active2 & 0x40000L) != 0L)
          {
-            jjmatchedKind = 144;
+            jjmatchedKind = 146;
             jjmatchedPos = 4;
          }
-         return jjMoveStringLiteralDfa5_0(active0, 0x400000004000000L, active1, 0L, active2, 0x400L);
+         return jjMoveStringLiteralDfa5_0(active0, 0x400000004000000L, active1, 0L, active2, 0x1000L);
       case 83:
          if ((active0 & 0x100000000000L) != 0L)
          {
             jjmatchedKind = 44;
             jjmatchedPos = 4;
          }
-         else if ((active1 & 0x100000000000000L) != 0L)
+         else if ((active1 & 0x400000000000000L) != 0L)
          {
-            jjmatchedKind = 120;
+            jjmatchedKind = 122;
             jjmatchedPos = 4;
          }
          return jjMoveStringLiteralDfa5_0(active0, 0L, active1, 0x80L, active2, 0L);
@@ -1247,9 +1267,9 @@ private int jjMoveStringLiteralDfa4_0(long old0, long active0, long old1, long a
             jjmatchedKind = 89;
             jjmatchedPos = 4;
          }
-         return jjMoveStringLiteralDfa5_0(active0, 0x20000008000000L, active1, 0x202040904400000L, active2, 0x20800L);
+         return jjMoveStringLiteralDfa5_0(active0, 0x20000008000000L, active1, 0x808100904400000L, active2, 0x82000L);
       case 85:
-         return jjMoveStringLiteralDfa5_0(active0, 0L, active1, 0x8000000000000000L, active2, 0x4000000L);
+         return jjMoveStringLiteralDfa5_0(active0, 0L, active1, 0L, active2, 0x10000002L);
       case 86:
          if ((active1 & 0x8L) != 0L)
          {
@@ -1265,9 +1285,9 @@ private int jjMoveStringLiteralDfa4_0(long old0, long active0, long old1, long a
          }
          break;
       case 90:
-         return jjMoveStringLiteralDfa5_0(active0, 0L, active1, 0x800000000000000L, active2, 0L);
+         return jjMoveStringLiteralDfa5_0(active0, 0L, active1, 0x2000000000000000L, active2, 0L);
       case 97:
-         return jjMoveStringLiteralDfa5_0(active0, 0L, active1, 0x1120081000042L, active2, 0L);
+         return jjMoveStringLiteralDfa5_0(active0, 0L, active1, 0x4480081000042L, active2, 0L);
       case 99:
          return jjMoveStringLiteralDfa5_0(active0, 0x10000001400000L, active1, 0L, active2, 0L);
       case 100:
@@ -1286,7 +1306,7 @@ private int jjMoveStringLiteralDfa4_0(long old0, long active0, long old1, long a
             jjmatchedKind = 104;
             jjmatchedPos = 4;
          }
-         return jjMoveStringLiteralDfa5_0(active0, 0L, active1, 0x800000000000L, active2, 0L);
+         return jjMoveStringLiteralDfa5_0(active0, 0L, active1, 0x2000000000000L, active2, 0L);
       case 101:
          if ((active0 & 0x8000000000L) != 0L)
          {
@@ -1298,33 +1318,33 @@ private int jjMoveStringLiteralDfa4_0(long old0, long active0, long old1, long a
             jjmatchedKind = 80;
             jjmatchedPos = 4;
          }
-         else if ((active1 & 0x200000000000L) != 0L)
+         else if ((active1 & 0x800000000000L) != 0L)
          {
-            jjmatchedKind = 109;
+            jjmatchedKind = 111;
             jjmatchedPos = 4;
          }
-         else if ((active1 & 0x400000000000L) != 0L)
+         else if ((active1 & 0x1000000000000L) != 0L)
          {
-            jjmatchedKind = 110;
+            jjmatchedKind = 112;
             jjmatchedPos = 4;
          }
-         else if ((active2 & 0x100L) != 0L)
+         else if ((active2 & 0x400L) != 0L)
          {
-            jjmatchedKind = 136;
+            jjmatchedKind = 138;
             jjmatchedPos = 4;
          }
-         return jjMoveStringLiteralDfa5_0(active0, 0x4000240000000L, active1, 0x8080000002800L, active2, 0L);
+         return jjMoveStringLiteralDfa5_0(active0, 0x4000240000000L, active1, 0x20200000002800L, active2, 0L);
       case 102:
          if ((active0 & 0x400000000L) != 0L)
          {
             jjmatchedKind = 34;
             jjmatchedPos = 4;
          }
-         return jjMoveStringLiteralDfa5_0(active0, 0L, active1, 0x10000000000000L, active2, 0L);
+         return jjMoveStringLiteralDfa5_0(active0, 0L, active1, 0x40000000000000L, active2, 0L);
       case 103:
-         if ((active2 & 0x20000000L) != 0L)
+         if ((active2 & 0x80000000L) != 0L)
          {
-            jjmatchedKind = 157;
+            jjmatchedKind = 159;
             jjmatchedPos = 4;
          }
          break;
@@ -1334,9 +1354,9 @@ private int jjMoveStringLiteralDfa4_0(long old0, long active0, long old1, long a
             jjmatchedKind = 41;
             jjmatchedPos = 4;
          }
-         else if ((active1 & 0x40000000000000L) != 0L)
+         else if ((active1 & 0x100000000000000L) != 0L)
          {
-            jjmatchedKind = 118;
+            jjmatchedKind = 120;
             jjmatchedPos = 4;
          }
          break;
@@ -1356,7 +1376,7 @@ private int jjMoveStringLiteralDfa4_0(long old0, long active0, long old1, long a
             jjmatchedKind = 94;
             jjmatchedPos = 4;
          }
-         return jjMoveStringLiteralDfa5_0(active0, 0xa400000a00000L, active1, 0L, active2, 0x1L);
+         return jjMoveStringLiteralDfa5_0(active0, 0xa400000a00000L, active1, 0L, active2, 0x4L);
       case 108:
          return jjMoveStringLiteralDfa5_0(active0, 0x1000000000000L, active1, 0x200L, active2, 0L);
       case 109:
@@ -1367,7 +1387,7 @@ private int jjMoveStringLiteralDfa4_0(long old0, long active0, long old1, long a
             jjmatchedKind = 43;
             jjmatchedPos = 4;
          }
-         return jjMoveStringLiteralDfa5_0(active0, 0x200000000000000L, active1, 0x404000000000000L, active2, 0x400000L);
+         return jjMoveStringLiteralDfa5_0(active0, 0x200000000000000L, active1, 0x1010000000000000L, active2, 0x1000000L);
       case 111:
          return jjMoveStringLiteralDfa5_0(active0, 0x40000000000L, active1, 0L, active2, 0L);
       case 112:
@@ -1388,21 +1408,21 @@ private int jjMoveStringLiteralDfa4_0(long old0, long active0, long old1, long a
             jjmatchedKind = 103;
             jjmatchedPos = 4;
          }
-         else if ((active2 & 0x10000L) != 0L)
+         else if ((active2 & 0x40000L) != 0L)
          {
-            jjmatchedKind = 144;
+            jjmatchedKind = 146;
             jjmatchedPos = 4;
          }
-         return jjMoveStringLiteralDfa5_0(active0, 0x400000004000000L, active1, 0L, active2, 0x400L);
+         return jjMoveStringLiteralDfa5_0(active0, 0x400000004000000L, active1, 0L, active2, 0x1000L);
       case 115:
          if ((active0 & 0x100000000000L) != 0L)
          {
             jjmatchedKind = 44;
             jjmatchedPos = 4;
          }
-         else if ((active1 & 0x100000000000000L) != 0L)
+         else if ((active1 & 0x400000000000000L) != 0L)
          {
-            jjmatchedKind = 120;
+            jjmatchedKind = 122;
             jjmatchedPos = 4;
          }
          return jjMoveStringLiteralDfa5_0(active0, 0L, active1, 0x80L, active2, 0L);
@@ -1422,9 +1442,9 @@ private int jjMoveStringLiteralDfa4_0(long old0, long active0, long old1, long a
             jjmatchedKind = 89;
             jjmatchedPos = 4;
          }
-         return jjMoveStringLiteralDfa5_0(active0, 0x20000008000000L, active1, 0x202040904400000L, active2, 0x20800L);
+         return jjMoveStringLiteralDfa5_0(active0, 0x20000008000000L, active1, 0x808100904400000L, active2, 0x82000L);
       case 117:
-         return jjMoveStringLiteralDfa5_0(active0, 0L, active1, 0x8000000000000000L, active2, 0x4000000L);
+         return jjMoveStringLiteralDfa5_0(active0, 0L, active1, 0L, active2, 0x10000002L);
       case 118:
          if ((active1 & 0x8L) != 0L)
          {
@@ -1440,7 +1460,7 @@ private int jjMoveStringLiteralDfa4_0(long old0, long active0, long old1, long a
          }
          break;
       case 122:
-         return jjMoveStringLiteralDfa5_0(active0, 0L, active1, 0x800000000000000L, active2, 0L);
+         return jjMoveStringLiteralDfa5_0(active0, 0L, active1, 0x2000000000000000L, active2, 0L);
       default :
          break;
    }
@@ -1456,37 +1476,37 @@ private int jjMoveStringLiteralDfa5_0(long old0, long active0, long old1, long a
    switch(curChar)
    {
       case 50:
-         if ((active2 & 0x40L) != 0L)
+         if ((active2 & 0x100L) != 0L)
          {
-            jjmatchedKind = 134;
+            jjmatchedKind = 136;
             jjmatchedPos = 5;
          }
          break;
       case 52:
-         if ((active2 & 0x8L) != 0L)
+         if ((active2 & 0x20L) != 0L)
          {
-            jjmatchedKind = 131;
+            jjmatchedKind = 133;
             jjmatchedPos = 5;
          }
-         else if ((active2 & 0x20L) != 0L)
+         else if ((active2 & 0x80L) != 0L)
          {
-            jjmatchedKind = 133;
+            jjmatchedKind = 135;
             jjmatchedPos = 5;
          }
          break;
       case 54:
-         if ((active2 & 0x10L) != 0L)
+         if ((active2 & 0x40L) != 0L)
          {
-            jjmatchedKind = 132;
+            jjmatchedKind = 134;
             jjmatchedPos = 5;
          }
          break;
       case 65:
-         return jjMoveStringLiteralDfa6_0(active0, 0x400000000000000L, active1, 0x2000010000080L, active2, 0L);
+         return jjMoveStringLiteralDfa6_0(active0, 0x400000000000000L, active1, 0x8000010000080L, active2, 0L);
       case 67:
-         return jjMoveStringLiteralDfa6_0(active0, 0xc400000000000L, active1, 0x100000000000L, active2, 0L);
+         return jjMoveStringLiteralDfa6_0(active0, 0xc400000000000L, active1, 0x400000000000L, active2, 0L);
       case 68:
-         return jjMoveStringLiteralDfa6_0(active0, 0L, active1, 0x404000000000000L, active2, 0L);
+         return jjMoveStringLiteralDfa6_0(active0, 0L, active1, 0x1010000000000000L, active2, 0L);
       case 69:
          if ((active0 & 0x1000000000000L) != 0L)
          {
@@ -1498,19 +1518,19 @@ private int jjMoveStringLiteralDfa5_0(long old0, long active0, long old1, long a
             jjmatchedKind = 73;
             jjmatchedPos = 5;
          }
-         else if ((active2 & 0x800L) != 0L)
+         else if ((active2 & 0x2000L) != 0L)
          {
-            jjmatchedKind = 139;
+            jjmatchedKind = 141;
             jjmatchedPos = 5;
          }
-         else if ((active2 & 0x20000L) != 0L)
+         else if ((active2 & 0x80000L) != 0L)
          {
-            jjmatchedKind = 145;
+            jjmatchedKind = 147;
             jjmatchedPos = 5;
          }
-         return jjMoveStringLiteralDfa6_0(active0, 0x1000000L, active1, 0x200800b00400000L, active2, 0L);
+         return jjMoveStringLiteralDfa6_0(active0, 0x1000000L, active1, 0x802000b00400000L, active2, 0L);
       case 70:
-         return jjMoveStringLiteralDfa6_0(active0, 0L, active1, 0x8000000000000L, active2, 0L);
+         return jjMoveStringLiteralDfa6_0(active0, 0L, active1, 0x20000000000000L, active2, 0L);
       case 71:
          if ((active0 & 0x200000000000000L) != 0L)
          {
@@ -1519,23 +1539,23 @@ private int jjMoveStringLiteralDfa5_0(long old0, long active0, long old1, long a
          }
          break;
       case 73:
-         return jjMoveStringLiteralDfa6_0(active0, 0x4000000L, active1, 0x8001000000000000L, active2, 0L);
+         return jjMoveStringLiteralDfa6_0(active0, 0x4000000L, active1, 0x4000000000000L, active2, 0x2L);
       case 76:
-         return jjMoveStringLiteralDfa6_0(active0, 0L, active1, 0L, active2, 0x4000000L);
+         return jjMoveStringLiteralDfa6_0(active0, 0L, active1, 0L, active2, 0x10000000L);
       case 78:
          if ((active1 & 0x2L) != 0L)
          {
             jjmatchedKind = 65;
             jjmatchedPos = 5;
          }
-         else if ((active1 & 0x80000000000L) != 0L)
+         else if ((active1 & 0x200000000000L) != 0L)
          {
-            jjmatchedKind = 107;
+            jjmatchedKind = 109;
             jjmatchedPos = 5;
          }
          return jjMoveStringLiteralDfa6_0(active0, 0x40000800000L, active1, 0x81000040L, active2, 0L);
       case 79:
-         return jjMoveStringLiteralDfa6_0(active0, 0L, active1, 0x800000000000100L, active2, 0x1L);
+         return jjMoveStringLiteralDfa6_0(active0, 0L, active1, 0x2000000000000100L, active2, 0x4L);
       case 80:
          return jjMoveStringLiteralDfa6_0(active0, 0x2000000000000L, active1, 0L, active2, 0L);
       case 82:
@@ -1544,9 +1564,9 @@ private int jjMoveStringLiteralDfa5_0(long old0, long active0, long old1, long a
             jjmatchedKind = 75;
             jjmatchedPos = 5;
          }
-         else if ((active1 & 0x40000000000L) != 0L)
+         else if ((active1 & 0x100000000000L) != 0L)
          {
-            jjmatchedKind = 106;
+            jjmatchedKind = 108;
             jjmatchedPos = 5;
          }
          return jjMoveStringLiteralDfa6_0(active0, 0x8000000L, active1, 0L, active2, 0L);
@@ -1578,22 +1598,22 @@ private int jjMoveStringLiteralDfa5_0(long old0, long active0, long old1, long a
             jjmatchedKind = 52;
             jjmatchedPos = 5;
          }
-         else if ((active1 & 0x20000000000L) != 0L)
+         else if ((active1 & 0x80000000000L) != 0L)
          {
-            jjmatchedKind = 105;
+            jjmatchedKind = 107;
             jjmatchedPos = 5;
          }
-         else if ((active2 & 0x400L) != 0L)
+         else if ((active2 & 0x1000L) != 0L)
          {
-            jjmatchedKind = 138;
+            jjmatchedKind = 140;
             jjmatchedPos = 5;
          }
-         else if ((active2 & 0x400000L) != 0L)
+         else if ((active2 & 0x1000000L) != 0L)
          {
-            jjmatchedKind = 150;
+            jjmatchedKind = 152;
             jjmatchedPos = 5;
          }
-         return jjMoveStringLiteralDfa6_0(active0, 0L, active1, 0x10000000000000L, active2, 0L);
+         return jjMoveStringLiteralDfa6_0(active0, 0L, active1, 0x40000000000000L, active2, 0L);
       case 88:
          if ((active0 & 0x200000L) != 0L)
          {
@@ -1606,11 +1626,11 @@ private int jjMoveStringLiteralDfa5_0(long old0, long active0, long old1, long a
       case 95:
          return jjMoveStringLiteralDfa6_0(active0, 0L, active1, 0x430L, active2, 0L);
       case 97:
-         return jjMoveStringLiteralDfa6_0(active0, 0x400000000000000L, active1, 0x2000010000080L, active2, 0L);
+         return jjMoveStringLiteralDfa6_0(active0, 0x400000000000000L, active1, 0x8000010000080L, active2, 0L);
       case 99:
-         return jjMoveStringLiteralDfa6_0(active0, 0xc400000000000L, active1, 0x100000000000L, active2, 0L);
+         return jjMoveStringLiteralDfa6_0(active0, 0xc400000000000L, active1, 0x400000000000L, active2, 0L);
       case 100:
-         return jjMoveStringLiteralDfa6_0(active0, 0L, active1, 0x404000000000000L, active2, 0L);
+         return jjMoveStringLiteralDfa6_0(active0, 0L, active1, 0x1010000000000000L, active2, 0L);
       case 101:
          if ((active0 & 0x1000000000000L) != 0L)
          {
@@ -1622,19 +1642,19 @@ private int jjMoveStringLiteralDfa5_0(long old0, long active0, long old1, long a
             jjmatchedKind = 73;
             jjmatchedPos = 5;
          }
-         else if ((active2 & 0x800L) != 0L)
+         else if ((active2 & 0x2000L) != 0L)
          {
-            jjmatchedKind = 139;
+            jjmatchedKind = 141;
             jjmatchedPos = 5;
          }
-         else if ((active2 & 0x20000L) != 0L)
+         else if ((active2 & 0x80000L) != 0L)
          {
-            jjmatchedKind = 145;
+            jjmatchedKind = 147;
             jjmatchedPos = 5;
          }
-         return jjMoveStringLiteralDfa6_0(active0, 0x1000000L, active1, 0x200800b00400000L, active2, 0L);
+         return jjMoveStringLiteralDfa6_0(active0, 0x1000000L, active1, 0x802000b00400000L, active2, 0L);
       case 102:
-         return jjMoveStringLiteralDfa6_0(active0, 0L, active1, 0x8000000000000L, active2, 0L);
+         return jjMoveStringLiteralDfa6_0(active0, 0L, active1, 0x20000000000000L, active2, 0L);
       case 103:
          if ((active0 & 0x200000000000000L) != 0L)
          {
@@ -1643,23 +1663,23 @@ private int jjMoveStringLiteralDfa5_0(long old0, long active0, long old1, long a
          }
          break;
       case 105:
-         return jjMoveStringLiteralDfa6_0(active0, 0x4000000L, active1, 0x8001000000000000L, active2, 0L);
+         return jjMoveStringLiteralDfa6_0(active0, 0x4000000L, active1, 0x4000000000000L, active2, 0x2L);
       case 108:
-         return jjMoveStringLiteralDfa6_0(active0, 0L, active1, 0L, active2, 0x4000000L);
+         return jjMoveStringLiteralDfa6_0(active0, 0L, active1, 0L, active2, 0x10000000L);
       case 110:
          if ((active1 & 0x2L) != 0L)
          {
             jjmatchedKind = 65;
             jjmatchedPos = 5;
          }
-         else if ((active1 & 0x80000000000L) != 0L)
+         else if ((active1 & 0x200000000000L) != 0L)
          {
-            jjmatchedKind = 107;
+            jjmatchedKind = 109;
             jjmatchedPos = 5;
          }
          return jjMoveStringLiteralDfa6_0(active0, 0x40000800000L, active1, 0x81000040L, active2, 0L);
       case 111:
-         return jjMoveStringLiteralDfa6_0(active0, 0L, active1, 0x800000000000100L, active2, 0x1L);
+         return jjMoveStringLiteralDfa6_0(active0, 0L, active1, 0x2000000000000100L, active2, 0x4L);
       case 112:
          return jjMoveStringLiteralDfa6_0(active0, 0x2000000000000L, active1, 0L, active2, 0L);
       case 114:
@@ -1668,9 +1688,9 @@ private int jjMoveStringLiteralDfa5_0(long old0, long active0, long old1, long a
             jjmatchedKind = 75;
             jjmatchedPos = 5;
          }
-         else if ((active1 & 0x40000000000L) != 0L)
+         else if ((active1 & 0x100000000000L) != 0L)
          {
-            jjmatchedKind = 106;
+            jjmatchedKind = 108;
             jjmatchedPos = 5;
          }
          return jjMoveStringLiteralDfa6_0(active0, 0x8000000L, active1, 0L, active2, 0L);
@@ -1702,22 +1722,22 @@ private int jjMoveStringLiteralDfa5_0(long old0, long active0, long old1, long a
             jjmatchedKind = 52;
             jjmatchedPos = 5;
          }
-         else if ((active1 & 0x20000000000L) != 0L)
+         else if ((active1 & 0x80000000000L) != 0L)
          {
-            jjmatchedKind = 105;
+            jjmatchedKind = 107;
             jjmatchedPos = 5;
          }
-         else if ((active2 & 0x400L) != 0L)
+         else if ((active2 & 0x1000L) != 0L)
          {
-            jjmatchedKind = 138;
+            jjmatchedKind = 140;
             jjmatchedPos = 5;
          }
-         else if ((active2 & 0x400000L) != 0L)
+         else if ((active2 & 0x1000000L) != 0L)
          {
-            jjmatchedKind = 150;
+            jjmatchedKind = 152;
             jjmatchedPos = 5;
          }
-         return jjMoveStringLiteralDfa6_0(active0, 0L, active1, 0x10000000000000L, active2, 0L);
+         return jjMoveStringLiteralDfa6_0(active0, 0L, active1, 0x40000000000000L, active2, 0L);
       case 120:
          if ((active0 & 0x200000L) != 0L)
          {
@@ -1753,9 +1773,9 @@ private int jjMoveStringLiteralDfa6_0(long old0, long active0, long old1, long a
             jjmatchedKind = 24;
             jjmatchedPos = 6;
          }
-         else if ((active1 & 0x8000000000000000L) != 0L)
+         else if ((active2 & 0x2L) != 0L)
          {
-            jjmatchedKind = 127;
+            jjmatchedKind = 129;
             jjmatchedPos = 6;
          }
          break;
@@ -1765,12 +1785,12 @@ private int jjMoveStringLiteralDfa6_0(long old0, long active0, long old1, long a
             jjmatchedKind = 46;
             jjmatchedPos = 6;
          }
-         else if ((active1 & 0x100000000000L) != 0L)
+         else if ((active1 & 0x400000000000L) != 0L)
          {
-            jjmatchedKind = 108;
+            jjmatchedKind = 110;
             jjmatchedPos = 6;
          }
-         return jjMoveStringLiteralDfa7_0(active0, 0L, active1, 0x10000000000000L, active2, 0L);
+         return jjMoveStringLiteralDfa7_0(active0, 0L, active1, 0x40000000000000L, active2, 0L);
       case 71:
          if ((active1 & 0x1000000L) != 0L)
          {
@@ -1790,14 +1810,14 @@ private int jjMoveStringLiteralDfa6_0(long old0, long active0, long old1, long a
       case 77:
          return jjMoveStringLiteralDfa7_0(active0, 0L, active1, 0x80L, active2, 0L);
       case 78:
-         if ((active2 & 0x1L) != 0L)
+         if ((active2 & 0x4L) != 0L)
          {
-            jjmatchedKind = 128;
+            jjmatchedKind = 130;
             jjmatchedPos = 6;
          }
-         return jjMoveStringLiteralDfa7_0(active0, 0L, active1, 0x801000000000000L, active2, 0L);
+         return jjMoveStringLiteralDfa7_0(active0, 0L, active1, 0x2004000000000000L, active2, 0L);
       case 79:
-         return jjMoveStringLiteralDfa7_0(active0, 0L, active1, 0x8000000000000L, active2, 0L);
+         return jjMoveStringLiteralDfa7_0(active0, 0L, active1, 0x20000000000000L, active2, 0L);
       case 80:
          if ((active1 & 0x100L) != 0L)
          {
@@ -1806,21 +1826,21 @@ private int jjMoveStringLiteralDfa6_0(long old0, long active0, long old1, long a
          }
          return jjMoveStringLiteralDfa7_0(active0, 0L, active1, 0x4000020L, active2, 0L);
       case 82:
-         return jjMoveStringLiteralDfa7_0(active0, 0L, active1, 0x2000b00000000L, active2, 0L);
+         return jjMoveStringLiteralDfa7_0(active0, 0L, active1, 0x8000b00000000L, active2, 0L);
       case 83:
-         if ((active1 & 0x4000000000000L) != 0L)
+         if ((active1 & 0x10000000000000L) != 0L)
          {
-            jjmatchedKind = 114;
+            jjmatchedKind = 116;
             jjmatchedPos = 6;
          }
-         else if ((active1 & 0x200000000000000L) != 0L)
+         else if ((active1 & 0x800000000000000L) != 0L)
          {
-            jjmatchedKind = 121;
+            jjmatchedKind = 123;
             jjmatchedPos = 6;
          }
-         else if ((active1 & 0x400000000000000L) != 0L)
+         else if ((active1 & 0x1000000000000000L) != 0L)
          {
-            jjmatchedKind = 122;
+            jjmatchedKind = 124;
             jjmatchedPos = 6;
          }
          return jjMoveStringLiteralDfa7_0(active0, 0L, active1, 0x400010L, active2, 0L);
@@ -1830,16 +1850,16 @@ private int jjMoveStringLiteralDfa6_0(long old0, long active0, long old1, long a
             jjmatchedKind = 50;
             jjmatchedPos = 6;
          }
-         else if ((active2 & 0x4000000L) != 0L)
+         else if ((active2 & 0x10000000L) != 0L)
          {
-            jjmatchedKind = 154;
+            jjmatchedKind = 156;
             jjmatchedPos = 6;
          }
          return jjMoveStringLiteralDfa7_0(active0, 0x400000000000000L, active1, 0x10000000L, active2, 0L);
       case 85:
          return jjMoveStringLiteralDfa7_0(active0, 0x8000000L, active1, 0L, active2, 0L);
       case 95:
-         return jjMoveStringLiteralDfa7_0(active0, 0L, active1, 0x800000000000L, active2, 0L);
+         return jjMoveStringLiteralDfa7_0(active0, 0L, active1, 0x2000000000000L, active2, 0L);
       case 97:
          return jjMoveStringLiteralDfa7_0(active0, 0x8040000000000L, active1, 0L, active2, 0L);
       case 98:
@@ -1852,9 +1872,9 @@ private int jjMoveStringLiteralDfa6_0(long old0, long active0, long old1, long a
             jjmatchedKind = 24;
             jjmatchedPos = 6;
          }
-         else if ((active1 & 0x8000000000000000L) != 0L)
+         else if ((active2 & 0x2L) != 0L)
          {
-            jjmatchedKind = 127;
+            jjmatchedKind = 129;
             jjmatchedPos = 6;
          }
          break;
@@ -1864,12 +1884,12 @@ private int jjMoveStringLiteralDfa6_0(long old0, long active0, long old1, long a
             jjmatchedKind = 46;
             jjmatchedPos = 6;
          }
-         else if ((active1 & 0x100000000000L) != 0L)
+         else if ((active1 & 0x400000000000L) != 0L)
          {
-            jjmatchedKind = 108;
+            jjmatchedKind = 110;
             jjmatchedPos = 6;
          }
-         return jjMoveStringLiteralDfa7_0(active0, 0L, active1, 0x10000000000000L, active2, 0L);
+         return jjMoveStringLiteralDfa7_0(active0, 0L, active1, 0x40000000000000L, active2, 0L);
       case 103:
          if ((active1 & 0x1000000L) != 0L)
          {
@@ -1889,14 +1909,14 @@ private int jjMoveStringLiteralDfa6_0(long old0, long active0, long old1, long a
       case 109:
          return jjMoveStringLiteralDfa7_0(active0, 0L, active1, 0x80L, active2, 0L);
       case 110:
-         if ((active2 & 0x1L) != 0L)
+         if ((active2 & 0x4L) != 0L)
          {
-            jjmatchedKind = 128;
+            jjmatchedKind = 130;
             jjmatchedPos = 6;
          }
-         return jjMoveStringLiteralDfa7_0(active0, 0L, active1, 0x801000000000000L, active2, 0L);
+         return jjMoveStringLiteralDfa7_0(active0, 0L, active1, 0x2004000000000000L, active2, 0L);
       case 111:
-         return jjMoveStringLiteralDfa7_0(active0, 0L, active1, 0x8000000000000L, active2, 0L);
+         return jjMoveStringLiteralDfa7_0(active0, 0L, active1, 0x20000000000000L, active2, 0L);
       case 112:
          if ((active1 & 0x100L) != 0L)
          {
@@ -1905,21 +1925,21 @@ private int jjMoveStringLiteralDfa6_0(long old0, long active0, long old1, long a
          }
          return jjMoveStringLiteralDfa7_0(active0, 0L, active1, 0x4000020L, active2, 0L);
       case 114:
-         return jjMoveStringLiteralDfa7_0(active0, 0L, active1, 0x2000b00000000L, active2, 0L);
+         return jjMoveStringLiteralDfa7_0(active0, 0L, active1, 0x8000b00000000L, active2, 0L);
       case 115:
-         if ((active1 & 0x4000000000000L) != 0L)
+         if ((active1 & 0x10000000000000L) != 0L)
          {
-            jjmatchedKind = 114;
+            jjmatchedKind = 116;
             jjmatchedPos = 6;
          }
-         else if ((active1 & 0x200000000000000L) != 0L)
+         else if ((active1 & 0x800000000000000L) != 0L)
          {
-            jjmatchedKind = 121;
+            jjmatchedKind = 123;
             jjmatchedPos = 6;
          }
-         else if ((active1 & 0x400000000000000L) != 0L)
+         else if ((active1 & 0x1000000000000000L) != 0L)
          {
-            jjmatchedKind = 122;
+            jjmatchedKind = 124;
             jjmatchedPos = 6;
          }
          return jjMoveStringLiteralDfa7_0(active0, 0L, active1, 0x400010L, active2, 0L);
@@ -1929,9 +1949,9 @@ private int jjMoveStringLiteralDfa6_0(long old0, long active0, long old1, long a
             jjmatchedKind = 50;
             jjmatchedPos = 6;
          }
-         else if ((active2 & 0x4000000L) != 0L)
+         else if ((active2 & 0x10000000L) != 0L)
          {
-            jjmatchedKind = 154;
+            jjmatchedKind = 156;
             jjmatchedPos = 6;
          }
          return jjMoveStringLiteralDfa7_0(active0, 0x400000000000000L, active1, 0x10000000L, active2, 0L);
@@ -1981,14 +2001,14 @@ private int jjMoveStringLiteralDfa7_0(long old0, long active0, long old1, long a
             jjmatchedKind = 90;
             jjmatchedPos = 7;
          }
-         else if ((active1 & 0x800000000000000L) != 0L)
+         else if ((active1 & 0x2000000000000000L) != 0L)
          {
-            jjmatchedKind = 123;
+            jjmatchedKind = 125;
             jjmatchedPos = 7;
          }
          break;
       case 70:
-         return jjMoveStringLiteralDfa8_0(active0, 0L, active1, 0x800000000000L);
+         return jjMoveStringLiteralDfa8_0(active0, 0L, active1, 0x2000000000000L);
       case 73:
          return jjMoveStringLiteralDfa8_0(active0, 0L, active1, 0x200000000L);
       case 76:
@@ -2015,16 +2035,16 @@ private int jjMoveStringLiteralDfa7_0(long old0, long active0, long old1, long a
          }
          break;
       case 82:
-         if ((active1 & 0x10000000000000L) != 0L)
+         if ((active1 & 0x40000000000000L) != 0L)
          {
-            jjmatchedKind = 116;
+            jjmatchedKind = 118;
             jjmatchedPos = 7;
          }
-         return jjMoveStringLiteralDfa8_0(active0, 0L, active1, 0x8000000000000L);
+         return jjMoveStringLiteralDfa8_0(active0, 0L, active1, 0x20000000000000L);
       case 83:
-         if ((active1 & 0x1000000000000L) != 0L)
+         if ((active1 & 0x4000000000000L) != 0L)
          {
-            jjmatchedKind = 112;
+            jjmatchedKind = 114;
             jjmatchedPos = 7;
          }
          break;
@@ -2039,7 +2059,7 @@ private int jjMoveStringLiteralDfa7_0(long old0, long active0, long old1, long a
             jjmatchedKind = 86;
             jjmatchedPos = 7;
          }
-         return jjMoveStringLiteralDfa8_0(active0, 0x8000000000000L, active1, 0x2000000000000L);
+         return jjMoveStringLiteralDfa8_0(active0, 0x8000000000000L, active1, 0x8000000000000L);
       case 97:
          return jjMoveStringLiteralDfa8_0(active0, 0L, active1, 0x100000010L);
       case 99:
@@ -2070,14 +2090,14 @@ private int jjMoveStringLiteralDfa7_0(long old0, long active0, long old1, long a
             jjmatchedKind = 90;
             jjmatchedPos = 7;
          }
-         else if ((active1 & 0x800000000000000L) != 0L)
+         else if ((active1 & 0x2000000000000000L) != 0L)
          {
-            jjmatchedKind = 123;
+            jjmatchedKind = 125;
             jjmatchedPos = 7;
          }
          break;
       case 102:
-         return jjMoveStringLiteralDfa8_0(active0, 0L, active1, 0x800000000000L);
+         return jjMoveStringLiteralDfa8_0(active0, 0L, active1, 0x2000000000000L);
       case 105:
          return jjMoveStringLiteralDfa8_0(active0, 0L, active1, 0x200000000L);
       case 108:
@@ -2104,16 +2124,16 @@ private int jjMoveStringLiteralDfa7_0(long old0, long active0, long old1, long a
          }
          break;
       case 114:
-         if ((active1 & 0x10000000000000L) != 0L)
+         if ((active1 & 0x40000000000000L) != 0L)
          {
-            jjmatchedKind = 116;
+            jjmatchedKind = 118;
             jjmatchedPos = 7;
          }
-         return jjMoveStringLiteralDfa8_0(active0, 0L, active1, 0x8000000000000L);
+         return jjMoveStringLiteralDfa8_0(active0, 0L, active1, 0x20000000000000L);
       case 115:
-         if ((active1 & 0x1000000000000L) != 0L)
+         if ((active1 & 0x4000000000000L) != 0L)
          {
-            jjmatchedKind = 112;
+            jjmatchedKind = 114;
             jjmatchedPos = 7;
          }
          break;
@@ -2128,7 +2148,7 @@ private int jjMoveStringLiteralDfa7_0(long old0, long active0, long old1, long a
             jjmatchedKind = 86;
             jjmatchedPos = 7;
          }
-         return jjMoveStringLiteralDfa8_0(active0, 0x8000000000000L, active1, 0x2000000000000L);
+         return jjMoveStringLiteralDfa8_0(active0, 0x8000000000000L, active1, 0x8000000000000L);
       default :
          break;
    }
@@ -2156,9 +2176,9 @@ private int jjMoveStringLiteralDfa8_0(long old0, long active0, long old1, long a
             jjmatchedKind = 51;
             jjmatchedPos = 8;
          }
-         else if ((active1 & 0x8000000000000L) != 0L)
+         else if ((active1 & 0x20000000000000L) != 0L)
          {
-            jjmatchedKind = 115;
+            jjmatchedKind = 117;
             jjmatchedPos = 8;
          }
          break;
@@ -2176,7 +2196,7 @@ private int jjMoveStringLiteralDfa8_0(long old0, long active0, long old1, long a
       case 78:
          return jjMoveStringLiteralDfa9_0(active0, 0L, active1, 0x400L);
       case 79:
-         return jjMoveStringLiteralDfa9_0(active0, 0L, active1, 0x800000000000L);
+         return jjMoveStringLiteralDfa9_0(active0, 0L, active1, 0x2000000000000L);
       case 80:
          if ((active1 & 0x20L) != 0L)
          {
@@ -2192,9 +2212,9 @@ private int jjMoveStringLiteralDfa8_0(long old0, long active0, long old1, long a
          }
          break;
       case 83:
-         if ((active1 & 0x2000000000000L) != 0L)
+         if ((active1 & 0x8000000000000L) != 0L)
          {
-            jjmatchedKind = 113;
+            jjmatchedKind = 115;
             jjmatchedPos = 8;
          }
          break;
@@ -2218,9 +2238,9 @@ private int jjMoveStringLiteralDfa8_0(long old0, long active0, long old1, long a
             jjmatchedKind = 51;
             jjmatchedPos = 8;
          }
-         else if ((active1 & 0x8000000000000L) != 0L)
+         else if ((active1 & 0x20000000000000L) != 0L)
          {
-            jjmatchedKind = 115;
+            jjmatchedKind = 117;
             jjmatchedPos = 8;
          }
          break;
@@ -2238,7 +2258,7 @@ private int jjMoveStringLiteralDfa8_0(long old0, long active0, long old1, long a
       case 110:
          return jjMoveStringLiteralDfa9_0(active0, 0L, active1, 0x400L);
       case 111:
-         return jjMoveStringLiteralDfa9_0(active0, 0L, active1, 0x800000000000L);
+         return jjMoveStringLiteralDfa9_0(active0, 0L, active1, 0x2000000000000L);
       case 112:
          if ((active1 & 0x20L) != 0L)
          {
@@ -2254,9 +2274,9 @@ private int jjMoveStringLiteralDfa8_0(long old0, long active0, long old1, long a
          }
          break;
       case 115:
-         if ((active1 & 0x2000000000000L) != 0L)
+         if ((active1 & 0x8000000000000L) != 0L)
          {
-            jjmatchedKind = 113;
+            jjmatchedKind = 115;
             jjmatchedPos = 8;
          }
          break;
@@ -2293,7 +2313,7 @@ private int jjMoveStringLiteralDfa9_0(long old0, long active0, long old1, long a
          }
          break;
       case 82:
-         return jjMoveStringLiteralDfa10_0(active1, 0x800000000000L);
+         return jjMoveStringLiteralDfa10_0(active1, 0x2000000000000L);
       case 99:
          return jjMoveStringLiteralDfa10_0(active1, 0x400L);
       case 101:
@@ -2306,7 +2326,7 @@ private int jjMoveStringLiteralDfa9_0(long old0, long active0, long old1, long a
          }
          break;
       case 114:
-         return jjMoveStringLiteralDfa10_0(active1, 0x800000000000L);
+         return jjMoveStringLiteralDfa10_0(active1, 0x2000000000000L);
       default :
          break;
    }
@@ -2331,7 +2351,7 @@ private int jjMoveStringLiteralDfa10_0(long old1, long active1){
          }
          break;
       case 95:
-         return jjMoveStringLiteralDfa11_0(active1, 0x800000000000L);
+         return jjMoveStringLiteralDfa11_0(active1, 0x2000000000000L);
       case 97:
          return jjMoveStringLiteralDfa11_0(active1, 0x400L);
       case 115:
@@ -2363,7 +2383,7 @@ private int jjMoveStringLiteralDfa11_0(long old1, long active1){
          }
          break;
       case 85:
-         return jjMoveStringLiteralDfa12_0(active1, 0x800000000000L);
+         return jjMoveStringLiteralDfa12_0(active1, 0x2000000000000L);
       case 116:
          if ((active1 & 0x400L) != 0L)
          {
@@ -2372,7 +2392,7 @@ private int jjMoveStringLiteralDfa11_0(long old1, long active1){
          }
          break;
       case 117:
-         return jjMoveStringLiteralDfa12_0(active1, 0x800000000000L);
+         return jjMoveStringLiteralDfa12_0(active1, 0x2000000000000L);
       default :
          break;
    }
@@ -2388,9 +2408,9 @@ private int jjMoveStringLiteralDfa12_0(long old1, long active1){
    switch(curChar)
    {
       case 82:
-         return jjMoveStringLiteralDfa13_0(active1, 0x800000000000L);
+         return jjMoveStringLiteralDfa13_0(active1, 0x2000000000000L);
       case 114:
-         return jjMoveStringLiteralDfa13_0(active1, 0x800000000000L);
+         return jjMoveStringLiteralDfa13_0(active1, 0x2000000000000L);
       default :
          break;
    }
@@ -2406,16 +2426,16 @@ private int jjMoveStringLiteralDfa13_0(long old1, long active1){
    switch(curChar)
    {
       case 73:
-         if ((active1 & 0x800000000000L) != 0L)
+         if ((active1 & 0x2000000000000L) != 0L)
          {
-            jjmatchedKind = 111;
+            jjmatchedKind = 113;
             jjmatchedPos = 13;
          }
          break;
       case 105:
-         if ((active1 & 0x800000000000L) != 0L)
+         if ((active1 & 0x2000000000000L) != 0L)
          {
-            jjmatchedKind = 111;
+            jjmatchedKind = 113;
             jjmatchedPos = 13;
          }
          break;
@@ -2494,8 +2514,8 @@ private int jjMoveNfa_0(int startState, int curPos)
                case 0:
                   if ((0x3ff000000000000L & l) != 0L)
                   {
-                     if (kind > 159)
-                        kind = 159;
+                     if (kind > 161)
+                        kind = 161;
                      { jjCheckNAddStates(0, 6); }
                   }
                   else if (curChar == 45)
@@ -2684,8 +2704,8 @@ private int jjMoveNfa_0(int startState, int curPos)
                      jjstateSet[jjnewStateCnt++] = 57;
                   break;
                case 65:
-                  if ((0x8400000000L & l) != 0L && kind > 171)
-                     kind = 171;
+                  if ((0x8400000000L & l) != 0L && kind > 173)
+                     kind = 173;
                   break;
                case 66:
                   if (curChar == 39)
@@ -2696,8 +2716,8 @@ private int jjMoveNfa_0(int startState, int curPos)
                      { jjCheckNAddStates(37, 39); }
                   break;
                case 68:
-                  if (curChar == 39 && kind > 175)
-                     kind = 175;
+                  if (curChar == 39 && kind > 177)
+                     kind = 177;
                   break;
                case 70:
                   if ((0x8400000000L & l) != 0L)
@@ -2753,8 +2773,8 @@ private int jjMoveNfa_0(int startState, int curPos)
                      { jjCheckNAddStates(34, 36); }
                   break;
                case 86:
-                  if (curChar == 34 && kind > 176)
-                     kind = 176;
+                  if (curChar == 34 && kind > 178)
+                     kind = 178;
                   break;
                case 88:
                   if ((0x8400000000L & l) != 0L)
@@ -2864,8 +2884,8 @@ private int jjMoveNfa_0(int startState, int curPos)
                      jjstateSet[jjnewStateCnt++] = 121;
                   break;
                case 122:
-                  if (curChar == 39 && kind > 177)
-                     kind = 177;
+                  if (curChar == 39 && kind > 179)
+                     kind = 179;
                   break;
                case 123:
                   if (curChar == 39)
@@ -2942,8 +2962,8 @@ private int jjMoveNfa_0(int startState, int curPos)
                      jjstateSet[jjnewStateCnt++] = 145;
                   break;
                case 146:
-                  if (curChar == 34 && kind > 178)
-                     kind = 178;
+                  if (curChar == 34 && kind > 180)
+                     kind = 180;
                   break;
                case 147:
                   if (curChar == 34)
@@ -2978,8 +2998,8 @@ private int jjMoveNfa_0(int startState, int curPos)
                      { jjCheckNAddStates(21, 23); }
                   break;
                case 155:
-                  if (curChar == 41 && kind > 181)
-                     kind = 181;
+                  if (curChar == 41 && kind > 183)
+                     kind = 183;
                   break;
                case 156:
                   if (curChar == 10)
@@ -3160,15 +3180,15 @@ private int jjMoveNfa_0(int startState, int curPos)
                case 236:
                   if ((0x3ff000000000000L & l) == 0L)
                      break;
-                  if (kind > 159)
-                     kind = 159;
+                  if (kind > 161)
+                     kind = 161;
                   { jjCheckNAddStates(0, 6); }
                   break;
                case 237:
                   if ((0x3ff000000000000L & l) == 0L)
                      break;
-                  if (kind > 159)
-                     kind = 159;
+                  if (kind > 161)
+                     kind = 161;
                   { jjCheckNAdd(237); }
                   break;
                case 238:
@@ -3182,8 +3202,8 @@ private int jjMoveNfa_0(int startState, int curPos)
                case 240:
                   if ((0x3ff000000000000L & l) == 0L)
                      break;
-                  if (kind > 160)
-                     kind = 160;
+                  if (kind > 162)
+                     kind = 162;
                   { jjCheckNAdd(240); }
                   break;
                case 241:
@@ -3205,8 +3225,8 @@ private int jjMoveNfa_0(int startState, int curPos)
                case 246:
                   if ((0x3ff000000000000L & l) == 0L)
                      break;
-                  if (kind > 161)
-                     kind = 161;
+                  if (kind > 163)
+                     kind = 163;
                   { jjCheckNAdd(246); }
                   break;
                case 247:
@@ -3220,8 +3240,8 @@ private int jjMoveNfa_0(int startState, int curPos)
                case 250:
                   if ((0x3ff000000000000L & l) == 0L)
                      break;
-                  if (kind > 161)
-                     kind = 161;
+                  if (kind > 163)
+                     kind = 163;
                   { jjCheckNAdd(250); }
                   break;
                case 251:
@@ -3239,8 +3259,8 @@ private int jjMoveNfa_0(int startState, int curPos)
                case 255:
                   if ((0x3ff000000000000L & l) == 0L)
                      break;
-                  if (kind > 161)
-                     kind = 161;
+                  if (kind > 163)
+                     kind = 163;
                   { jjCheckNAdd(255); }
                   break;
                case 256:
@@ -3250,8 +3270,8 @@ private int jjMoveNfa_0(int startState, int curPos)
                case 257:
                   if ((0x3ff000000000000L & l) == 0L)
                      break;
-                  if (kind > 162)
-                     kind = 162;
+                  if (kind > 164)
+                     kind = 164;
                   { jjCheckNAdd(257); }
                   break;
                case 258:
@@ -3265,8 +3285,8 @@ private int jjMoveNfa_0(int startState, int curPos)
                case 260:
                   if ((0x3ff000000000000L & l) == 0L)
                      break;
-                  if (kind > 163)
-                     kind = 163;
+                  if (kind > 165)
+                     kind = 165;
                   { jjCheckNAdd(260); }
                   break;
                case 261:
@@ -3284,8 +3304,8 @@ private int jjMoveNfa_0(int startState, int curPos)
                case 265:
                   if ((0x3ff000000000000L & l) == 0L)
                      break;
-                  if (kind > 164)
-                     kind = 164;
+                  if (kind > 166)
+                     kind = 166;
                   { jjCheckNAdd(265); }
                   break;
                case 266:
@@ -3311,8 +3331,8 @@ private int jjMoveNfa_0(int startState, int curPos)
                case 272:
                   if ((0x3ff000000000000L & l) == 0L)
                      break;
-                  if (kind > 164)
-                     kind = 164;
+                  if (kind > 166)
+                     kind = 166;
                   { jjCheckNAdd(272); }
                   break;
                case 273:
@@ -3326,8 +3346,8 @@ private int jjMoveNfa_0(int startState, int curPos)
                case 276:
                   if ((0x3ff000000000000L & l) == 0L)
                      break;
-                  if (kind > 164)
-                     kind = 164;
+                  if (kind > 166)
+                     kind = 166;
                   { jjCheckNAdd(276); }
                   break;
                case 277:
@@ -3337,8 +3357,8 @@ private int jjMoveNfa_0(int startState, int curPos)
                case 278:
                   if ((0x3ff000000000000L & l) == 0L)
                      break;
-                  if (kind > 165)
-                     kind = 165;
+                  if (kind > 167)
+                     kind = 167;
                   { jjCheckNAdd(278); }
                   break;
                case 279:
@@ -3352,8 +3372,8 @@ private int jjMoveNfa_0(int startState, int curPos)
                case 281:
                   if ((0x3ff000000000000L & l) == 0L)
                      break;
-                  if (kind > 166)
-                     kind = 166;
+                  if (kind > 168)
+                     kind = 168;
                   { jjCheckNAdd(281); }
                   break;
                case 282:
@@ -3371,8 +3391,8 @@ private int jjMoveNfa_0(int startState, int curPos)
                case 286:
                   if ((0x3ff000000000000L & l) == 0L)
                      break;
-                  if (kind > 167)
-                     kind = 167;
+                  if (kind > 169)
+                     kind = 169;
                   { jjCheckNAdd(286); }
                   break;
                case 287:
@@ -3398,8 +3418,8 @@ private int jjMoveNfa_0(int startState, int curPos)
                case 293:
                   if ((0x3ff000000000000L & l) == 0L)
                      break;
-                  if (kind > 167)
-                     kind = 167;
+                  if (kind > 169)
+                     kind = 169;
                   { jjCheckNAdd(293); }
                   break;
                case 294:
@@ -3413,8 +3433,8 @@ private int jjMoveNfa_0(int startState, int curPos)
                case 297:
                   if ((0x3ff000000000000L & l) == 0L)
                      break;
-                  if (kind > 167)
-                     kind = 167;
+                  if (kind > 169)
+                     kind = 169;
                   { jjCheckNAdd(297); }
                   break;
                default : break;
@@ -3567,8 +3587,8 @@ private int jjMoveNfa_0(int startState, int curPos)
                   { jjCheckNAddStates(45, 50); }
                   break;
                case 53:
-                  if ((0x200000002L & l) != 0L && kind > 140)
-                     kind = 140;
+                  if ((0x200000002L & l) != 0L && kind > 142)
+                     kind = 142;
                   break;
                case 54:
                   if ((0x10000000100000L & l) != 0L)
@@ -3607,8 +3627,8 @@ private int jjMoveNfa_0(int startState, int curPos)
                      jjstateSet[jjnewStateCnt++] = 65;
                   break;
                case 65:
-                  if ((0x14404410000000L & l) != 0L && kind > 171)
-                     kind = 171;
+                  if ((0x14404410000000L & l) != 0L && kind > 173)
+                     kind = 173;
                   break;
                case 67:
                   if ((0xffffffffefffffffL & l) != 0L)
@@ -3865,8 +3885,8 @@ private int jjMoveNfa_0(int startState, int curPos)
                   { jjCheckNAddStates(72, 77); }
                   break;
                case 163:
-                  if (curChar == 93 && kind > 186)
-                     kind = 186;
+                  if (curChar == 93 && kind > 188)
+                     kind = 188;
                   break;
                case 166:
                   if ((0x7fffffe07fffffeL & l) != 0L)
@@ -3965,8 +3985,8 @@ private int jjMoveNfa_0(int startState, int curPos)
                   { jjCheckNAddStates(94, 99); }
                   break;
                case 210:
-                  if ((0x200000002L & l) != 0L && kind > 141)
-                     kind = 141;
+                  if ((0x200000002L & l) != 0L && kind > 143)
+                     kind = 143;
                   break;
                case 211:
                   if ((0x10000000100000L & l) != 0L)
@@ -4004,8 +4024,8 @@ private int jjMoveNfa_0(int startState, int curPos)
                   { jjCheckNAddStates(103, 108); }
                   break;
                case 225:
-                  if ((0x2000000020L & l) != 0L && kind > 142)
-                     kind = 142;
+                  if ((0x2000000020L & l) != 0L && kind > 144)
+                     kind = 144;
                   break;
                case 226:
                   if ((0x4000000040000L & l) != 0L)
@@ -4708,8 +4728,8 @@ null, null, null, null, null, null, null, null, null, null, null, null, null, nu
 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, null, null, null, null, null, null, null, null, null, null, 
-null, null, null, null, null, null, null, null, null, null, null, null, "\50", 
-"\51", null, "\173", "\175", "\133", "\135", null, "\73", "\54", "\56", "\75", 
+null, null, null, null, null, null, null, null, null, null, null, null, null, null, 
+"\50", "\51", null, "\173", "\175", "\133", "\135", null, "\73", "\54", "\56", "\75", 
 "\41\75", "\76", "\74", "\74\75", "\76\75", "\76\76", "\74\74", "\173\174", "\174\175", 
 "\41", "\176", "\72", "\174\174", "\46\46", "\53", "\55", "\52", "\57", "\136\136", 
 "\100", "\72\75", "\174", "\136", "\55\76", "\74\55", "\77", null, null, null, null, 
@@ -4900,7 +4920,7 @@ public static final String[] lexStateNames = {
    "DEFAULT",
 };
 static final long[] jjtoToken = {
-   0xfffffffffff9fe01L, 0xffffffffffffffffL, 0xffff88ffbfffffffL, 0x1ffffffL, 
+   0xfffffffffff9fe01L, 0xffffffffffffffffL, 0xfffe23feffffffffL, 0x7ffffffL, 
 };
 static final long[] jjtoSkip = {
    0x7eL, 0x0L, 0x0L, 0x0L, 
diff --git a/jena-arq/src/main/java/org/apache/jena/sparql/sse/Tags.java b/jena-arq/src/main/java/org/apache/jena/sparql/sse/Tags.java
index 9493fb2..9f96300 100644
--- a/jena-arq/src/main/java/org/apache/jena/sparql/sse/Tags.java
+++ b/jena-arq/src/main/java/org/apache/jena/sparql/sse/Tags.java
@@ -148,6 +148,9 @@ public class Tags
     public static final String symDiv             = "/" ;
     public static final String tagDivide          = "divide" ;
 
+    public static final String tagMod             = "mod" ;
+    public static final String tagIDiv            = "idiv" ;
+
     public static final String symNot             = "!" ;
     public static final String tagNot             = "not" ;
     public static final String tagStr             = "str" ;
diff --git a/jena-arq/src/main/java/org/apache/jena/sparql/sse/builders/BuilderExpr.java b/jena-arq/src/main/java/org/apache/jena/sparql/sse/builders/BuilderExpr.java
index 5e7ba5b..5167072 100644
--- a/jena-arq/src/main/java/org/apache/jena/sparql/sse/builders/BuilderExpr.java
+++ b/jena-arq/src/main/java/org/apache/jena/sparql/sse/builders/BuilderExpr.java
@@ -351,6 +351,20 @@ public class BuilderExpr
         return new E_Divide(left, right);
     };
 
+    private static Build buildIDiv = (ItemList list) -> {
+        BuilderLib.checkLength(3, list, "idiv: wanted 2 arguments: got :"+numArgs(list));
+        Expr left = buildExpr(list.get(1));
+        Expr right = buildExpr(list.get(2));
+        return new E_OpNumericIntegerDivide(left, right);
+    };
+
+    private static Build buildMod = (ItemList list) -> {
+        BuilderLib.checkLength(3, list, "mod: wanted 2 arguments: got :"+numArgs(list));
+        Expr left = buildExpr(list.get(1));
+        Expr right = buildExpr(list.get(2));
+        return new E_OpNumericMod(left, right);
+    };
+
     private static Build buildNot = (ItemList list) -> {
         BuilderLib.checkLength(2, list, "!: wanted 1 arguments: got :"+numArgs(list));
         Expr ex = buildExpr(list.get(1));
@@ -933,6 +947,9 @@ public class BuilderExpr
         dispatch.put(Tags.symDiv, buildDiv);
         dispatch.put(Tags.tagDivide, buildDiv);
 
+        dispatch.put(Tags.tagIDiv, buildIDiv);
+        dispatch.put(Tags.tagMod, buildMod);
+
         dispatch.put(Tags.tagNot, buildNot);   // Same builders for (not ..) and (! ..)
         dispatch.put(Tags.symNot, buildNot);
 
diff --git a/jena-arq/src/test/java/org/apache/jena/sparql/expr/LibTestExpr.java b/jena-arq/src/test/java/org/apache/jena/sparql/expr/LibTestExpr.java
index 7359f2d..622b58b 100644
--- a/jena-arq/src/test/java/org/apache/jena/sparql/expr/LibTestExpr.java
+++ b/jena-arq/src/test/java/org/apache/jena/sparql/expr/LibTestExpr.java
@@ -29,6 +29,7 @@ import org.apache.jena.sparql.ARQConstants;
 import org.apache.jena.sparql.function.FunctionEnv;
 import org.apache.jena.sparql.function.FunctionEnvBase;
 import org.apache.jena.sparql.function.library.leviathan.LeviathanConstants;
+import org.apache.jena.sparql.sse.SSE;
 import org.apache.jena.sparql.util.Context;
 import org.apache.jena.sparql.util.ExprUtils;
 import org.apache.jena.sparql.util.NodeFactoryExtra;
@@ -71,6 +72,15 @@ public class LibTestExpr {
         test(exprStr, rExpected);
     }
 
+    /** SSE syntax */
+    public static void testSSE(String functionExprStr, String exprStrExpected) {
+        Expr expected = SSE.parseExpr(exprStrExpected) ;
+        NodeValue vExpected = expected.eval(null, LibTestExpr.createTest());
+        Expr actual = SSE.parseExpr(functionExprStr) ;
+        NodeValue vActual = expected.eval(null, LibTestExpr.createTest());
+        assertTrue("Expected = " + expected + " : Actual = " + actual, sameValueSameDatatype(vExpected, vActual));
+    }
+
     public static void test(String exprString, Node result) {
         NodeValue expected = NodeValue.makeNode(result);
         test(exprString, expected);
@@ -79,7 +89,18 @@ public class LibTestExpr {
     public static void test(String exprStr, NodeValue expected) {
         Expr expr = parse(exprStr);
         NodeValue actual = expr.eval(null, LibTestExpr.createTest());
-        assertTrue("Expected = " + expected + " : Actual = " + actual, NodeValue.sameAs(expected, actual));
+        assertTrue("Expected = " + expected + " : Actual = " + actual, sameValueSameDatatype(expected, actual));
+    }
+
+    private static boolean sameValueSameDatatype(NodeValue nv1, NodeValue nv2) {
+        if ( ! NodeValue.sameAs(nv1, nv2) )
+            return false;
+        Node n1 = nv1.asNode();
+        Node n2 = nv2.asNode();
+        if ( ! n1.isLiteral() || ! n2.isLiteral() )
+            // URIs, bnodes etc because the sameAs test passed ...
+            return true;
+        return nv1.asNode().getLiteralDatatype().equals(nv2.asNode().getLiteralDatatype());
     }
 
     public static void test(String exprStr) {
@@ -105,7 +126,6 @@ public class LibTestExpr {
         // between how things like doubles are expressed
         if (NodeValue.sameAs(expected, actual))
             return;
-
         testDouble(exprString, expected.getDouble(), delta);;
     }
 
diff --git a/jena-arq/src/test/java/org/apache/jena/sparql/expr/TS_Expr.java b/jena-arq/src/test/java/org/apache/jena/sparql/expr/TS_Expr.java
index 5ada19b..c1368bd 100644
--- a/jena-arq/src/test/java/org/apache/jena/sparql/expr/TS_Expr.java
+++ b/jena-arq/src/test/java/org/apache/jena/sparql/expr/TS_Expr.java
@@ -31,6 +31,7 @@ import org.junit.runners.Suite.SuiteClasses;
     , TestExpressions.class
     , TestExpressions2.class
     , TestExpressions3.class
+    , TestExpressions4.class
     , TestCastXSD.class
     , TestNodeFunctions.class
     , TestExpressionsMath.class
diff --git a/jena-arq/src/test/java/org/apache/jena/sparql/expr/TestExpressions.java b/jena-arq/src/test/java/org/apache/jena/sparql/expr/TestExpressions.java
index d5336f2..e71001a 100644
--- a/jena-arq/src/test/java/org/apache/jena/sparql/expr/TestExpressions.java
+++ b/jena-arq/src/test/java/org/apache/jena/sparql/expr/TestExpressions.java
@@ -369,6 +369,8 @@ public class TestExpressions
     @Test public void testBoolean_152() { testBoolean("<"+xsd+"double>(str('3')) = 3", true) ; }
 
     @Test public void testString_23()   { testString("'a'+'b'", "ab") ; }
+
+    // Not strict
     @Test(expected=ExprEvalException.class)
     public void testString_24()         { testString("'a'+12") ; }
     public void testString_25()         { testString("12+'a'") ; }
diff --git a/jena-arq/src/test/java/org/apache/jena/sparql/expr/TestExpressions3.java b/jena-arq/src/test/java/org/apache/jena/sparql/expr/TestExpressions3.java
index 22e95d2..3246102 100644
--- a/jena-arq/src/test/java/org/apache/jena/sparql/expr/TestExpressions3.java
+++ b/jena-arq/src/test/java/org/apache/jena/sparql/expr/TestExpressions3.java
@@ -28,7 +28,7 @@ import org.apache.jena.sparql.sse.builders.BuilderBinding ;
 import org.apache.jena.sparql.util.ExprUtils ;
 import org.junit.Test ;
 
-/** Expression evaluation involving bindings. 
+/** Expression evaluation involving bindings.
 * @see TestExpressions
 * @see TestExpressions2
 * @see TestExpressions3
@@ -48,13 +48,13 @@ public class TestExpressions3
 
     // From SPARQL syntax
     private static void eval(String string, String bindingStr, boolean expected) {
-        Binding binding = binding(bindingStr) ; 
+        Binding binding = binding(bindingStr) ;
         Expr expr = ExprUtils.parse(string) ;
         NodeValue nv = expr.eval(binding, LibTestExpr.createTest()) ;
         boolean b = XSDFuncOp.booleanEffectiveValue(nv) ;
         assertEquals(string, expected, b) ;
     }
-    
+
     // From algebra/SSE
     private static void evalExpr(String exprString, String bindingStr, boolean expected) {
         Binding binding = binding(bindingStr) ;
@@ -69,6 +69,6 @@ public class TestExpressions3
             return null ;
         Item item = SSE.parse("(binding "+bindingStr+")") ;
         Binding binding = BuilderBinding.build(item) ;
-        return binding ;   
+        return binding ;
     }
 }
diff --git a/jena-arq/src/test/java/org/apache/jena/sparql/expr/TestExpressions4.java b/jena-arq/src/test/java/org/apache/jena/sparql/expr/TestExpressions4.java
new file mode 100644
index 0000000..0ae2fbb
--- /dev/null
+++ b/jena-arq/src/test/java/org/apache/jena/sparql/expr/TestExpressions4.java
@@ -0,0 +1,87 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.jena.sparql.expr;
+
+import static org.apache.jena.sparql.expr.LibTestExpr.test;
+import static org.apache.jena.sparql.expr.LibTestExpr.testSSE;
+
+import org.junit.Test;
+
+public class TestExpressions4 {
+
+    // ---- op:numeric-integer-divide
+    // Operator, function and fn:function, op:function forms.
+
+    @Test public void idiv_1()          { test("7 idiv 3", "2"); }
+    @Test public void idiv_2()          { test("idiv(7, 3)", "2"); }
+    @Test public void idiv_3()          { test("fn:numeric-integer-divide(7, 3)", "2"); }
+    @Test public void idiv_4()          { test("op:numeric-integer-divide(7, 3)", "2"); }
+    @Test public void idiv_5()          { testSSE("(idiv 7 3)", "2"); }
+
+    // Examples from F&O
+
+    @Test public void idiv_10() { test("IDIV(10 , 3)", "3"); }
+    @Test public void idiv_11() { test("IDIV(3 , -2)", "-1"); }
+    @Test public void idiv_12() { test("IDIV(-3 , 2)", "-1"); }
+    @Test public void idiv_13() { test("IDIV(-3 , -2)", "1"); }
+    @Test public void idiv_14() { test("IDIV(9.0 , 3)", "3"); }
+    @Test public void idiv_15() { test("IDIV(-3.5 , 3)", "-1"); }
+    @Test public void idiv_16() { test("IDIV(3.0 , 4)", "0"); }
+    @Test public void idiv_17() { test("IDIV(3.1E1 , 6)", "5"); }
+    @Test public void idiv_18() { test("IDIV(3.1E1 , 7)", "4"); }
+
+    @Test(expected = ExprEvalException.class)
+    public void idiv_20() { test("IDIV(3 , 0)", "4"); }
+    @Test(expected = ExprEvalException.class)
+    public void idiv_21() { test("IDIV(3.1 , 0.0)", "4"); }
+    @Test(expected = ExprEvalException.class)
+    public void idiv_22() { test("IDIV(3.1E1 , 0e0)", "4"); }
+
+    // ---- op:numeric-mod
+    // Operator, function and fn:function, op:function forms.
+
+    @Test public void mod_1()           { test("5 mod 3", "2"); }
+    @Test public void mod_2()           { test("mod(5, 3)", "2"); }
+    @Test public void mod_3()           { test("fn:numeric-mod(5, 3)", "2"); }
+    @Test public void mod_4()           { test("op:numeric-mod(5, 3)", "2"); }
+    @Test public void mod_5()           { testSSE("(mod 5 3)", "2"); }
+
+    // Examples from F&O
+    @Test public void mod_10() { test("MOD(10 , 3)", "1"); }
+    @Test public void mod_11() { test("MOD(6 , -2)", "0"); }
+    @Test public void mod_12() { test("MOD(4.5 , 1.2)", "0.9"); }
+    @Test public void mod_13() { test("MOD(1.23E2 , 0.6E1)", "3.0E0"); }
+
+    // Sign of result is sign of dividend (left argument)
+    @Test public void mod_14() { test("MOD(7 , -2)", "1"); }
+    @Test public void mod_15() { test("MOD(7.0 , -2.0)", "1.0"); }
+    @Test public void mod_16() { test("MOD(7e0 , -2e0)", "1.0e0"); }
+
+    @Test public void mod_17() { test("MOD(-7 , -2)", "-1"); }
+    @Test public void mod_18() { test("MOD(-7.0 , -2.0)", "-1.0"); }
+    @Test public void mod_19() { test("MOD(-7e0 , -2e0)", "-1.0e0"); }
+
+    @Test(expected = ExprEvalException.class)
+    public void mod_20() { test("MOD(123 , 0)", "3"); }
+    @Test(expected = ExprEvalException.class)
+    public void mod_21() { test("MOD(12.3 , 0.0)", "3.0"); }
+    @Test(expected = ExprEvalException.class)
+    public void mod_22() { test("MOD(1.23E2 , 0.0e0)", "3.0E0"); }
+
+}
diff --git a/jena-arq/src/test/java/org/apache/jena/sparql/expr/TestExpressionsMath.java b/jena-arq/src/test/java/org/apache/jena/sparql/expr/TestExpressionsMath.java
index 5d07a23..c323bb4 100644
--- a/jena-arq/src/test/java/org/apache/jena/sparql/expr/TestExpressionsMath.java
+++ b/jena-arq/src/test/java/org/apache/jena/sparql/expr/TestExpressionsMath.java
@@ -43,7 +43,7 @@ public class TestExpressionsMath
     @Test public void exp10_03()        { testDouble("math:exp10(2.0)", 100, 0.00001) ; }
     @Test public void exp10_04()        { test("math:exp10(0)", "1") ; }
     @Test public void exp10_05()        { testDouble("math:exp10('NaN'^^xsd:double)", Double.NaN, 0.0000001 ) ; }
-    
+
     @Test public void log_01()          { testDouble("math:log(1)", Math.log(1), 0.0000001 ) ; }
     @Test public void log_02()          { testDouble("math:log('NaN'^^xsd:double)", Double.NaN, 0.0000001 ) ; }
     @Test public void log_03()          { test("math:log('INF'^^xsd:double)", "'INF'^^xsd:double") ; }
@@ -51,44 +51,43 @@ public class TestExpressionsMath
     @Test public void log_05()          { test("math:exp('INF'^^xsd:double)", "'INF'^^xsd:double") ; }
     @Test public void log_06()          { test("math:exp('-INF'^^xsd:double)", "'0.0e0'^^xsd:double") ; }
     @Test public void log_07()          { test("math:exp('NaN'^^xsd:double)", "'NaN'^^xsd:double") ; }
-    
-    @Test public void pow_01()          { test("math:pow(2,2)", "4") ; } 
+
+    @Test public void pow_01()          { test("math:pow(2,2)", "4") ; }
     @Test public void pow_02()          { testDouble("math:pow(2,-2)", 0.25, 0.00001) ; }
     @Test public void pow_03()          { test("math:pow(2,0)", "1") ; }
-    
+
     @Test public void pow_10()          { test("math:pow('INF'^^xsd:double, 1)", "'INF'^^xsd:double") ; }
     @Test public void pow_11()          { test("math:pow(1, 'INF'^^xsd:double)", "1") ; }
     @Test public void pow_12()          { test("math:pow(1e0, 'INF'^^xsd:double)", "'1.0e0'^^xsd:double") ; }
-    
+
     @Test public void pow_13()          { test("math:pow('INF'^^xsd:double,0)", "'1.0e0'^^xsd:double") ; }
     @Test public void pow_14()          { test("math:pow('-INF'^^xsd:double, 0)", "'1.0e0'^^xsd:double") ; }
     @Test public void pow_15()          { test("math:pow('NaN'^^xsd:double, 1)", "'NaN'^^xsd:double") ; }
     @Test public void pow_16()          { test("math:pow(1, 'NaN'^^xsd:double)", "'NaN'^^xsd:double") ; }
-    
+
     @Test public void sqrt_01()         { test("math:sqrt(1)", "'1.0e0'^^xsd:double") ; }
     @Test public void sqrt_02()         { testDouble("math:sqrt(2)", Math.sqrt(2), 0.000001) ; }
     @Test public void sqrt_03()         { test("math:sqrt(-2)", "'NaN'^^xsd:double") ; }
-    
+
     @Test(expected=ARQException.class)
     public void sqrt_04()               { test("math:sqrt('TWO')", "'dummy'") ; }
-    
+
     @Test public void sqrt_10()         { test("math:sqrt('INF'^^xsd:double)", "'INF'^^xsd:double") ; }
     @Test public void sqrt_11()         { test("math:sqrt('-INF'^^xsd:double)", "'NaN'^^xsd:double") ; }
     @Test public void sqrt_12()         { test("math:sqrt('NaN'^^xsd:double)", "'NaN'^^xsd:double") ; }
 
     //  4.8.7 math:sqrt
-//  4.8.8 math:sin
-//  4.8.9 math:cos
-//  4.8.10 math:tan
-//  4.8.11 math:asin
-//  4.8.12 math:acos
-//  4.8.13 math:atan
-//  4.8.14 math:atan2
-    
-    
+    //  4.8.8 math:sin
+    //  4.8.9 math:cos
+    //  4.8.10 math:tan
+    //  4.8.11 math:asin
+    //  4.8.12 math:acos
+    //  4.8.13 math:atan
+    //  4.8.14 math:atan2
+
     // Yes - atan uses (Y,X)
     @Test public void atan2_01()        { testDouble("math:atan2(0,1)", "0.0e0", 0.00001) ; }
     @Test public void atan2_02()        { testDouble("math:atan2(1,0)", Math.PI/2, 0.00001) ; }
     @Test public void atan2_03()        { testDouble("math:atan2(2.0,0.0)", Math.PI/2, 0.00001) ; }
-    @Test public void atan2_04()        { testDouble("math:atan2(-2.0e1, 0.0)", - Math.PI/2, 0.00001) ; } 
+    @Test public void atan2_04()        { testDouble("math:atan2(-2.0e1, 0.0)", - Math.PI/2, 0.00001) ; }
 }
diff --git a/jena-arq/src/test/java/org/apache/jena/sparql/expr/TestLeviathanFunctions.java b/jena-arq/src/test/java/org/apache/jena/sparql/expr/TestLeviathanFunctions.java
index 920ea6a..6bbdda0 100644
--- a/jena-arq/src/test/java/org/apache/jena/sparql/expr/TestLeviathanFunctions.java
+++ b/jena-arq/src/test/java/org/apache/jena/sparql/expr/TestLeviathanFunctions.java
@@ -120,12 +120,12 @@ public class TestLeviathanFunctions {
 
     @Test
     public void log_01() {
-        LibTestExpr.test("lfn:log(1)", "0");
+        LibTestExpr.test("lfn:log(1)", "0e0");
     }
 
     @Test
     public void log_02() {
-        LibTestExpr.test("lfn:log(10)", "1");
+        LibTestExpr.test("lfn:log(10)", "1e0");
     }
 
     @Test
@@ -135,42 +135,42 @@ public class TestLeviathanFunctions {
 
     @Test
     public void log_04() {
-        LibTestExpr.test("lfn:log(4, 2)", "2");
+        LibTestExpr.test("lfn:log(4, 2)", "2e0");
     }
 
     @Test
     public void log_05() {
-        LibTestExpr.test("lfn:log(4, 16)", "0.5");
+        LibTestExpr.test("lfn:log(4, 16)", "0.5e0");
     }
 
     @Test
     public void log_06() {
-        LibTestExpr.test("lfn:log(16, 4)", "2");
+        LibTestExpr.test("lfn:log(16, 4)", "2e0");
     }
 
     @Test
     public void reciprocal_01() {
-        LibTestExpr.test("lfn:reciprocal(1)", "1");
+        LibTestExpr.test("lfn:reciprocal(1)", "1e0");
     }
 
     @Test
     public void reciprocal_02() {
-        LibTestExpr.test("lfn:reciprocal(2)", "0.5");
+        LibTestExpr.test("lfn:reciprocal(2)", "0.5e0");
     }
 
     @Test
     public void reciprocal_03() {
-        LibTestExpr.test("lfn:reciprocal(lfn:reciprocal(2))", "2");
+        LibTestExpr.test("lfn:reciprocal(lfn:reciprocal(2))", "2e0");
     }
 
     @Test
     public void root_01() {
-        LibTestExpr.test("lfn:root(4,2)", "2");
+        LibTestExpr.test("lfn:root(4,2)", "2e0");
     }
 
     @Test
     public void root_02() {
-        LibTestExpr.test("lfn:root(2,1)", "2");
+        LibTestExpr.test("lfn:root(2,1)", "2e0");
     }
 
     @Test
@@ -180,44 +180,44 @@ public class TestLeviathanFunctions {
 
     @Test
     public void sqrt_01() {
-        LibTestExpr.test("lfn:sqrt(4)", "2");
+        LibTestExpr.test("lfn:sqrt(4)", "2e0");
     }
 
     @Test
     public void sqrt_02() {
-        LibTestExpr.test("lfn:sqrt(144)", "12");
+        LibTestExpr.test("lfn:sqrt(144)", "12e0");
     }
 
     @Test
     public void cartesian_01() {
-        LibTestExpr.test("lfn:cartesian(0, 0, 0, 0)", "0");
+        LibTestExpr.test("lfn:cartesian(0, 0, 0, 0)", "0e0");
     }
 
     @Test
     public void cartesian_02() {
-        LibTestExpr.test("lfn:cartesian(0, 0, 3, 4)", "5");
+        LibTestExpr.test("lfn:cartesian(0, 0, 3, 4)", "5e0");
     }
 
     @Test
     public void cartesian_03() {
-        LibTestExpr.test("lfn:cartesian(0, 0, 0, 3, 4, 0)", "5");
+        LibTestExpr.test("lfn:cartesian(0, 0, 0, 3, 4, 0)", "5e0");
     }
 
     @Test
     public void cartesian_04() {
-        LibTestExpr.test("lfn:cartesian(0, 0, 0, 0, 3, 4)", "5");
+        LibTestExpr.test("lfn:cartesian(0, 0, 0, 0, 3, 4)", "5e0");
     }
 
     @Test
     public void cartesian_05() {
-        LibTestExpr.test("lfn:cartesian(0, 0, 0, 3, 0, 4)", "5");
+        LibTestExpr.test("lfn:cartesian(0, 0, 0, 3, 0, 4)", "5e0");
     }
 
     @Test
     public void cos_01() {
         testDouble("lfn:cos(lfn:degrees-to-radians(60))", "0.5", DELTA);
     }
-    
+
     @Test
     public void acos_01() {
         testDouble("lfn:radians-to-degrees(lfn:cos-1(lfn:cos(lfn:degrees-to-radians(60))))", "60", DELTA);
diff --git a/jena-arq/src/test/java/org/apache/jena/sparql/expr/TestXSDFuncOp.java b/jena-arq/src/test/java/org/apache/jena/sparql/expr/TestXSDFuncOp.java
index 6c33d0c..f64c6dd 100644
--- a/jena-arq/src/test/java/org/apache/jena/sparql/expr/TestXSDFuncOp.java
+++ b/jena-arq/src/test/java/org/apache/jena/sparql/expr/TestXSDFuncOp.java
@@ -37,28 +37,28 @@ public class TestXSDFuncOp
     private static final double accuracyExact_F = 0.0f ;
     private static final double accuracyClose_D = 0.000001d ;
     private static final double accuracyClose_F = 0.000001f ;
-    
-    
+
+
     @Test public void lex_decimal_1() {
         lex_decimal_value(BigDecimal.valueOf(0), "0.0");
     }
-    
+
     @Test public void lex_decimal_2() {
         lex_decimal_value(BigDecimal.valueOf(1), "1.0");
     }
-    
+
     @Test public void lex_decimal_3() {
         lex_decimal_value(BigDecimal.valueOf(0.5), "0.5");
     }
-    
+
     @Test public void lex_decimal_4() {
         lex_decimal_value(BigDecimal.valueOf(-0.5), "-0.5");
     }
-    
+
     @Test public void lex_decimal_5() {
         lex_decimal_value(BigDecimal.valueOf(1_000_000_000_000_000L), "1000000000000000.0");
     }
-    
+
     @Test public void lex_decimal_6() {
         lex_decimal_value(BigDecimal.valueOf(-1_000_000_000_000_000L), "-1000000000000000.0");
     }
@@ -66,7 +66,7 @@ public class TestXSDFuncOp
     @Test public void lex_decimal_canonical_1() {
         lex_decimal_canonical("+.0","0.0");
     }
-    
+
     @Test public void lex_decimal_canonical_2() {
         lex_decimal_canonical("-.0","0.0");
     }
@@ -78,35 +78,35 @@ public class TestXSDFuncOp
     @Test public void lex_decimal_canonical_4() {
         lex_decimal_canonical("0012.0000","12.0");
     }
-    
+
     @Test public void lex_decimal_canonical_5() {
         lex_decimal_canonical("-0012.0000","-12.0");
     }
 
-    
+
     // Exact given lexical form preserved.
     @Test public void lex_decimal_nodevalue_1() {
         lex_decimal_nodevalue("0.0","0.0");
     }
-    
+
     @Test public void lex_decimal_nodevalue_2() {
         // As input.
         lex_decimal_nodevalue("0.","0.");
     }
-    
+
     @Test public void lex_decimal_nodevalue3() {
         // As input.
         lex_decimal_nodevalue("+.0","+.0");
     }
-    
+
     private static void lex_decimal_value(BigDecimal decimal, String expected) {
         String lex = XSDFuncOp.canonicalDecimalStr(decimal);
         assertEquals(expected, lex);
     }
-    
+
     private static void lex_decimal_nodevalue(String input, String expected) {
         NodeValue nv = NodeValue.makeDecimal(input);
-        String lex = nv.asString(); 
+        String lex = nv.asString();
         assertEquals(expected, lex);
     }
 
@@ -117,7 +117,7 @@ public class TestXSDFuncOp
     }
 
     // These add tests also test that the right kind of operation was done.
-    
+
     @Test public void testAddIntegerInteger()
     {
         NodeValue nv1 = NodeValue.makeInteger(5) ;
@@ -137,7 +137,7 @@ public class TestXSDFuncOp
         assertTrue("Not a NodeValueDecimal: "+r, r instanceof NodeValueDecimal) ;
         assertEquals("Wrong result", 8, r.getDecimal().doubleValue(), accuracyExact_D ) ;
     }
-    
+
     @Test public void testAddFloatFloat()
     {
         NodeValue nv1 = NodeValue.makeFloat(7.5f) ;
@@ -159,7 +159,7 @@ public class TestXSDFuncOp
         assertEquals("Wrong result", 10, r.getDouble(), accuracyExact_D ) ;
     }
 
-    
+
     @Test public void testAddIntegerDecimal()
     {
         NodeValue nv1 = NodeValue.makeInteger(5) ;
@@ -169,7 +169,7 @@ public class TestXSDFuncOp
         assertTrue("Not a NodeValueDecimal: "+r, r instanceof NodeValueDecimal) ;
         assertEquals("Wrong result", 12, r.getDecimal().longValue()) ;
     }
-    
+
     @Test public void testAddDecimalInteger()
     {
         NodeValue nv1 = NodeValue.makeDecimal(7) ;
@@ -179,7 +179,7 @@ public class TestXSDFuncOp
         assertTrue("Not a NodeValueDecimal: "+r, r instanceof NodeValueDecimal) ;
         assertEquals("Wrong result", 12, r.getDecimal().longValue()) ;
     }
-    
+
     @Test public void testAddIntegerFloat()
     {
         NodeValue nv1 = NodeValue.makeInteger(5) ;
@@ -189,7 +189,7 @@ public class TestXSDFuncOp
         assertTrue("Not a NodeValueFloat: "+r, r instanceof NodeValueFloat) ;
         assertEquals("Wrong result", 12, r.getDouble(), accuracyExact_F ) ;
     }
-    
+
     @Test public void testAddFloatInteger()
     {
         NodeValue nv1 = NodeValue.makeFloat(7) ;
@@ -209,7 +209,7 @@ public class TestXSDFuncOp
         assertTrue("Not a NodeValueDouble: "+r, r instanceof NodeValueDouble) ;
         assertEquals("Wrong result", 12, r.getDouble(), accuracyExact_D ) ;
     }
-    
+
     @Test public void testAddDoubleInteger()
     {
         NodeValue nv1 = NodeValue.makeDouble(7) ;
@@ -229,7 +229,7 @@ public class TestXSDFuncOp
         assertTrue("Not a NodeValueFloat: "+r, r instanceof NodeValueFloat) ;
         assertEquals("Wrong result", 8, r.getFloat(), accuracyExact_F) ;
     }
-    
+
     @Test public void testAddFloatDecimal()
     {
         NodeValue nv1 = NodeValue.makeFloat(4.5f) ;
@@ -248,7 +248,7 @@ public class TestXSDFuncOp
         assertTrue("Not a NodeValueDouble: "+r, r instanceof NodeValueDouble) ;
         assertEquals("Wrong result", 8, r.getDouble(), accuracyExact_D) ;
     }
-    
+
     @Test public void testAddDoubleDecimal()
     {
         NodeValue nv1 = NodeValue.makeDouble(4.5) ;
@@ -298,13 +298,13 @@ public class TestXSDFuncOp
         assertTrue("Not a decimal: "+r, r.isDecimal()) ;
         // sameAv (value) test : does not test lexical form or datatype.
         assertTrue("Wrong result : expected="+r+" : got="+nv3, NodeValue.sameAs(r, nv3));
-        return r.getNode().getLiteralLexicalForm();
+        return r.asNode().getLiteralLexicalForm();
     }
-    
+
     @Test public void testDivideDecimal1() {
         divideDecimal("1", "10", "0.1");
     }
-    
+
     @Test public void testDivideDecimal2() {
         divideDecimal("1", "2", "0.5");
     }
@@ -317,32 +317,32 @@ public class TestXSDFuncOp
 
     @Test public void testDivideDecimal4() {
         String x = divideDecimal("0", "3", "0");
-        assertEquals("Wrong lexical form", "0.0", x); 
+        assertEquals("Wrong lexical form", "0.0", x);
     }
 
     // JENA-1943 : If exact, return more than DIVIDE_PRECISION
     @Test public void testDivideDecimal5() {
         String x = divideDecimal("1", "10000000000000000000000000", "0.0000000000000000000000001");
-        // More than 2 (for the "0.") plus XSDFuncOp.DIVIDE_PRECISION = 24 
+        // More than 2 (for the "0.") plus XSDFuncOp.DIVIDE_PRECISION = 24
         assertEquals("Wrong length lexical form", 27, x.length());
     }
-    
+
     // JENA-1943
     @Test public void testDivideDecimal6() {
         String x = divideDecimal("1", "10000000000000000000000000000", "0.0000000000000000000000000001");
         // Exact
         assertEquals("Wrong length lexical form", 30, x.length());
     }
-    
+
     // divide errors
     @Test(expected=ExprEvalException.class)
     public void testDivideByZero1()
-    {   
+    {
         NodeValue nv1 = NodeValue.makeInteger(1) ;
         NodeValue nv2 = NodeValue.makeInteger(0) ;
         NodeValue r = XSDFuncOp.numDivide(nv1, nv2) ;
     }
-    
+
     @Test public void testDivideByZero2()
     {
         NodeValue nv1 = NodeValue.makeInteger(1) ;
@@ -351,7 +351,7 @@ public class TestXSDFuncOp
         assertTrue("Not a double: "+r, r.isDouble()) ;
         assertTrue("Not a +INF: "+r, r.getDouble()==Double.POSITIVE_INFINITY) ;
     }
-    
+
     @Test public void testDivideByZero4()
     {
         NodeValue nv1 = NodeValue.makeInteger(-1) ;
@@ -360,7 +360,7 @@ public class TestXSDFuncOp
         assertTrue("Not a double: "+r, r.isDouble()) ;
         assertTrue("Not a -INF: "+r, r.getDouble()==Double.NEGATIVE_INFINITY) ;
     }
-    
+
     @Test(expected=ExprEvalException.class)
     public void testDivideByZero5()
     {
@@ -386,7 +386,7 @@ public class TestXSDFuncOp
         assertTrue("Not a NodeValueDouble: "+r, r instanceof NodeValueDouble) ;
         assertEquals("Wrong result", 1d, r.getDouble(), accuracyExact_D ) ;
     }
-    
+
     @Test public void testSubtractDecimalInteger()
     {
         NodeValue nv1 = NodeValue.makeDecimal(3.5) ;
@@ -396,7 +396,7 @@ public class TestXSDFuncOp
         assertTrue("Not a NodeValueDecimal: "+r, r instanceof NodeValueDecimal) ;
         assertTrue("Wrong result", NodeValue.sameAs(NodeValue.makeDecimal(1.5), r) ) ;
     }
-    
+
     @Test public void testMultiplyDoubleDecimal()
     {
         NodeValue nv1 = NodeValue.makeDouble(4.5) ;
@@ -406,7 +406,7 @@ public class TestXSDFuncOp
         assertTrue("Not a NodeValueDouble: "+r, r instanceof NodeValueDouble) ;
         assertEquals("Wrong result", 4.5d*3.5d, r.getDouble(), accuracyExact_D ) ;
     }
-    
+
     @Test public void testMultiplyDecimalInteger()
     {
         NodeValue nv1 = NodeValue.makeDecimal(3.5) ;
@@ -416,7 +416,7 @@ public class TestXSDFuncOp
         assertTrue("Not a NodeValueDecimal: "+r, r instanceof NodeValueDecimal) ;
         assertEquals("Wrong result", 7L, r.getDecimal().longValue()) ;
     }
-    
+
     @Test public void testCompare1()
     {
         NodeValue nv5 = NodeValue.makeInteger(5) ;
@@ -426,17 +426,17 @@ public class TestXSDFuncOp
         NodeValue nv5b = NodeValue.makeInteger(5) ;
         assertEquals("Does not compare "+nv5+" & "+nv5b, NodeValue.CMP_EQUAL, NodeValue.compare(nv5, nv5b)) ;
     }
-    
+
     @Test public void testCompare2()
     {
         NodeValue nv5 = NodeValue.makeInteger(5) ;
-        NodeValue nv7 = NodeValue.makeNodeInteger(7) ; 
+        NodeValue nv7 = NodeValue.makeNodeInteger(7) ;
         assertEquals("Does not compare "+nv5+" & "+nv7, NodeValue.CMP_LESS, NodeValue.compare(nv5, nv7) ) ;
 
         NodeValue nv5b = NodeValue.makeNodeInteger(5) ;
         assertEquals("Does not compare "+nv5+" & "+nv5b, NodeValue.CMP_EQUAL, NodeValue.compare(nv5, nv5b) ) ;
     }
-    
+
     @Test public void testCompare3()
     {
         NodeValue nv5 = NodeValue.makeInteger(5) ;
@@ -457,8 +457,8 @@ public class TestXSDFuncOp
         NodeValue nv7 = NodeValue.makeDecimal(7) ;
         assertEquals("Does not compare "+nv5+" & "+nv7, NodeValue.CMP_LESS, NodeValue.compare(nv5, nv7) ) ;
     }
-    
-    
+
+
     @Test public void testCompare10()
     {
         NodeValue nv1 = NodeValue.makeDateTime("2005-10-14T13:09:43Z") ;
@@ -494,7 +494,7 @@ public class TestXSDFuncOp
         } catch (ExprNotComparableException ex)
         {}
     }
-    
+
     @Test public void testCompare16()
     {
         // One in a timezone, one not.  Within +/- 14 hours.  Can't compare.
@@ -518,7 +518,7 @@ public class TestXSDFuncOp
         } catch (ExprNotComparableException ex)
         {}
     }
-    
+
     @Test public void testCompare18()
     {
         // One in a timezone, one not.  More than +/- 14 hours.  Can compare.
@@ -527,7 +527,7 @@ public class TestXSDFuncOp
         assertEquals(Expr.CMP_GREATER, NodeValue.compare(nv1, nv2)) ;
     }
 
-    
+
     @Test public void testCompare20()
     {
         NodeValue nv1 = NodeValue.makeString("abcd") ;
@@ -539,22 +539,22 @@ public class TestXSDFuncOp
     {
         NodeValue nv5 = NodeValue.makeInteger(5) ;
         NodeValue nv7 = NodeValue.makeString("5") ;
-        
+
         try {
             NodeValue.compare(nv5, nv7) ;
-            fail("Should not compare (but did) "+nv5+" & "+nv7) ; 
+            fail("Should not compare (but did) "+nv5+" & "+nv7) ;
         } catch (ExprEvalException ex)
         { /* expected */}
-            
+
         int x = NodeValue.compareAlways(nv5, nv7) ;
         assertEquals("Does not compare "+nv5+" & "+nv7, NodeValue.CMP_GREATER, NodeValue.compareAlways(nv5, nv7) ) ;
     }
-    
+
     @Test public void testCompare22()
     {
         NodeValue nv1 = NodeValue.makeNodeString("aaa") ;
         NodeValue nv2 = NodeValue.makeString("aaabbb") ;
-        
+
         int x = NodeValue.compare(nv1, nv2) ;
         assertEquals("Not CMP_LESS", x, Expr.CMP_LESS) ;
         assertTrue("It's CMP_GREATER", x != Expr.CMP_GREATER) ;
@@ -565,39 +565,39 @@ public class TestXSDFuncOp
     {
         NodeValue nv1 = NodeValue.makeNode(NodeFactory.createBlankNode()) ;
         NodeValue nv2 = NodeValue.makeString("5") ;
-        
+
         try {
             NodeValue.compare(nv1, nv2) ;
-            fail("Should not compare (but did) "+nv1+" & "+nv2) ; 
+            fail("Should not compare (but did) "+nv1+" & "+nv2) ;
         } catch (ExprEvalException ex)
         { /* expected */}
     }
-    
+
     @Test public void testSameUnknown_1()
     {
-        NodeValue nv1 = NodeValue.makeNode(NodeFactory.createURI("test:abc")) ; 
+        NodeValue nv1 = NodeValue.makeNode(NodeFactory.createURI("test:abc")) ;
         NodeValue nv2 = NodeValue.makeNode(NodeFactory.createURI("test:abc")) ;
-        
-        assertTrue(NodeValue.sameAs(nv1, nv2)) ; 
+
+        assertTrue(NodeValue.sameAs(nv1, nv2)) ;
         assertFalse(NodeValue.notSameAs(nv1, nv2)) ;
         try {
             NodeValue.compare(nv1, nv2) ;
-            fail("Should not compare (but did) "+nv1+" & "+nv2) ; 
+            fail("Should not compare (but did) "+nv1+" & "+nv2) ;
         } catch (ExprEvalException ex)
         { /* expected */}
-            
+
     }
-    
+
     @Test public void testSameUnknown_2()
     {
-        NodeValue nv1 = NodeValue.makeNode(NodeFactory.createBlankNode()) ; 
+        NodeValue nv1 = NodeValue.makeNode(NodeFactory.createBlankNode()) ;
         NodeValue nv2 = NodeValue.makeNode(NodeFactory.createURI("test:abc")) ;
-        
+
         assertFalse(NodeValue.sameAs(nv1, nv2)) ;
         assertTrue(NodeValue.notSameAs(nv1, nv2)) ;
         try {
             NodeValue.compare(nv1, nv2) ;
-            fail("Should not compare (but did) "+nv1+" & "+nv2) ; 
+            fail("Should not compare (but did) "+nv1+" & "+nv2) ;
         } catch (ExprEvalException ex)
         { /* expected */}
     }
@@ -606,43 +606,43 @@ public class TestXSDFuncOp
 
     // SameValue and compare of date and dateTimes
     // Timezone tricknesses - if one has a TZ and the other has not, then a difference of 14 hours
-    // is needed for a comparison.  
+    // is needed for a comparison.
 
     @Test public void testSameDateTime_1()
     {
         NodeValue nv1 = NodeValue.makeDateTime("2007-09-04T09:22:03") ;
         NodeValue nv2 = NodeValue.makeDateTime("2007-09-04T09:22:03") ;
-        
+
         assertTrue(NodeValue.sameAs(nv1, nv2)) ;
         assertFalse(NodeValue.notSameAs(nv1, nv2)) ;
     }
-    
+
     @Test public void testSameDateTime_2()
     {
         NodeValue nv1 = NodeValue.makeDateTime("2007-09-04T09:22:03") ;
         NodeValue nv2 = NodeValue.makeDateTime("2007-09-04T19:00:00") ;
-        
+
         assertFalse(NodeValue.sameAs(nv1, nv2)) ;
         assertTrue(NodeValue.notSameAs(nv1, nv2)) ;
     }
 
-    
+
     @Test public void testSameDateTime_3()
     {
         // These are the same.
         NodeValue nv1 = NodeValue.makeDateTime("2007-09-04T10:22:03+01:00") ;
         NodeValue nv2 = NodeValue.makeDateTime("2007-09-04T09:22:03Z") ;
-        
+
         assertTrue(NodeValue.sameAs(nv1, nv2)) ;
         assertFalse(NodeValue.notSameAs(nv1, nv2)) ;
     }
-    
+
     @Test public void testSameDateTime_4()
     {
         // These are not the same.
         NodeValue nv1 = NodeValue.makeDateTime("2007-09-04T10:22:03+01:00") ;
         NodeValue nv2 = NodeValue.makeDateTime("2007-09-04T10:22:03Z") ;
-        
+
         assertFalse(NodeValue.sameAs(nv1, nv2)) ;
         assertTrue(NodeValue.notSameAs(nv1, nv2)) ;
     }
@@ -651,75 +651,75 @@ public class TestXSDFuncOp
     {
         NodeValue nv1 = NodeValue.makeDateTime("2007-09-04T10:22:03+01:00") ;
         NodeValue nv2 = NodeValue.makeDateTime("2007-09-04T09:22:03") ;     // No timezone
-        
-        try { 
+
+        try {
             NodeValue.sameAs(nv1, nv2) ;
             fail("Should not sameValueAs (but did) "+nv1+" & "+nv2) ;
         } catch (ExprEvalException ex) {}
-        
-        try { 
+
+        try {
             NodeValue.notSameAs(nv1, nv2) ;
             fail("Should not notSameValueAs (but did) "+nv1+" & "+nv2) ;
         } catch (ExprEvalException ex) {}
     }
-    
+
     // ---- sameValueAs -- xsd:date
-    
+
     @Test public void testSameDate_1()
     {
         NodeValue nv1 = NodeValue.makeDate("2007-09-04") ;
         NodeValue nv2 = NodeValue.makeDate("2007-09-04") ;
-        
+
         assertTrue(NodeValue.sameAs(nv1, nv2)) ;
         assertFalse(NodeValue.notSameAs(nv1, nv2)) ;
     }
-    
+
     @Test public void testSameDate_2()
     {
         NodeValue nv1 = NodeValue.makeDate("2007-09-04Z") ;
         NodeValue nv2 = NodeValue.makeDate("2007-09-04+00:00") ;
-        
+
         assertTrue(NodeValue.sameAs(nv1, nv2)) ;
         assertFalse(NodeValue.notSameAs(nv1, nv2)) ;
     }
-    
-    
+
+
     @Test public void testSameDate_3()
     {
         NodeValue nv1 = NodeValue.makeDate("2007-09-04Z") ;
         NodeValue nv2 = NodeValue.makeDate("2007-09-04") ;     // No timezone
-        
-        try { 
+
+        try {
             NodeValue.sameAs(nv1, nv2) ;
             fail("Should not sameValueAs (but did) "+nv1+" & "+nv2) ;
         } catch (ExprEvalException ex) {}
-        
-        try { 
+
+        try {
             NodeValue.notSameAs(nv1, nv2) ;
             fail("Should not notSameValueAs (but did) "+nv1+" & "+nv2) ;
         } catch (ExprEvalException ex) {}
     }
-    
-    
+
+
     // General comparisons for sorting.
-    
+
     // bnodes < URIs < literals
-    
+
     @Test public void testCompareGeneral1()
     {
         NodeValue nv1 = NodeValue.makeNode(NodeFactory.createBlankNode()) ;
         NodeValue nv2 = NodeValue.makeString("5") ;
-        
+
         // bNodes before strings
         int x = NodeValue.compareAlways(nv1, nv2) ;
         assertEquals("Does not compare "+nv1+" & "+nv2, NodeValue.CMP_LESS, NodeValue.compareAlways(nv1, nv2) ) ;
     }
-    
+
     @Test public void testCompareGeneral2()
     {
         NodeValue nv1 = NodeValue.makeNode(NodeFactory.createBlankNode()) ;
         NodeValue nv2 = NodeValue.makeNode(NodeFactory.createURI("test:abc")) ;
-        
+
         // bNodes before URIs
         int x = NodeValue.compareAlways(nv1, nv2) ;
         assertEquals("Does not compare "+nv1+" & "+nv2, NodeValue.CMP_LESS, NodeValue.compareAlways(nv1, nv2) ) ;
@@ -729,7 +729,7 @@ public class TestXSDFuncOp
     {
         NodeValue nv1 = NodeValue.makeNode(NodeFactory.createLiteral("test:abc")) ;
         NodeValue nv2 = NodeValue.makeNode(NodeFactory.createURI("test:abc")) ;
-        
+
         // URIs before literals
         int x = NodeValue.compareAlways(nv1, nv2) ;
         assertEquals("Does not compare "+nv1+" & "+nv2, NodeValue.CMP_GREATER, NodeValue.compareAlways(nv1, nv2) ) ;
@@ -739,7 +739,7 @@ public class TestXSDFuncOp
     {
         NodeValue nv1 = NodeValue.makeNode(NodeFactory.createURI("test:abc")) ;
         NodeValue nv2 = NodeValue.makeNode(NodeFactory.createURI("test:xyz")) ;
-        
+
         int x = NodeValue.compareAlways(nv1, nv2) ;
         assertEquals("Does not compare "+nv1+" & "+nv2, NodeValue.CMP_LESS, NodeValue.compareAlways(nv1, nv2) ) ;
     }
@@ -747,27 +747,27 @@ public class TestXSDFuncOp
     @Test public void testCompareDuration_01() {
         testCompare("'P365D'^^xsd:duration", "'P300D'^^xsd:duration", Expr.CMP_GREATER) ;
     }
-    
+
     // JENA-814
-    @Test(expected=ExprNotComparableException.class) 
+    @Test(expected=ExprNotComparableException.class)
     public void testCompareDuration_02() {
         testCompare("'P365D'^^xsd:duration", "'P1Y'^^xsd:duration", Expr.CMP_INDETERMINATE) ;
     }
-    
+
     // JENA-814
-    @Test(expected=ExprNotComparableException.class) 
+    @Test(expected=ExprNotComparableException.class)
     public void testCompareDuration_03() {
         testCompare("'P365D'^^xsd:dayTimeDuration", "'P1Y'^^xsd:yearMonthDuration", Expr.CMP_INDETERMINATE) ;
     }
 
     // JENA-814
-    @Test(expected=ExprNotComparableException.class) 
+    @Test(expected=ExprNotComparableException.class)
     public void testCompareDuration_04() {
         testCompare("'P1M'^^xsd:duration", "'P28D'^^xsd:duration", Expr.CMP_INDETERMINATE) ;
     }
 
     // JENA-814
-    @Test(expected=ExprNotComparableException.class) 
+    @Test(expected=ExprNotComparableException.class)
     public void testCompareDuration_05() {
         testCompare("'P1M'^^xsd:yearMonthDuration", "'P28D'^^xsd:dayTimeDuration", Expr.CMP_INDETERMINATE) ;
     }
@@ -775,20 +775,20 @@ public class TestXSDFuncOp
     @Test public void testCompareDuration_06() {
         testCompare("'P13M'^^xsd:yearMonthDuration", "'P1Y'^^xsd:yearMonthDuration", Expr.CMP_GREATER) ;
     }
-    
+
     // -------
-    
+
     private static void testCompare(String s1, String s2, int correct) {
-        NodeValue nv1 = parse(s1) ; 
-        NodeValue nv2 = parse(s2) ; 
+        NodeValue nv1 = parse(s1) ;
+        NodeValue nv2 = parse(s2) ;
         int x = NodeValue.compare(nv1, nv2) ;
         assertEquals("("+s1+", "+s2+") -> "+name(x)+" ["+name(correct)+"]", correct, x) ;
         int y = x ;
-        if ( x == Expr.CMP_LESS || x == Expr.CMP_GREATER ) 
+        if ( x == Expr.CMP_LESS || x == Expr.CMP_GREATER )
             y = -x ;
         assertEquals("Not symmetric: ("+s1+", "+s2+")", NodeValue.compare(nv2, nv1), y) ;
     }
-    
+
     private static String name(int cmp) {
         switch(cmp) {
             case Expr.CMP_EQUAL :       return "EQ" ;
@@ -797,15 +797,15 @@ public class TestXSDFuncOp
             case Expr.CMP_UNEQUAL :     return "NE" ;
             case Expr.CMP_INDETERMINATE : return "INDET" ;
             default:return "Unknown" ;
-                
+
         }
     }
-    
+
     private static NodeValue parse(String str) {
         Node n = SSE.parseNode(str) ;
-        return NodeValue.makeNode(n) ; 
+        return NodeValue.makeNode(n) ;
     }
-    // abs is a test of Function.unaryOp machinery 
+    // abs is a test of Function.unaryOp machinery
     @Test public void testAbs1()
     {
         NodeValue nv = NodeValue.makeInteger(2) ;
@@ -814,7 +814,7 @@ public class TestXSDFuncOp
         assertTrue("Not a NodeValueInteger: "+r, r instanceof NodeValueInteger) ;
         assertEquals("Wrong result", 2, r.getInteger().longValue() ) ;
     }
-    
+
     @Test public void testAbs2()
     {
         NodeValue nv = NodeValue.makeInteger(-2) ;
@@ -823,7 +823,7 @@ public class TestXSDFuncOp
         assertTrue("Not a NodeValueInteger: "+r, r instanceof NodeValueInteger) ;
         assertEquals("Wrong result", 2, r.getInteger().longValue() ) ;
     }
-    
+
     @Test public void testAbs3()
     {
         NodeValue nv = NodeValue.makeDecimal(2) ;
@@ -832,7 +832,7 @@ public class TestXSDFuncOp
         assertTrue("Not a NodeValueDecimal: "+r, r instanceof NodeValueDecimal) ;
         assertEquals("Wrong result", 2, r.getDecimal().doubleValue(), accuracyExact_D ) ;
     }
-    
+
     @Test public void testAbs4()
     {
         NodeValue nv = NodeValue.makeDecimal(-2) ;
@@ -841,7 +841,7 @@ public class TestXSDFuncOp
         assertTrue("Not a NodeValueDecimal: "+r, r instanceof NodeValueDecimal) ;
         assertEquals("Wrong result", 2, r.getDecimal().doubleValue(), accuracyExact_D ) ;
     }
-    
+
     @Test public void testAbs5()
     {
         NodeValue nv = NodeValue.makeFloat(2) ;
@@ -886,7 +886,7 @@ public class TestXSDFuncOp
         assertTrue("Not a NodeValueDecimal: "+r, r instanceof NodeValueDecimal) ;
         assertEquals("Wrong result", 3, r.getDecimal().longValue()) ;
     }
-    
+
     @Test public void testCeiling2()
     {
         NodeValue nv = NodeValue.makeDecimal(-3.6) ;
@@ -895,7 +895,7 @@ public class TestXSDFuncOp
         assertTrue("Not a NodeValueDecimal: "+r, r instanceof NodeValueDecimal) ;
         assertEquals("Wrong result", -3, r.getDecimal().longValue() ) ;
     }
-    
+
     @Test public void testCeiling3()
     {
         NodeValue nv = NodeValue.makeDouble(2.6) ;
@@ -904,7 +904,7 @@ public class TestXSDFuncOp
         assertTrue("Not a NodeValueDouble: "+r, r instanceof NodeValueDouble) ;
         assertEquals("Wrong result", 3, r.getDouble(), accuracyExact_D ) ;
     }
-    
+
     @Test public void testCeiling4()
     {
         NodeValue nv = NodeValue.makeDouble(-3.6) ;
@@ -922,7 +922,7 @@ public class TestXSDFuncOp
         assertTrue("Not a NodeValueInteger: "+r, r instanceof NodeValueInteger) ;
         assertEquals("Wrong result", 3, r.getInteger().longValue() ) ;
     }
-    
+
     @Test public void testFloor1()
     {
         NodeValue nv = NodeValue.makeDecimal(2.6) ;
@@ -931,7 +931,7 @@ public class TestXSDFuncOp
         assertTrue("Not a NodeValueDecimal: "+r, r instanceof NodeValueDecimal) ;
         assertEquals("Wrong result", 2, r.getDecimal().longValue()) ;
     }
-    
+
     @Test public void testFloor2()
     {
         NodeValue nv = NodeValue.makeDecimal(-3.6) ;
@@ -940,7 +940,7 @@ public class TestXSDFuncOp
         assertTrue("Not a NodeValueDecimal: "+r, r instanceof NodeValueDecimal) ;
         assertEquals("Wrong result", -4, r.getDecimal().longValue() ) ;
     }
-    
+
     @Test public void testFloor3()
     {
         NodeValue nv = NodeValue.makeDouble(2.6) ;
@@ -949,7 +949,7 @@ public class TestXSDFuncOp
         assertTrue("Not a NodeValueDouble: "+r, r instanceof NodeValueDouble) ;
         assertEquals("Wrong result", 2, r.getDouble(), accuracyExact_D ) ;
     }
-    
+
     @Test public void testFloor4()
     {
         NodeValue nv = NodeValue.makeDouble(-3.6) ;
@@ -958,7 +958,7 @@ public class TestXSDFuncOp
         assertTrue("Not a NodeValueDouble: "+r, r instanceof NodeValueDouble) ;
         assertEquals("Wrong result", -4, r.getDouble(), accuracyExact_D ) ;
     }
-    
+
     @Test public void testFloor5()
     {
         NodeValue nv = NodeValue.makeInteger(3) ;
@@ -973,13 +973,13 @@ public class TestXSDFuncOp
         NodeValue four = NodeValue.makeInteger(4) ;
         NodeValue two = NodeValue.makeDouble(2) ;
         NodeValue result = XSDFuncOp.sqrt( four ) ;
-        
+
         assertTrue(result.isDouble()) ;
         assertFalse(result.isDecimal()) ;
         assertTrue( NodeValue.sameAs( two, result)) ;
         assertTrue( two.asNode().sameValueAs(result.asNode()) ) ;
     }
-    
+
     @Test public void testSqrt2()
     {
         NodeValue four = NodeValue.makeDouble(4) ;
@@ -988,36 +988,36 @@ public class TestXSDFuncOp
 
         assertTrue(result.isDouble()) ;
         assertTrue( NodeValue.sameAs( two, result)) ;
-        
+
         assertNotNull(result.asNode()) ;
     }
-    
+
     @Test(expected=ExprEvalException.class)
     public void testStrReplace() {
-        //test invalid pattern 
+        //test invalid pattern
         NodeValue wrong = NodeValue.makeString("^(?:-*[^-]){-9}");
         NodeValue nvStr= NodeValue.makeString("AGIKLAKLMTUARAR");
         NodeValue empty= NodeValue.makeString("");
         XSDFuncOp.strReplace(nvStr, wrong, empty);
     }
-    
+
     // All compatible - no timezone.
     private static NodeValue nv_dt = NodeValue.makeNode("2010-03-22T20:31:54.5", XSDDatatype.XSDdateTime) ;
     private static NodeValue nv_d = NodeValue.makeNode("2010-03-22", XSDDatatype.XSDdate) ;
     private static NodeValue nv_gy = NodeValue.makeNode("2010", XSDDatatype.XSDgYear) ;
     private static NodeValue nv_gym = NodeValue.makeNode("2010-03", XSDDatatype.XSDgYearMonth) ;
-    
+
     private static NodeValue nv_gmd = NodeValue.makeNode("--03-22", XSDDatatype.XSDgMonthDay) ;
     private static NodeValue nv_gm = NodeValue.makeNode("--03", XSDDatatype.XSDgMonth) ;
     private static NodeValue nv_gd = NodeValue.makeNode("---22", XSDDatatype.XSDgDay) ;
     private static NodeValue nv_t = NodeValue.makeNode("20:31:54.5", XSDDatatype.XSDtime) ;
-    
+
     private static void testDateTimeCast(NodeValue nv, XSDDatatype xsd, NodeValue nvResult )
     {
         NodeValue nv2 = XSDFuncOp.dateTimeCast(nv, xsd) ;
         Assert.assertEquals(nvResult, nv2) ;
     }
-    
+
     // datetime to other
     @Test public void cast_gregorian_01() { testDateTimeCast(nv_dt, XSDDatatype.XSDdateTime, nv_dt) ; }
     @Test public void cast_gregorian_02() { testDateTimeCast(nv_dt, XSDDatatype.XSDdate, nv_d) ; }
@@ -1026,7 +1026,7 @@ public class TestXSDFuncOp
     @Test public void cast_gregorian_05() { testDateTimeCast(nv_dt, XSDDatatype.XSDgMonthDay, nv_gmd) ; }
     @Test public void cast_gregorian_06() { testDateTimeCast(nv_dt, XSDDatatype.XSDgMonth, nv_gm) ; }
     @Test public void cast_gregorian_07() { testDateTimeCast(nv_dt, XSDDatatype.XSDgDay, nv_gd) ; }
-    
+
     @Test public void cast_gregorian_08() { testDateTimeCast(nv_dt, XSDDatatype.XSDtime, nv_t) ; }
 
     // date to other
@@ -1046,46 +1046,46 @@ public class TestXSDFuncOp
     @Test public void cast_gregorian_25() { testDateTimeCast(nv_gd, XSDDatatype.XSDgDay, nv_gd) ; }
 
     // G* to date
-    
+
     @Test(expected=ExprEvalTypeException.class)
     public void cast_gregorian_31()     { testDateTimeCast(nv_gym, XSDDatatype.XSDdate, nv_d) ; }
-    
+
     @Test(expected=ExprEvalTypeException.class)
     public void cast_gregorian_32()     { testDateTimeCast(nv_gy, XSDDatatype.XSDdate, NodeValue.makeDate("2010-01-01")) ; }
-    
+
     @Test(expected=ExprEvalTypeException.class)
     public void cast_gregorian_33()     { testDateTimeCast(nv_gmd, XSDDatatype.XSDdate, nv_d) ; }
-    
+
     @Test(expected=ExprEvalTypeException.class)
     public void cast_gregorian_34()     { testDateTimeCast(nv_gm, XSDDatatype.XSDdate, nv_d) ; }
-    
+
     @Test(expected=ExprEvalTypeException.class)
     public void cast_gregorian_35()     { testDateTimeCast(nv_gd, XSDDatatype.XSDdate, nv_d) ; }
 
     // Junk to date/time thing.
     @Test (expected=ExprEvalTypeException.class)
     public void cast_err_gregorian_01() { testDateTimeCast(NodeValue.makeBoolean(false), XSDDatatype.XSDgDay, nv_gd) ; }
-    
+
     private static NodeValue nv_dt_tz1 = NodeValue.makeNode("2010-03-22T20:31:54.5+01:00", XSDDatatype.XSDdateTime) ;
     private static NodeValue nv_dt_tz2 = NodeValue.makeNode("2010-03-22T20:31:54.5-05:00", XSDDatatype.XSDdateTime) ;
     private static NodeValue nv_dt_tz3 = NodeValue.makeNode("2010-03-22T20:31:54.5Z", XSDDatatype.XSDdateTime) ;
-    
+
     private static NodeValue nv_d_tz1 = NodeValue.makeNode("2010-03-22+01:00", XSDDatatype.XSDdate) ;
     private static NodeValue nv_d_tz2 = NodeValue.makeNode("2010-03-22-05:00", XSDDatatype.XSDdate) ;
     private static NodeValue nv_d_tz3 = NodeValue.makeNode("2010-03-22Z", XSDDatatype.XSDdate) ;
-    
+
     private static NodeValue nv_t_tz1 = NodeValue.makeNode("20:31:54.5+01:00", XSDDatatype.XSDtime) ;
     private static NodeValue nv_t_tz2 = NodeValue.makeNode("20:31:54.5-05:00", XSDDatatype.XSDtime) ;
     private static NodeValue nv_t_tz3 = NodeValue.makeNode("20:31:54.5Z", XSDDatatype.XSDtime) ;
-    
+
     @Test public void cast_date_tz_01() { testDateTimeCast(nv_dt_tz1, XSDDatatype.XSDdate, nv_d_tz1) ; }
     @Test public void cast_date_tz_02() { testDateTimeCast(nv_dt_tz2, XSDDatatype.XSDdate, nv_d_tz2) ; }
     @Test public void cast_date_tz_03() { testDateTimeCast(nv_dt_tz3, XSDDatatype.XSDdate, nv_d_tz3) ; }
-    
+
     @Test public void cast_time_tz_01() { testDateTimeCast(nv_dt_tz1, XSDDatatype.XSDtime, nv_t_tz1) ; }
     @Test public void cast_time_tz_02() { testDateTimeCast(nv_dt_tz2, XSDDatatype.XSDtime, nv_t_tz2) ; }
     @Test public void cast_time_tz_03() { testDateTimeCast(nv_dt_tz3, XSDDatatype.XSDtime, nv_t_tz3) ; }
-    
+
     @Test
     public void fn_error_01() {
         try {