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 2026/04/15 08:26:54 UTC
(jena) 01/02: GH-3855: Hex \u{} sequence (RIOT)
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
commit af12b0b70be662d3602693779264070b30539ae7
Author: Andy Seaborne <an...@apache.org>
AuthorDate: Sat Apr 11 11:53:04 2026 +0100
GH-3855: Hex \u{} sequence (RIOT)
---
jena-arq/Grammar/Turtle/{turtle => grammar-turtle} | 0
jena-arq/Grammar/Turtle/turtle.jj | 8 +-
.../lang/turtlejcc/TurtleJavaccReaderRIOT.java | 4 +
.../riot/lang/turtlejcc/javacc/TurtleJavacc.java | 6 +-
.../turtlejcc/javacc/TurtleJavaccConstants.java | 87 +-
.../turtlejcc/javacc/TurtleJavaccTokenManager.java | 1346 +++++++++++---------
.../org/apache/jena/riot/tokens/TokenizerText.java | 60 +-
.../apache/jena/riot/tokens/TestTokenizerText.java | 41 +-
.../java/org/apache/jena/atlas/lib/EscapeStr.java | 211 +--
.../main/java/org/apache/jena/atlas/lib/Hex.java | 30 +-
.../org/apache/jena/atlas/lib/TestEscapeStr.java | 25 +-
11 files changed, 1031 insertions(+), 787 deletions(-)
diff --git a/jena-arq/Grammar/Turtle/turtle b/jena-arq/Grammar/Turtle/grammar-turtle
similarity index 100%
rename from jena-arq/Grammar/Turtle/turtle
rename to jena-arq/Grammar/Turtle/grammar-turtle
diff --git a/jena-arq/Grammar/Turtle/turtle.jj b/jena-arq/Grammar/Turtle/turtle.jj
index 816b18a41e..69d84e15eb 100644
--- a/jena-arq/Grammar/Turtle/turtle.jj
+++ b/jena-arq/Grammar/Turtle/turtle.jj
@@ -538,9 +538,15 @@ TOKEN :
| < #QUOTE_3S: "'''">
| < #ECHAR: "\\" ( "t"|"b"|"n"|"r"|"f"|"\\"|"\""|"'") >
-| < #UCHAR: <UCHAR4> | <UCHAR8> >
+| < #UCHAR: <UCHAR4> | <UCHAR8> | <UCHAR_DELIM> >
| < #UCHAR4: "\\" "u" <HEX> <HEX> <HEX> <HEX> >
| < #UCHAR8: "\\" "U" <HEX> <HEX> <HEX> <HEX> <HEX> <HEX> <HEX> <HEX> >
+| < #UCHAR_DELIM: "\\" "u" <LBRACE>
+ // W3C EBNF does not have a "{1,6}" syntax.
+ // <HEX> (<HEX> (<HEX> (<HEX> (<HEX> (<HEX>)? )? )? )? )?
+ // Or be lax here and check the length in escape processing.
+ (<HEX>)+
+ <RBRACE> >
| < STRING_LITERAL1:
// Single quoted string
diff --git a/jena-arq/src/main/java/org/apache/jena/riot/lang/turtlejcc/TurtleJavaccReaderRIOT.java b/jena-arq/src/main/java/org/apache/jena/riot/lang/turtlejcc/TurtleJavaccReaderRIOT.java
index a7c5502527..0fee9d8cf7 100644
--- a/jena-arq/src/main/java/org/apache/jena/riot/lang/turtlejcc/TurtleJavaccReaderRIOT.java
+++ b/jena-arq/src/main/java/org/apache/jena/riot/lang/turtlejcc/TurtleJavaccReaderRIOT.java
@@ -78,6 +78,10 @@ public class TurtleJavaccReaderRIOT implements ReaderRIOT {
parser.parse();
output.finish();
}
+ catch (RiotParseException ex) {
+ profile.getErrorHandler().error(ex.getMessage(), ex.getLine(), ex.getCol());
+ throw ex;
+ }
catch (ParseException ex) {
profile.getErrorHandler().error(ex.getMessage(), ex.currentToken.beginLine, ex.currentToken.beginColumn);
throw new RiotParseException(ex.getMessage(), ex.currentToken.beginLine, ex.currentToken.beginColumn);
diff --git a/jena-arq/src/main/java/org/apache/jena/riot/lang/turtlejcc/javacc/TurtleJavacc.java b/jena-arq/src/main/java/org/apache/jena/riot/lang/turtlejcc/javacc/TurtleJavacc.java
index 3f25c3739d..404774eb06 100644
--- a/jena-arq/src/main/java/org/apache/jena/riot/lang/turtlejcc/javacc/TurtleJavacc.java
+++ b/jena-arq/src/main/java/org/apache/jena/riot/lang/turtlejcc/javacc/TurtleJavacc.java
@@ -1029,7 +1029,7 @@ String lang = stripChars(t.image, 1) ; {if ("" != null) return lang ;}
jj_la1_0 = new int[] {0x87e00,0x40000,0x87e00,0x7000,0xe00,0x0,0x80100,0x80100,0x80000,0x0,0x80100,0x0,0x80100,0x80000,0x3898000,0x3818000,0x3898000,0x3800000,0xe00,0xe00,0x18000,0x0,0x80000,0x0,0x0,0x80000,0x80000,0x0,0x80000,0x3898000,0x80000,0x3898000,0x0,0x0,0xe00,0xe00,};
}
private static void jj_la1_init_1() {
- jj_la1_1 = new int[] {0xe080a20,0x0,0xe080a20,0x0,0x0,0x6,0x6000000,0x6000000,0xe080a20,0x1000,0x6000000,0x2000,0x6000000,0xe000820,0xe0a0a3e,0x1e,0xe0a0a3e,0x0,0x10008000,0x10008000,0x0,0x1e,0x6000000,0x6000000,0x8000800,0xe000800,0xe000800,0x800000,0xe080800,0xe0a081e,0xe000800,0xe02081e,0xa00000,0xa00000,0x10000000,0x0,};
+ jj_la1_1 = new int[] {0x1c101440,0x0,0x1c101440,0x0,0x0,0xc,0xc000000,0xc000000,0x1c101440,0x2000,0xc000000,0x4000,0xc000000,0x1c001040,0x1c14147c,0x3c,0x1c14147c,0x0,0x20010000,0x20010000,0x0,0x3c,0xc000000,0xc000000,0x10001000,0x1c001000,0x1c001000,0x1000000,0x1c101000,0x1c14103c,0x1c001000,0x1c04103c,0x1400000,0x1400000,0x20000000,0x0,};
}
private static void jj_la1_init_2() {
jj_la1_2 = 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,};
@@ -1157,7 +1157,7 @@ String lang = stripChars(t.image, 1) ; {if ("" != null) return lang ;}
/** Generate ParseException. */
public ParseException generateParseException() {
jj_expentries.clear();
- boolean[] la1tokens = new boolean[75];
+ boolean[] la1tokens = new boolean[76];
if (jj_kind >= 0) {
la1tokens[jj_kind] = true;
jj_kind = -1;
@@ -1177,7 +1177,7 @@ String lang = stripChars(t.image, 1) ; {if ("" != null) return lang ;}
}
}
}
- for (int i = 0; i < 75; i++) {
+ for (int i = 0; i < 76; i++) {
if (la1tokens[i]) {
jj_expentry = new int[1];
jj_expentry[0] = i;
diff --git a/jena-arq/src/main/java/org/apache/jena/riot/lang/turtlejcc/javacc/TurtleJavaccConstants.java b/jena-arq/src/main/java/org/apache/jena/riot/lang/turtlejcc/javacc/TurtleJavaccConstants.java
index fad1db6c3c..689d336cbe 100644
--- a/jena-arq/src/main/java/org/apache/jena/riot/lang/turtlejcc/javacc/TurtleJavaccConstants.java
+++ b/jena-arq/src/main/java/org/apache/jena/riot/lang/turtlejcc/javacc/TurtleJavaccConstants.java
@@ -86,89 +86,91 @@ public interface TurtleJavaccConstants {
/** RegularExpression Id. */
int UCHAR8 = 32;
/** RegularExpression Id. */
- int STRING_LITERAL1 = 33;
+ int UCHAR_DELIM = 33;
/** RegularExpression Id. */
- int STRING_LITERAL2 = 34;
+ int STRING_LITERAL1 = 34;
/** RegularExpression Id. */
- int STRING_LITERAL_LONG1 = 35;
+ int STRING_LITERAL2 = 35;
/** RegularExpression Id. */
- int STRING_LITERAL_LONG2 = 36;
+ int STRING_LITERAL_LONG1 = 36;
/** RegularExpression Id. */
- int LPAREN = 37;
+ int STRING_LITERAL_LONG2 = 37;
/** RegularExpression Id. */
- int RPAREN = 38;
+ int LPAREN = 38;
/** RegularExpression Id. */
- int LBRACE = 39;
+ int RPAREN = 39;
/** RegularExpression Id. */
- int RBRACE = 40;
+ int LBRACE = 40;
/** RegularExpression Id. */
- int LBRACKET = 41;
+ int RBRACE = 41;
/** RegularExpression Id. */
- int RBRACKET = 42;
+ int LBRACKET = 42;
/** RegularExpression Id. */
- int ANON = 43;
+ int RBRACKET = 43;
/** RegularExpression Id. */
- int SEMICOLON = 44;
+ int ANON = 44;
/** RegularExpression Id. */
- int COMMA = 45;
+ int SEMICOLON = 45;
/** RegularExpression Id. */
- int DOT = 46;
+ int COMMA = 46;
/** RegularExpression Id. */
- int DATATYPE = 47;
+ int DOT = 47;
/** RegularExpression Id. */
- int AT = 48;
+ int DATATYPE = 48;
/** RegularExpression Id. */
- int L_TRIPLE = 49;
+ int AT = 49;
/** RegularExpression Id. */
- int R_TRIPLE = 50;
+ int L_TRIPLE = 50;
/** RegularExpression Id. */
- int LT2 = 51;
+ int R_TRIPLE = 51;
/** RegularExpression Id. */
- int GT2 = 52;
+ int LT2 = 52;
/** RegularExpression Id. */
- int L_ANN = 53;
+ int GT2 = 53;
/** RegularExpression Id. */
- int R_ANN = 54;
+ int L_ANN = 54;
/** RegularExpression Id. */
- int TILDE = 55;
+ int R_ANN = 55;
/** RegularExpression Id. */
- int VBAR = 56;
+ int TILDE = 56;
/** RegularExpression Id. */
- int PNAME_NS = 57;
+ int VBAR = 57;
/** RegularExpression Id. */
- int PNAME_LN = 58;
+ int PNAME_NS = 58;
/** RegularExpression Id. */
- int BLANK_NODE_LABEL = 59;
+ int PNAME_LN = 59;
/** RegularExpression Id. */
- int LANG_DIR = 60;
+ int BLANK_NODE_LABEL = 60;
/** RegularExpression Id. */
- int A2Z = 61;
+ int LANG_DIR = 61;
/** RegularExpression Id. */
- int A2ZN = 62;
+ int A2Z = 62;
/** RegularExpression Id. */
- int SURROGATE_PAIR = 63;
+ int A2ZN = 63;
/** RegularExpression Id. */
- int PN_CHARS_BASE = 64;
+ int SURROGATE_PAIR = 64;
/** RegularExpression Id. */
- int PN_CHARS_U = 65;
+ int PN_CHARS_BASE = 65;
/** RegularExpression Id. */
- int PN_CHARS = 66;
+ int PN_CHARS_U = 66;
/** RegularExpression Id. */
- int PN_PREFIX = 67;
+ int PN_CHARS = 67;
/** RegularExpression Id. */
- int PN_LOCAL = 68;
+ int PN_PREFIX = 68;
/** RegularExpression Id. */
- int VARNAME = 69;
+ int PN_LOCAL = 69;
/** RegularExpression Id. */
- int PN_LOCAL_ESC = 70;
+ int VARNAME = 70;
/** RegularExpression Id. */
- int PLX = 71;
+ int PN_LOCAL_ESC = 71;
/** RegularExpression Id. */
- int HEX = 72;
+ int PLX = 72;
/** RegularExpression Id. */
- int PERCENT = 73;
+ int HEX = 73;
/** RegularExpression Id. */
- int UNKNOWN = 74;
+ int PERCENT = 74;
+ /** RegularExpression Id. */
+ int UNKNOWN = 75;
/** Lexical state. */
int DEFAULT = 0;
@@ -208,6 +210,7 @@ public interface TurtleJavaccConstants {
"<UCHAR>",
"<UCHAR4>",
"<UCHAR8>",
+ "<UCHAR_DELIM>",
"<STRING_LITERAL1>",
"<STRING_LITERAL2>",
"<STRING_LITERAL_LONG1>",
diff --git a/jena-arq/src/main/java/org/apache/jena/riot/lang/turtlejcc/javacc/TurtleJavaccTokenManager.java b/jena-arq/src/main/java/org/apache/jena/riot/lang/turtlejcc/javacc/TurtleJavaccTokenManager.java
index 9de7716a45..a27b3e9122 100644
--- a/jena-arq/src/main/java/org/apache/jena/riot/lang/turtlejcc/javacc/TurtleJavaccTokenManager.java
+++ b/jena-arq/src/main/java/org/apache/jena/riot/lang/turtlejcc/javacc/TurtleJavaccTokenManager.java
@@ -58,32 +58,32 @@ private int jjMoveStringLiteralDfa0_0(){
jjmatchedKind = 1;
return jjMoveNfa_0(0, 0);
case 40:
- jjmatchedKind = 37;
+ jjmatchedKind = 38;
return jjMoveNfa_0(0, 0);
case 41:
- jjmatchedKind = 38;
- return jjMoveStringLiteralDfa1_0(0x4000000000000L);
+ jjmatchedKind = 39;
+ return jjMoveStringLiteralDfa1_0(0x8000000000000L);
case 43:
jjmatchedKind = 20;
return jjMoveNfa_0(0, 0);
case 44:
- jjmatchedKind = 45;
+ jjmatchedKind = 46;
return jjMoveNfa_0(0, 0);
case 45:
jjmatchedKind = 21;
return jjMoveNfa_0(0, 0);
case 46:
- jjmatchedKind = 46;
+ jjmatchedKind = 47;
return jjMoveNfa_0(0, 0);
case 59:
- jjmatchedKind = 44;
+ jjmatchedKind = 45;
return jjMoveNfa_0(0, 0);
case 60:
- return jjMoveStringLiteralDfa1_0(0xa000000000000L);
+ return jjMoveStringLiteralDfa1_0(0x14000000000000L);
case 62:
- return jjMoveStringLiteralDfa1_0(0x10000000000000L);
+ return jjMoveStringLiteralDfa1_0(0x20000000000000L);
case 64:
- jjmatchedKind = 48;
+ jjmatchedKind = 49;
return jjMoveStringLiteralDfa1_0(0xe00L);
case 66:
return jjMoveStringLiteralDfa1_0(0x1000L);
@@ -96,13 +96,13 @@ private int jjMoveStringLiteralDfa0_0(){
case 86:
return jjMoveStringLiteralDfa1_0(0x4000L);
case 91:
- jjmatchedKind = 41;
+ jjmatchedKind = 42;
return jjMoveNfa_0(0, 0);
case 93:
- jjmatchedKind = 42;
+ jjmatchedKind = 43;
return jjMoveNfa_0(0, 0);
case 94:
- return jjMoveStringLiteralDfa1_0(0x800000000000L);
+ return jjMoveStringLiteralDfa1_0(0x1000000000000L);
case 97:
jjmatchedKind = 8;
return jjMoveNfa_0(0, 0);
@@ -117,16 +117,16 @@ private int jjMoveStringLiteralDfa0_0(){
case 118:
return jjMoveStringLiteralDfa1_0(0x4000L);
case 123:
- jjmatchedKind = 39;
- return jjMoveStringLiteralDfa1_0(0x20000000000000L);
- case 124:
- jjmatchedKind = 56;
+ jjmatchedKind = 40;
return jjMoveStringLiteralDfa1_0(0x40000000000000L);
+ case 124:
+ jjmatchedKind = 57;
+ return jjMoveStringLiteralDfa1_0(0x80000000000000L);
case 125:
- jjmatchedKind = 40;
+ jjmatchedKind = 41;
return jjMoveNfa_0(0, 0);
case 126:
- jjmatchedKind = 55;
+ jjmatchedKind = 56;
return jjMoveNfa_0(0, 0);
case 65279:
jjmatchedKind = 18;
@@ -143,19 +143,19 @@ private int jjMoveStringLiteralDfa1_0(long active0){
switch(curChar)
{
case 60:
- if ((active0 & 0x8000000000000L) != 0L)
+ if ((active0 & 0x10000000000000L) != 0L)
{
- jjmatchedKind = 51;
+ jjmatchedKind = 52;
jjmatchedPos = 1;
}
- return jjMoveStringLiteralDfa2_0(active0, 0x2000000000000L);
+ return jjMoveStringLiteralDfa2_0(active0, 0x4000000000000L);
case 62:
- if ((active0 & 0x10000000000000L) != 0L)
+ if ((active0 & 0x20000000000000L) != 0L)
{
- jjmatchedKind = 52;
+ jjmatchedKind = 53;
jjmatchedPos = 1;
}
- return jjMoveStringLiteralDfa2_0(active0, 0x4000000000000L);
+ return jjMoveStringLiteralDfa2_0(active0, 0x8000000000000L);
case 65:
return jjMoveStringLiteralDfa2_0(active0, 0x11000L);
case 69:
@@ -163,9 +163,9 @@ private int jjMoveStringLiteralDfa1_0(long active0){
case 82:
return jjMoveStringLiteralDfa2_0(active0, 0xa000L);
case 94:
- if ((active0 & 0x800000000000L) != 0L)
+ if ((active0 & 0x1000000000000L) != 0L)
{
- jjmatchedKind = 47;
+ jjmatchedKind = 48;
jjmatchedPos = 1;
}
break;
@@ -182,16 +182,16 @@ private int jjMoveStringLiteralDfa1_0(long active0){
case 118:
return jjMoveStringLiteralDfa2_0(active0, 0x800L);
case 124:
- if ((active0 & 0x20000000000000L) != 0L)
+ if ((active0 & 0x40000000000000L) != 0L)
{
- jjmatchedKind = 53;
+ jjmatchedKind = 54;
jjmatchedPos = 1;
}
break;
case 125:
- if ((active0 & 0x40000000000000L) != 0L)
+ if ((active0 & 0x80000000000000L) != 0L)
{
- jjmatchedKind = 54;
+ jjmatchedKind = 55;
jjmatchedPos = 1;
}
break;
@@ -210,16 +210,16 @@ private int jjMoveStringLiteralDfa2_0(long old0, long active0){
switch(curChar)
{
case 40:
- if ((active0 & 0x2000000000000L) != 0L)
+ if ((active0 & 0x4000000000000L) != 0L)
{
- jjmatchedKind = 49;
+ jjmatchedKind = 50;
jjmatchedPos = 2;
}
break;
case 62:
- if ((active0 & 0x4000000000000L) != 0L)
+ if ((active0 & 0x8000000000000L) != 0L)
{
- jjmatchedKind = 50;
+ jjmatchedKind = 51;
jjmatchedPos = 2;
}
break;
@@ -483,7 +483,7 @@ private int jjMoveNfa_0(int startState, int curPos)
catch(java.io.IOException e) { throw new Error("Internal Error"); }
curPos = 0;
int startsAt = 0;
- jjnewStateCnt = 184;
+ jjnewStateCnt = 204;
int i = 1;
jjstateSet[0] = startState;
int kind = 0x7fffffff;
@@ -509,16 +509,16 @@ private int jjMoveNfa_0(int startState, int curPos)
{ jjCheckNAddStates(6, 10); }
else if (curChar == 58)
{
- if (kind > 57)
- kind = 57;
+ if (kind > 58)
+ kind = 58;
{ jjCheckNAddStates(11, 14); }
}
else if (curChar == 46)
- { jjCheckNAddTwoStates(135, 143); }
+ { jjCheckNAddTwoStates(155, 163); }
else if (curChar == 34)
- jjstateSet[jjnewStateCnt++] = 104;
+ jjstateSet[jjnewStateCnt++] = 124;
else if (curChar == 39)
- jjstateSet[jjnewStateCnt++] = 80;
+ jjstateSet[jjnewStateCnt++] = 96;
else if (curChar == 60)
{ jjCheckNAddStates(15, 17); }
else if (curChar == 35)
@@ -563,21 +563,9 @@ private int jjMoveNfa_0(int startState, int curPos)
if (curChar == 62 && kind > 19)
kind = 19;
break;
- case 10:
- if ((0x3ff000000000000L & l) != 0L)
- jjstateSet[jjnewStateCnt++] = 11;
- break;
case 11:
if ((0x3ff000000000000L & l) != 0L)
- jjstateSet[jjnewStateCnt++] = 12;
- break;
- case 12:
- if ((0x3ff000000000000L & l) != 0L)
- jjstateSet[jjnewStateCnt++] = 13;
- break;
- case 13:
- if ((0x3ff000000000000L & l) != 0L)
- jjstateSet[jjnewStateCnt++] = 14;
+ { jjAddStates(27, 28); }
break;
case 14:
if ((0x3ff000000000000L & l) != 0L)
@@ -588,519 +576,551 @@ private int jjMoveNfa_0(int startState, int curPos)
jjstateSet[jjnewStateCnt++] = 16;
break;
case 16:
- case 21:
if ((0x3ff000000000000L & l) != 0L)
- { jjCheckNAdd(17); }
+ jjstateSet[jjnewStateCnt++] = 17;
break;
case 17:
if ((0x3ff000000000000L & l) != 0L)
- { jjCheckNAddStates(15, 17); }
+ jjstateSet[jjnewStateCnt++] = 18;
+ break;
+ case 18:
+ if ((0x3ff000000000000L & l) != 0L)
+ jjstateSet[jjnewStateCnt++] = 19;
break;
case 19:
if ((0x3ff000000000000L & l) != 0L)
jjstateSet[jjnewStateCnt++] = 20;
break;
case 20:
+ case 25:
if ((0x3ff000000000000L & l) != 0L)
- jjstateSet[jjnewStateCnt++] = 21;
+ { jjCheckNAdd(21); }
break;
- case 22:
+ case 21:
+ if ((0x3ff000000000000L & l) != 0L)
+ { jjCheckNAddStates(15, 17); }
+ break;
+ case 23:
+ if ((0x3ff000000000000L & l) != 0L)
+ jjstateSet[jjnewStateCnt++] = 24;
+ break;
+ case 24:
+ if ((0x3ff000000000000L & l) != 0L)
+ jjstateSet[jjnewStateCnt++] = 25;
+ break;
+ case 26:
if (curChar == 39)
{ jjCheckNAddStates(24, 26); }
break;
- case 23:
+ case 27:
if ((0xffffff7fffffdbffL & l) != 0L)
{ jjCheckNAddStates(24, 26); }
break;
- case 24:
- if (curChar == 39 && kind > 33)
- kind = 33;
+ case 28:
+ if (curChar == 39 && kind > 34)
+ kind = 34;
break;
- case 26:
+ case 30:
if ((0x8400000000L & l) != 0L)
{ jjCheckNAddStates(24, 26); }
break;
- case 28:
+ case 33:
if ((0x3ff000000000000L & l) != 0L)
- jjstateSet[jjnewStateCnt++] = 29;
+ { jjAddStates(29, 30); }
break;
- case 29:
+ case 36:
if ((0x3ff000000000000L & l) != 0L)
- jjstateSet[jjnewStateCnt++] = 30;
+ jjstateSet[jjnewStateCnt++] = 37;
break;
- case 30:
+ case 37:
if ((0x3ff000000000000L & l) != 0L)
- jjstateSet[jjnewStateCnt++] = 31;
+ jjstateSet[jjnewStateCnt++] = 38;
break;
- case 31:
+ case 38:
if ((0x3ff000000000000L & l) != 0L)
- jjstateSet[jjnewStateCnt++] = 32;
+ jjstateSet[jjnewStateCnt++] = 39;
break;
- case 32:
+ case 39:
if ((0x3ff000000000000L & l) != 0L)
- jjstateSet[jjnewStateCnt++] = 33;
+ jjstateSet[jjnewStateCnt++] = 40;
break;
- case 33:
+ case 40:
if ((0x3ff000000000000L & l) != 0L)
- jjstateSet[jjnewStateCnt++] = 34;
+ jjstateSet[jjnewStateCnt++] = 41;
break;
- case 34:
- case 39:
+ case 41:
if ((0x3ff000000000000L & l) != 0L)
- { jjCheckNAdd(35); }
+ jjstateSet[jjnewStateCnt++] = 42;
break;
- case 35:
+ case 42:
+ case 47:
+ if ((0x3ff000000000000L & l) != 0L)
+ { jjCheckNAdd(43); }
+ break;
+ case 43:
if ((0x3ff000000000000L & l) != 0L)
{ jjCheckNAddStates(24, 26); }
break;
- case 37:
+ case 45:
if ((0x3ff000000000000L & l) != 0L)
- jjstateSet[jjnewStateCnt++] = 38;
+ jjstateSet[jjnewStateCnt++] = 46;
break;
- case 38:
+ case 46:
if ((0x3ff000000000000L & l) != 0L)
- jjstateSet[jjnewStateCnt++] = 39;
+ jjstateSet[jjnewStateCnt++] = 47;
break;
- case 40:
+ case 48:
if (curChar == 34)
{ jjCheckNAddStates(21, 23); }
break;
- case 41:
+ case 49:
if ((0xfffffffbffffdbffL & l) != 0L)
{ jjCheckNAddStates(21, 23); }
break;
- case 42:
- if (curChar == 34 && kind > 34)
- kind = 34;
+ case 50:
+ if (curChar == 34 && kind > 35)
+ kind = 35;
break;
- case 44:
+ case 52:
if ((0x8400000000L & l) != 0L)
{ jjCheckNAddStates(21, 23); }
break;
- case 46:
+ case 55:
if ((0x3ff000000000000L & l) != 0L)
- jjstateSet[jjnewStateCnt++] = 47;
+ { jjAddStates(31, 32); }
break;
- case 47:
+ case 58:
if ((0x3ff000000000000L & l) != 0L)
- jjstateSet[jjnewStateCnt++] = 48;
+ jjstateSet[jjnewStateCnt++] = 59;
break;
- case 48:
+ case 59:
if ((0x3ff000000000000L & l) != 0L)
- jjstateSet[jjnewStateCnt++] = 49;
+ jjstateSet[jjnewStateCnt++] = 60;
break;
- case 49:
+ case 60:
if ((0x3ff000000000000L & l) != 0L)
- jjstateSet[jjnewStateCnt++] = 50;
+ jjstateSet[jjnewStateCnt++] = 61;
break;
- case 50:
+ case 61:
if ((0x3ff000000000000L & l) != 0L)
- jjstateSet[jjnewStateCnt++] = 51;
+ jjstateSet[jjnewStateCnt++] = 62;
break;
- case 51:
+ case 62:
if ((0x3ff000000000000L & l) != 0L)
- jjstateSet[jjnewStateCnt++] = 52;
+ jjstateSet[jjnewStateCnt++] = 63;
break;
- case 52:
- case 57:
+ case 63:
if ((0x3ff000000000000L & l) != 0L)
- { jjCheckNAdd(53); }
+ jjstateSet[jjnewStateCnt++] = 64;
break;
- case 53:
+ case 64:
+ case 69:
+ if ((0x3ff000000000000L & l) != 0L)
+ { jjCheckNAdd(65); }
+ break;
+ case 65:
if ((0x3ff000000000000L & l) != 0L)
{ jjCheckNAddStates(21, 23); }
break;
- case 55:
+ case 67:
if ((0x3ff000000000000L & l) != 0L)
- jjstateSet[jjnewStateCnt++] = 56;
+ jjstateSet[jjnewStateCnt++] = 68;
break;
- case 56:
+ case 68:
if ((0x3ff000000000000L & l) != 0L)
- jjstateSet[jjnewStateCnt++] = 57;
+ jjstateSet[jjnewStateCnt++] = 69;
break;
- case 58:
+ case 70:
if (curChar == 39)
- { jjCheckNAddStates(27, 30); }
+ { jjCheckNAddStates(33, 36); }
break;
- case 59:
- case 62:
+ case 71:
+ case 74:
if (curChar == 39)
- { jjCheckNAddTwoStates(60, 63); }
+ { jjCheckNAddTwoStates(72, 75); }
break;
- case 60:
+ case 72:
if ((0xffffff7fffffffffL & l) != 0L)
- { jjCheckNAddStates(27, 30); }
+ { jjCheckNAddStates(33, 36); }
break;
- case 61:
+ case 73:
if (curChar == 39)
- { jjAddStates(31, 32); }
+ { jjAddStates(37, 38); }
break;
- case 64:
+ case 76:
if ((0x8400000000L & l) != 0L)
- { jjCheckNAddStates(27, 30); }
+ { jjCheckNAddStates(33, 36); }
break;
- case 66:
+ case 79:
if ((0x3ff000000000000L & l) != 0L)
- jjstateSet[jjnewStateCnt++] = 67;
+ { jjAddStates(39, 40); }
break;
- case 67:
+ case 82:
if ((0x3ff000000000000L & l) != 0L)
- jjstateSet[jjnewStateCnt++] = 68;
+ jjstateSet[jjnewStateCnt++] = 83;
break;
- case 68:
+ case 83:
if ((0x3ff000000000000L & l) != 0L)
- jjstateSet[jjnewStateCnt++] = 69;
+ jjstateSet[jjnewStateCnt++] = 84;
break;
- case 69:
+ case 84:
if ((0x3ff000000000000L & l) != 0L)
- jjstateSet[jjnewStateCnt++] = 70;
+ jjstateSet[jjnewStateCnt++] = 85;
break;
- case 70:
+ case 85:
if ((0x3ff000000000000L & l) != 0L)
- jjstateSet[jjnewStateCnt++] = 71;
+ jjstateSet[jjnewStateCnt++] = 86;
break;
- case 71:
+ case 86:
if ((0x3ff000000000000L & l) != 0L)
- jjstateSet[jjnewStateCnt++] = 72;
+ jjstateSet[jjnewStateCnt++] = 87;
break;
- case 72:
- case 77:
+ case 87:
if ((0x3ff000000000000L & l) != 0L)
- { jjCheckNAdd(73); }
+ jjstateSet[jjnewStateCnt++] = 88;
break;
- case 73:
+ case 88:
+ case 93:
if ((0x3ff000000000000L & l) != 0L)
- { jjCheckNAddStates(27, 30); }
+ { jjCheckNAdd(89); }
break;
- case 75:
+ case 89:
if ((0x3ff000000000000L & l) != 0L)
- jjstateSet[jjnewStateCnt++] = 76;
+ { jjCheckNAddStates(33, 36); }
break;
- case 76:
+ case 91:
if ((0x3ff000000000000L & l) != 0L)
- jjstateSet[jjnewStateCnt++] = 77;
+ jjstateSet[jjnewStateCnt++] = 92;
break;
- case 78:
- if (curChar == 39 && kind > 35)
- kind = 35;
+ case 92:
+ if ((0x3ff000000000000L & l) != 0L)
+ jjstateSet[jjnewStateCnt++] = 93;
break;
- case 79:
+ case 94:
+ if (curChar == 39 && kind > 36)
+ kind = 36;
+ break;
+ case 95:
if (curChar == 39)
- jjstateSet[jjnewStateCnt++] = 78;
+ jjstateSet[jjnewStateCnt++] = 94;
break;
- case 80:
+ case 96:
if (curChar == 39)
- jjstateSet[jjnewStateCnt++] = 58;
+ jjstateSet[jjnewStateCnt++] = 70;
break;
- case 81:
+ case 97:
if (curChar == 39)
- jjstateSet[jjnewStateCnt++] = 80;
+ jjstateSet[jjnewStateCnt++] = 96;
break;
- case 82:
+ case 98:
if (curChar == 34)
- { jjCheckNAddStates(33, 36); }
+ { jjCheckNAddStates(41, 44); }
break;
- case 83:
- case 86:
+ case 99:
+ case 102:
if (curChar == 34)
- { jjCheckNAddTwoStates(84, 87); }
+ { jjCheckNAddTwoStates(100, 103); }
break;
- case 84:
+ case 100:
if ((0xfffffffbffffffffL & l) != 0L)
- { jjCheckNAddStates(33, 36); }
+ { jjCheckNAddStates(41, 44); }
break;
- case 85:
+ case 101:
if (curChar == 34)
- { jjAddStates(37, 38); }
+ { jjAddStates(45, 46); }
break;
- case 88:
+ case 104:
if ((0x8400000000L & l) != 0L)
- { jjCheckNAddStates(33, 36); }
+ { jjCheckNAddStates(41, 44); }
break;
- case 90:
+ case 107:
if ((0x3ff000000000000L & l) != 0L)
- jjstateSet[jjnewStateCnt++] = 91;
+ { jjAddStates(47, 48); }
break;
- case 91:
+ case 110:
if ((0x3ff000000000000L & l) != 0L)
- jjstateSet[jjnewStateCnt++] = 92;
+ jjstateSet[jjnewStateCnt++] = 111;
break;
- case 92:
+ case 111:
if ((0x3ff000000000000L & l) != 0L)
- jjstateSet[jjnewStateCnt++] = 93;
+ jjstateSet[jjnewStateCnt++] = 112;
break;
- case 93:
+ case 112:
if ((0x3ff000000000000L & l) != 0L)
- jjstateSet[jjnewStateCnt++] = 94;
+ jjstateSet[jjnewStateCnt++] = 113;
break;
- case 94:
+ case 113:
if ((0x3ff000000000000L & l) != 0L)
- jjstateSet[jjnewStateCnt++] = 95;
+ jjstateSet[jjnewStateCnt++] = 114;
break;
- case 95:
+ case 114:
if ((0x3ff000000000000L & l) != 0L)
- jjstateSet[jjnewStateCnt++] = 96;
+ jjstateSet[jjnewStateCnt++] = 115;
break;
- case 96:
- case 101:
+ case 115:
if ((0x3ff000000000000L & l) != 0L)
- { jjCheckNAdd(97); }
+ jjstateSet[jjnewStateCnt++] = 116;
break;
- case 97:
+ case 116:
+ case 121:
if ((0x3ff000000000000L & l) != 0L)
- { jjCheckNAddStates(33, 36); }
+ { jjCheckNAdd(117); }
break;
- case 99:
+ case 117:
if ((0x3ff000000000000L & l) != 0L)
- jjstateSet[jjnewStateCnt++] = 100;
+ { jjCheckNAddStates(41, 44); }
break;
- case 100:
+ case 119:
if ((0x3ff000000000000L & l) != 0L)
- jjstateSet[jjnewStateCnt++] = 101;
+ jjstateSet[jjnewStateCnt++] = 120;
break;
- case 102:
- if (curChar == 34 && kind > 36)
- kind = 36;
+ case 120:
+ if ((0x3ff000000000000L & l) != 0L)
+ jjstateSet[jjnewStateCnt++] = 121;
break;
- case 103:
+ case 122:
+ if (curChar == 34 && kind > 37)
+ kind = 37;
+ break;
+ case 123:
if (curChar == 34)
- jjstateSet[jjnewStateCnt++] = 102;
+ jjstateSet[jjnewStateCnt++] = 122;
break;
- case 104:
+ case 124:
if (curChar == 34)
- jjstateSet[jjnewStateCnt++] = 82;
+ jjstateSet[jjnewStateCnt++] = 98;
break;
- case 105:
+ case 125:
if (curChar == 34)
- jjstateSet[jjnewStateCnt++] = 104;
+ jjstateSet[jjnewStateCnt++] = 124;
break;
- case 107:
+ case 127:
if (curChar == 35)
- { jjCheckNAddStates(39, 44); }
+ { jjCheckNAddStates(49, 54); }
break;
- case 108:
+ case 128:
if ((0xffffffffffffdbffL & l) != 0L)
- { jjCheckNAddStates(39, 44); }
+ { jjCheckNAddStates(49, 54); }
break;
- case 109:
+ case 129:
if ((0x2400L & l) != 0L)
- { jjCheckNAddStates(45, 47); }
+ { jjCheckNAddStates(55, 57); }
break;
- case 110:
+ case 130:
if ((0x100003600L & l) != 0L)
- { jjCheckNAddStates(45, 47); }
+ { jjCheckNAddStates(55, 57); }
break;
- case 112:
+ case 132:
if (curChar == 10)
- { jjCheckNAddStates(45, 47); }
+ { jjCheckNAddStates(55, 57); }
break;
- case 113:
+ case 133:
if (curChar == 13)
- jjstateSet[jjnewStateCnt++] = 112;
+ jjstateSet[jjnewStateCnt++] = 132;
break;
- case 114:
+ case 134:
if (curChar == 58)
- { jjAddStates(48, 49); }
+ { jjAddStates(58, 59); }
break;
- case 115:
+ case 135:
if ((0x3ff000000000000L & l) == 0L)
break;
- if (kind > 59)
- kind = 59;
- { jjCheckNAddStates(50, 52); }
+ if (kind > 60)
+ kind = 60;
+ { jjCheckNAddStates(60, 62); }
break;
- case 116:
+ case 136:
if ((0x3ff600000000000L & l) != 0L)
- { jjCheckNAddStates(50, 52); }
+ { jjCheckNAddStates(60, 62); }
break;
- case 117:
- if ((0x3ff200000000000L & l) != 0L && kind > 59)
- kind = 59;
+ case 137:
+ if ((0x3ff200000000000L & l) != 0L && kind > 60)
+ kind = 60;
break;
- case 126:
+ case 146:
if (curChar == 45)
- { jjCheckNAdd(127); }
+ { jjCheckNAdd(147); }
break;
- case 127:
+ case 147:
if ((0x3ff000000000000L & l) == 0L)
break;
- if (kind > 60)
- kind = 60;
- { jjCheckNAddStates(53, 55); }
+ if (kind > 61)
+ kind = 61;
+ { jjCheckNAddStates(63, 65); }
break;
- case 128:
+ case 148:
if (curChar != 45)
break;
- if (kind > 60)
- kind = 60;
- jjstateSet[jjnewStateCnt++] = 129;
+ if (kind > 61)
+ kind = 61;
+ jjstateSet[jjnewStateCnt++] = 149;
break;
- case 130:
+ case 150:
if (curChar == 45)
- jjstateSet[jjnewStateCnt++] = 128;
+ jjstateSet[jjnewStateCnt++] = 148;
break;
- case 131:
+ case 151:
if ((0x280000000000L & l) != 0L)
{ jjCheckNAddStates(6, 10); }
break;
- case 132:
+ case 152:
if ((0x3ff000000000000L & l) == 0L)
break;
if (kind > 23)
kind = 23;
- { jjCheckNAdd(132); }
+ { jjCheckNAdd(152); }
break;
- case 133:
+ case 153:
if ((0x3ff000000000000L & l) != 0L)
- { jjCheckNAddTwoStates(133, 134); }
+ { jjCheckNAddTwoStates(153, 154); }
break;
- case 134:
+ case 154:
if (curChar == 46)
- { jjCheckNAdd(135); }
+ { jjCheckNAdd(155); }
break;
- case 135:
+ case 155:
if ((0x3ff000000000000L & l) == 0L)
break;
if (kind > 24)
kind = 24;
- { jjCheckNAdd(135); }
+ { jjCheckNAdd(155); }
break;
- case 136:
+ case 156:
if ((0x3ff000000000000L & l) != 0L)
- { jjCheckNAddStates(56, 58); }
+ { jjCheckNAddStates(66, 68); }
break;
- case 137:
+ case 157:
if (curChar == 46)
- { jjCheckNAddTwoStates(138, 139); }
+ { jjCheckNAddTwoStates(158, 159); }
break;
- case 138:
+ case 158:
if ((0x3ff000000000000L & l) != 0L)
- { jjCheckNAddTwoStates(138, 139); }
+ { jjCheckNAddTwoStates(158, 159); }
break;
- case 140:
+ case 160:
if ((0x280000000000L & l) != 0L)
- { jjCheckNAdd(141); }
+ { jjCheckNAdd(161); }
break;
- case 141:
+ case 161:
if ((0x3ff000000000000L & l) == 0L)
break;
if (kind > 25)
kind = 25;
- { jjCheckNAdd(141); }
+ { jjCheckNAdd(161); }
break;
- case 142:
+ case 162:
if (curChar == 46)
- { jjCheckNAdd(143); }
+ { jjCheckNAdd(163); }
break;
- case 143:
+ case 163:
if ((0x3ff000000000000L & l) != 0L)
- { jjCheckNAddTwoStates(143, 139); }
+ { jjCheckNAddTwoStates(163, 159); }
break;
- case 144:
+ case 164:
if ((0x3ff000000000000L & l) == 0L)
break;
if (kind > 23)
kind = 23;
{ jjCheckNAddStates(0, 5); }
break;
- case 145:
+ case 165:
if (curChar == 46)
- { jjCheckNAddTwoStates(135, 143); }
+ { jjCheckNAddTwoStates(155, 163); }
break;
- case 147:
+ case 167:
if ((0x3ff600000000000L & l) != 0L)
- { jjAddStates(59, 61); }
+ { jjAddStates(69, 71); }
break;
- case 148:
+ case 168:
if ((0x3ff200000000000L & l) != 0L)
- jjstateSet[jjnewStateCnt++] = 149;
+ jjstateSet[jjnewStateCnt++] = 169;
break;
- case 149:
- if (curChar == 58 && kind > 57)
- kind = 57;
+ case 169:
+ if (curChar == 58 && kind > 58)
+ kind = 58;
break;
- case 153:
+ case 173:
if ((0x3ff600000000000L & l) != 0L)
- { jjAddStates(62, 64); }
+ { jjAddStates(72, 74); }
break;
- case 154:
+ case 174:
if ((0x3ff200000000000L & l) != 0L)
- jjstateSet[jjnewStateCnt++] = 155;
+ jjstateSet[jjnewStateCnt++] = 175;
break;
- case 155:
+ case 175:
if (curChar == 58)
{ jjCheckNAddStates(11, 14); }
break;
- case 156:
+ case 176:
if ((0x7ff000000000000L & l) == 0L)
break;
- if (kind > 58)
- kind = 58;
- { jjCheckNAddStates(65, 69); }
+ if (kind > 59)
+ kind = 59;
+ { jjCheckNAddStates(75, 79); }
break;
- case 157:
+ case 177:
if ((0x7ff600000000000L & l) != 0L)
- { jjCheckNAddStates(65, 69); }
+ { jjCheckNAddStates(75, 79); }
break;
- case 158:
- if ((0x7ff200000000000L & l) != 0L && kind > 58)
- kind = 58;
+ case 178:
+ if ((0x7ff200000000000L & l) != 0L && kind > 59)
+ kind = 59;
break;
- case 162:
+ case 182:
if ((0xa800fffa00000000L & l) != 0L)
- { jjCheckNAddStates(65, 69); }
+ { jjCheckNAddStates(75, 79); }
break;
- case 163:
+ case 183:
if (curChar == 37)
- { jjAddStates(70, 71); }
+ { jjAddStates(80, 81); }
break;
- case 164:
+ case 184:
if ((0x3ff000000000000L & l) != 0L)
- jjstateSet[jjnewStateCnt++] = 165;
+ jjstateSet[jjnewStateCnt++] = 185;
break;
- case 165:
+ case 185:
if ((0x3ff000000000000L & l) != 0L)
- { jjCheckNAddStates(65, 69); }
+ { jjCheckNAddStates(75, 79); }
break;
- case 166:
+ case 186:
if ((0x3ff000000000000L & l) != 0L)
- jjstateSet[jjnewStateCnt++] = 167;
+ jjstateSet[jjnewStateCnt++] = 187;
break;
- case 167:
- if ((0x3ff000000000000L & l) != 0L && kind > 58)
- kind = 58;
+ case 187:
+ if ((0x3ff000000000000L & l) != 0L && kind > 59)
+ kind = 59;
break;
- case 168:
- if ((0xa800fffa00000000L & l) != 0L && kind > 58)
- kind = 58;
+ case 188:
+ if ((0xa800fffa00000000L & l) != 0L && kind > 59)
+ kind = 59;
break;
- case 171:
+ case 191:
if ((0xa800fffa00000000L & l) == 0L)
break;
- if (kind > 58)
- kind = 58;
- { jjCheckNAddStates(65, 69); }
+ if (kind > 59)
+ kind = 59;
+ { jjCheckNAddStates(75, 79); }
break;
- case 172:
+ case 192:
if (curChar == 37)
- jjstateSet[jjnewStateCnt++] = 173;
+ jjstateSet[jjnewStateCnt++] = 193;
break;
- case 173:
+ case 193:
if ((0x3ff000000000000L & l) != 0L)
- jjstateSet[jjnewStateCnt++] = 174;
+ jjstateSet[jjnewStateCnt++] = 194;
break;
- case 174:
+ case 194:
if ((0x3ff000000000000L & l) == 0L)
break;
- if (kind > 58)
- kind = 58;
- { jjCheckNAddStates(65, 69); }
+ if (kind > 59)
+ kind = 59;
+ { jjCheckNAddStates(75, 79); }
break;
- case 183:
+ case 203:
if (curChar != 58)
break;
- if (kind > 57)
- kind = 57;
+ if (kind > 58)
+ kind = 58;
{ jjCheckNAddStates(11, 14); }
break;
default : break;
@@ -1116,13 +1136,13 @@ private int jjMoveNfa_0(int startState, int curPos)
{
case 0:
if ((0x7fffffe07fffffeL & l) != 0L)
- { jjCheckNAddStates(72, 79); }
+ { jjCheckNAddStates(82, 89); }
else if (curChar == 64)
- { jjCheckNAdd(125); }
+ { jjCheckNAdd(145); }
else if (curChar == 95)
- jjstateSet[jjnewStateCnt++] = 114;
+ jjstateSet[jjnewStateCnt++] = 134;
else if (curChar == 91)
- { jjCheckNAddStates(45, 47); }
+ { jjCheckNAddStates(55, 57); }
break;
case 1:
if (kind > 7)
@@ -1135,26 +1155,26 @@ private int jjMoveNfa_0(int startState, int curPos)
break;
case 8:
if (curChar == 92)
- { jjAddStates(80, 81); }
+ { jjAddStates(90, 92); }
break;
case 9:
- if (curChar == 85)
+ if (curChar == 117)
jjstateSet[jjnewStateCnt++] = 10;
break;
case 10:
- if ((0x7e0000007eL & l) != 0L)
- jjstateSet[jjnewStateCnt++] = 11;
+ if (curChar == 123)
+ { jjCheckNAdd(11); }
break;
case 11:
if ((0x7e0000007eL & l) != 0L)
- jjstateSet[jjnewStateCnt++] = 12;
+ { jjCheckNAddTwoStates(11, 12); }
break;
case 12:
- if ((0x7e0000007eL & l) != 0L)
- jjstateSet[jjnewStateCnt++] = 13;
+ if (curChar == 125)
+ { jjCheckNAddStates(15, 17); }
break;
case 13:
- if ((0x7e0000007eL & l) != 0L)
+ if (curChar == 85)
jjstateSet[jjnewStateCnt++] = 14;
break;
case 14:
@@ -1166,16 +1186,15 @@ private int jjMoveNfa_0(int startState, int curPos)
jjstateSet[jjnewStateCnt++] = 16;
break;
case 16:
- case 21:
if ((0x7e0000007eL & l) != 0L)
- { jjCheckNAdd(17); }
+ jjstateSet[jjnewStateCnt++] = 17;
break;
case 17:
if ((0x7e0000007eL & l) != 0L)
- { jjCheckNAddStates(15, 17); }
+ jjstateSet[jjnewStateCnt++] = 18;
break;
case 18:
- if (curChar == 117)
+ if ((0x7e0000007eL & l) != 0L)
jjstateSet[jjnewStateCnt++] = 19;
break;
case 19:
@@ -1183,60 +1202,60 @@ private int jjMoveNfa_0(int startState, int curPos)
jjstateSet[jjnewStateCnt++] = 20;
break;
case 20:
+ case 25:
if ((0x7e0000007eL & l) != 0L)
- jjstateSet[jjnewStateCnt++] = 21;
- break;
- case 23:
- if ((0xffffffffefffffffL & l) != 0L)
- { jjCheckNAddStates(24, 26); }
+ { jjCheckNAdd(21); }
break;
- case 25:
- if (curChar == 92)
- { jjAddStates(82, 84); }
+ case 21:
+ if ((0x7e0000007eL & l) != 0L)
+ { jjCheckNAddStates(15, 17); }
break;
- case 26:
- if ((0x14404410000000L & l) != 0L)
- { jjCheckNAddStates(24, 26); }
+ case 22:
+ if (curChar == 117)
+ jjstateSet[jjnewStateCnt++] = 23;
break;
- case 27:
- if (curChar == 85)
- jjstateSet[jjnewStateCnt++] = 28;
+ case 23:
+ if ((0x7e0000007eL & l) != 0L)
+ jjstateSet[jjnewStateCnt++] = 24;
break;
- case 28:
+ case 24:
if ((0x7e0000007eL & l) != 0L)
- jjstateSet[jjnewStateCnt++] = 29;
+ jjstateSet[jjnewStateCnt++] = 25;
+ break;
+ case 27:
+ if ((0xffffffffefffffffL & l) != 0L)
+ { jjCheckNAddStates(24, 26); }
break;
case 29:
- if ((0x7e0000007eL & l) != 0L)
- jjstateSet[jjnewStateCnt++] = 30;
+ if (curChar == 92)
+ { jjAddStates(93, 96); }
break;
case 30:
- if ((0x7e0000007eL & l) != 0L)
- jjstateSet[jjnewStateCnt++] = 31;
+ if ((0x14404410000000L & l) != 0L)
+ { jjCheckNAddStates(24, 26); }
break;
case 31:
- if ((0x7e0000007eL & l) != 0L)
+ if (curChar == 117)
jjstateSet[jjnewStateCnt++] = 32;
break;
case 32:
- if ((0x7e0000007eL & l) != 0L)
- jjstateSet[jjnewStateCnt++] = 33;
+ if (curChar == 123)
+ { jjCheckNAdd(33); }
break;
case 33:
if ((0x7e0000007eL & l) != 0L)
- jjstateSet[jjnewStateCnt++] = 34;
+ { jjCheckNAddTwoStates(33, 34); }
break;
case 34:
- case 39:
- if ((0x7e0000007eL & l) != 0L)
- { jjCheckNAdd(35); }
+ if (curChar == 125)
+ { jjCheckNAddStates(24, 26); }
break;
case 35:
- if ((0x7e0000007eL & l) != 0L)
- { jjCheckNAddStates(24, 26); }
+ if (curChar == 85)
+ jjstateSet[jjnewStateCnt++] = 36;
break;
case 36:
- if (curChar == 117)
+ if ((0x7e0000007eL & l) != 0L)
jjstateSet[jjnewStateCnt++] = 37;
break;
case 37:
@@ -1247,146 +1266,183 @@ private int jjMoveNfa_0(int startState, int curPos)
if ((0x7e0000007eL & l) != 0L)
jjstateSet[jjnewStateCnt++] = 39;
break;
+ case 39:
+ if ((0x7e0000007eL & l) != 0L)
+ jjstateSet[jjnewStateCnt++] = 40;
+ break;
+ case 40:
+ if ((0x7e0000007eL & l) != 0L)
+ jjstateSet[jjnewStateCnt++] = 41;
+ break;
case 41:
- if ((0xffffffffefffffffL & l) != 0L)
- { jjCheckNAddStates(21, 23); }
+ if ((0x7e0000007eL & l) != 0L)
+ jjstateSet[jjnewStateCnt++] = 42;
+ break;
+ case 42:
+ case 47:
+ if ((0x7e0000007eL & l) != 0L)
+ { jjCheckNAdd(43); }
break;
case 43:
- if (curChar == 92)
- { jjAddStates(85, 87); }
+ if ((0x7e0000007eL & l) != 0L)
+ { jjCheckNAddStates(24, 26); }
break;
case 44:
- if ((0x14404410000000L & l) != 0L)
- { jjCheckNAddStates(21, 23); }
+ if (curChar == 117)
+ jjstateSet[jjnewStateCnt++] = 45;
break;
case 45:
- if (curChar == 85)
+ if ((0x7e0000007eL & l) != 0L)
jjstateSet[jjnewStateCnt++] = 46;
break;
case 46:
if ((0x7e0000007eL & l) != 0L)
jjstateSet[jjnewStateCnt++] = 47;
break;
- case 47:
- if ((0x7e0000007eL & l) != 0L)
- jjstateSet[jjnewStateCnt++] = 48;
- break;
- case 48:
- if ((0x7e0000007eL & l) != 0L)
- jjstateSet[jjnewStateCnt++] = 49;
- break;
case 49:
- if ((0x7e0000007eL & l) != 0L)
- jjstateSet[jjnewStateCnt++] = 50;
- break;
- case 50:
- if ((0x7e0000007eL & l) != 0L)
- jjstateSet[jjnewStateCnt++] = 51;
+ if ((0xffffffffefffffffL & l) != 0L)
+ { jjCheckNAddStates(21, 23); }
break;
case 51:
- if ((0x7e0000007eL & l) != 0L)
- jjstateSet[jjnewStateCnt++] = 52;
+ if (curChar == 92)
+ { jjAddStates(97, 100); }
break;
case 52:
- case 57:
- if ((0x7e0000007eL & l) != 0L)
- { jjCheckNAdd(53); }
+ if ((0x14404410000000L & l) != 0L)
+ { jjCheckNAddStates(21, 23); }
break;
case 53:
- if ((0x7e0000007eL & l) != 0L)
- { jjCheckNAddStates(21, 23); }
+ if (curChar == 117)
+ jjstateSet[jjnewStateCnt++] = 54;
break;
case 54:
- if (curChar == 117)
- jjstateSet[jjnewStateCnt++] = 55;
+ if (curChar == 123)
+ { jjCheckNAdd(55); }
break;
case 55:
if ((0x7e0000007eL & l) != 0L)
- jjstateSet[jjnewStateCnt++] = 56;
+ { jjCheckNAddTwoStates(55, 56); }
break;
case 56:
- if ((0x7e0000007eL & l) != 0L)
- jjstateSet[jjnewStateCnt++] = 57;
- break;
- case 60:
- if ((0xffffffffefffffffL & l) != 0L)
- { jjCheckNAddStates(27, 30); }
- break;
- case 63:
- if (curChar == 92)
- { jjAddStates(88, 90); }
- break;
- case 64:
- if ((0x14404410000000L & l) != 0L)
- { jjCheckNAddStates(27, 30); }
+ if (curChar == 125)
+ { jjCheckNAddStates(21, 23); }
break;
- case 65:
+ case 57:
if (curChar == 85)
- jjstateSet[jjnewStateCnt++] = 66;
+ jjstateSet[jjnewStateCnt++] = 58;
break;
- case 66:
+ case 58:
if ((0x7e0000007eL & l) != 0L)
- jjstateSet[jjnewStateCnt++] = 67;
+ jjstateSet[jjnewStateCnt++] = 59;
break;
- case 67:
+ case 59:
if ((0x7e0000007eL & l) != 0L)
- jjstateSet[jjnewStateCnt++] = 68;
+ jjstateSet[jjnewStateCnt++] = 60;
break;
- case 68:
+ case 60:
if ((0x7e0000007eL & l) != 0L)
- jjstateSet[jjnewStateCnt++] = 69;
+ jjstateSet[jjnewStateCnt++] = 61;
break;
- case 69:
+ case 61:
if ((0x7e0000007eL & l) != 0L)
- jjstateSet[jjnewStateCnt++] = 70;
+ jjstateSet[jjnewStateCnt++] = 62;
break;
- case 70:
+ case 62:
if ((0x7e0000007eL & l) != 0L)
- jjstateSet[jjnewStateCnt++] = 71;
+ jjstateSet[jjnewStateCnt++] = 63;
break;
- case 71:
+ case 63:
if ((0x7e0000007eL & l) != 0L)
- jjstateSet[jjnewStateCnt++] = 72;
+ jjstateSet[jjnewStateCnt++] = 64;
break;
- case 72:
- case 77:
+ case 64:
+ case 69:
if ((0x7e0000007eL & l) != 0L)
- { jjCheckNAdd(73); }
+ { jjCheckNAdd(65); }
break;
- case 73:
+ case 65:
if ((0x7e0000007eL & l) != 0L)
- { jjCheckNAddStates(27, 30); }
+ { jjCheckNAddStates(21, 23); }
break;
- case 74:
+ case 66:
if (curChar == 117)
- jjstateSet[jjnewStateCnt++] = 75;
+ jjstateSet[jjnewStateCnt++] = 67;
break;
- case 75:
+ case 67:
if ((0x7e0000007eL & l) != 0L)
- jjstateSet[jjnewStateCnt++] = 76;
+ jjstateSet[jjnewStateCnt++] = 68;
break;
- case 76:
+ case 68:
if ((0x7e0000007eL & l) != 0L)
- jjstateSet[jjnewStateCnt++] = 77;
+ jjstateSet[jjnewStateCnt++] = 69;
break;
- case 84:
+ case 72:
if ((0xffffffffefffffffL & l) != 0L)
{ jjCheckNAddStates(33, 36); }
break;
- case 87:
+ case 75:
if (curChar == 92)
- { jjAddStates(91, 93); }
+ { jjAddStates(101, 104); }
break;
- case 88:
+ case 76:
if ((0x14404410000000L & l) != 0L)
{ jjCheckNAddStates(33, 36); }
break;
- case 89:
+ case 77:
+ if (curChar == 117)
+ jjstateSet[jjnewStateCnt++] = 78;
+ break;
+ case 78:
+ if (curChar == 123)
+ { jjCheckNAdd(79); }
+ break;
+ case 79:
+ if ((0x7e0000007eL & l) != 0L)
+ { jjCheckNAddTwoStates(79, 80); }
+ break;
+ case 80:
+ if (curChar == 125)
+ { jjCheckNAddStates(33, 36); }
+ break;
+ case 81:
if (curChar == 85)
- jjstateSet[jjnewStateCnt++] = 90;
+ jjstateSet[jjnewStateCnt++] = 82;
break;
- case 90:
+ case 82:
+ if ((0x7e0000007eL & l) != 0L)
+ jjstateSet[jjnewStateCnt++] = 83;
+ break;
+ case 83:
if ((0x7e0000007eL & l) != 0L)
+ jjstateSet[jjnewStateCnt++] = 84;
+ break;
+ case 84:
+ if ((0x7e0000007eL & l) != 0L)
+ jjstateSet[jjnewStateCnt++] = 85;
+ break;
+ case 85:
+ if ((0x7e0000007eL & l) != 0L)
+ jjstateSet[jjnewStateCnt++] = 86;
+ break;
+ case 86:
+ if ((0x7e0000007eL & l) != 0L)
+ jjstateSet[jjnewStateCnt++] = 87;
+ break;
+ case 87:
+ if ((0x7e0000007eL & l) != 0L)
+ jjstateSet[jjnewStateCnt++] = 88;
+ break;
+ case 88:
+ case 93:
+ if ((0x7e0000007eL & l) != 0L)
+ { jjCheckNAdd(89); }
+ break;
+ case 89:
+ if ((0x7e0000007eL & l) != 0L)
+ { jjCheckNAddStates(33, 36); }
+ break;
+ case 90:
+ if (curChar == 117)
jjstateSet[jjnewStateCnt++] = 91;
break;
case 91:
@@ -1397,182 +1453,226 @@ private int jjMoveNfa_0(int startState, int curPos)
if ((0x7e0000007eL & l) != 0L)
jjstateSet[jjnewStateCnt++] = 93;
break;
- case 93:
+ case 100:
+ if ((0xffffffffefffffffL & l) != 0L)
+ { jjCheckNAddStates(41, 44); }
+ break;
+ case 103:
+ if (curChar == 92)
+ { jjAddStates(105, 108); }
+ break;
+ case 104:
+ if ((0x14404410000000L & l) != 0L)
+ { jjCheckNAddStates(41, 44); }
+ break;
+ case 105:
+ if (curChar == 117)
+ jjstateSet[jjnewStateCnt++] = 106;
+ break;
+ case 106:
+ if (curChar == 123)
+ { jjCheckNAdd(107); }
+ break;
+ case 107:
if ((0x7e0000007eL & l) != 0L)
- jjstateSet[jjnewStateCnt++] = 94;
+ { jjCheckNAddTwoStates(107, 108); }
break;
- case 94:
+ case 108:
+ if (curChar == 125)
+ { jjCheckNAddStates(41, 44); }
+ break;
+ case 109:
+ if (curChar == 85)
+ jjstateSet[jjnewStateCnt++] = 110;
+ break;
+ case 110:
if ((0x7e0000007eL & l) != 0L)
- jjstateSet[jjnewStateCnt++] = 95;
+ jjstateSet[jjnewStateCnt++] = 111;
break;
- case 95:
+ case 111:
if ((0x7e0000007eL & l) != 0L)
- jjstateSet[jjnewStateCnt++] = 96;
+ jjstateSet[jjnewStateCnt++] = 112;
break;
- case 96:
- case 101:
+ case 112:
if ((0x7e0000007eL & l) != 0L)
- { jjCheckNAdd(97); }
+ jjstateSet[jjnewStateCnt++] = 113;
break;
- case 97:
+ case 113:
if ((0x7e0000007eL & l) != 0L)
- { jjCheckNAddStates(33, 36); }
+ jjstateSet[jjnewStateCnt++] = 114;
break;
- case 98:
+ case 114:
+ if ((0x7e0000007eL & l) != 0L)
+ jjstateSet[jjnewStateCnt++] = 115;
+ break;
+ case 115:
+ if ((0x7e0000007eL & l) != 0L)
+ jjstateSet[jjnewStateCnt++] = 116;
+ break;
+ case 116:
+ case 121:
+ if ((0x7e0000007eL & l) != 0L)
+ { jjCheckNAdd(117); }
+ break;
+ case 117:
+ if ((0x7e0000007eL & l) != 0L)
+ { jjCheckNAddStates(41, 44); }
+ break;
+ case 118:
if (curChar == 117)
- jjstateSet[jjnewStateCnt++] = 99;
+ jjstateSet[jjnewStateCnt++] = 119;
break;
- case 99:
+ case 119:
if ((0x7e0000007eL & l) != 0L)
- jjstateSet[jjnewStateCnt++] = 100;
+ jjstateSet[jjnewStateCnt++] = 120;
break;
- case 100:
+ case 120:
if ((0x7e0000007eL & l) != 0L)
- jjstateSet[jjnewStateCnt++] = 101;
+ jjstateSet[jjnewStateCnt++] = 121;
break;
- case 106:
+ case 126:
if (curChar == 91)
- { jjCheckNAddStates(45, 47); }
+ { jjCheckNAddStates(55, 57); }
break;
- case 108:
- { jjCheckNAddStates(39, 44); }
+ case 128:
+ { jjCheckNAddStates(49, 54); }
break;
- case 111:
- if (curChar == 93 && kind > 43)
- kind = 43;
+ case 131:
+ if (curChar == 93 && kind > 44)
+ kind = 44;
break;
- case 115:
+ case 135:
if ((0x7fffffe87fffffeL & l) == 0L)
break;
- if (kind > 59)
- kind = 59;
- { jjCheckNAddStates(50, 52); }
+ if (kind > 60)
+ kind = 60;
+ { jjCheckNAddStates(60, 62); }
break;
- case 116:
+ case 136:
if ((0x7fffffe87fffffeL & l) != 0L)
- { jjCheckNAddStates(50, 52); }
+ { jjCheckNAddStates(60, 62); }
break;
- case 117:
- if ((0x7fffffe87fffffeL & l) != 0L && kind > 59)
- kind = 59;
+ case 137:
+ if ((0x7fffffe87fffffeL & l) != 0L && kind > 60)
+ kind = 60;
break;
- case 123:
+ case 143:
if (curChar == 95)
- jjstateSet[jjnewStateCnt++] = 114;
+ jjstateSet[jjnewStateCnt++] = 134;
break;
- case 124:
+ case 144:
if (curChar == 64)
- { jjCheckNAdd(125); }
+ { jjCheckNAdd(145); }
break;
- case 125:
+ case 145:
if ((0x7fffffe07fffffeL & l) == 0L)
break;
- if (kind > 60)
- kind = 60;
- { jjCheckNAddStates(94, 96); }
+ if (kind > 61)
+ kind = 61;
+ { jjCheckNAddStates(109, 111); }
break;
- case 127:
+ case 147:
if ((0x7fffffe07fffffeL & l) == 0L)
break;
- if (kind > 60)
- kind = 60;
- { jjCheckNAddStates(53, 55); }
+ if (kind > 61)
+ kind = 61;
+ { jjCheckNAddStates(63, 65); }
break;
- case 129:
+ case 149:
if ((0x7fffffe07fffffeL & l) == 0L)
break;
- if (kind > 60)
- kind = 60;
- jjstateSet[jjnewStateCnt++] = 129;
+ if (kind > 61)
+ kind = 61;
+ jjstateSet[jjnewStateCnt++] = 149;
break;
- case 139:
+ case 159:
if ((0x2000000020L & l) != 0L)
- { jjAddStates(97, 98); }
+ { jjAddStates(112, 113); }
break;
- case 146:
+ case 166:
if ((0x7fffffe07fffffeL & l) != 0L)
- { jjCheckNAddStates(72, 79); }
+ { jjCheckNAddStates(82, 89); }
break;
- case 147:
+ case 167:
if ((0x7fffffe87fffffeL & l) != 0L)
- { jjCheckNAddStates(59, 61); }
+ { jjCheckNAddStates(69, 71); }
break;
- case 148:
+ case 168:
if ((0x7fffffe87fffffeL & l) != 0L)
- { jjCheckNAdd(149); }
+ { jjCheckNAdd(169); }
break;
- case 153:
+ case 173:
if ((0x7fffffe87fffffeL & l) != 0L)
- { jjCheckNAddStates(62, 64); }
+ { jjCheckNAddStates(72, 74); }
break;
- case 154:
+ case 174:
if ((0x7fffffe87fffffeL & l) != 0L)
- { jjCheckNAdd(155); }
+ { jjCheckNAdd(175); }
break;
- case 156:
+ case 176:
if ((0x7fffffe87fffffeL & l) == 0L)
break;
- if (kind > 58)
- kind = 58;
- { jjCheckNAddStates(65, 69); }
+ if (kind > 59)
+ kind = 59;
+ { jjCheckNAddStates(75, 79); }
break;
- case 157:
+ case 177:
if ((0x7fffffe87fffffeL & l) != 0L)
- { jjCheckNAddStates(65, 69); }
+ { jjCheckNAddStates(75, 79); }
break;
- case 158:
- if ((0x7fffffe87fffffeL & l) != 0L && kind > 58)
- kind = 58;
+ case 178:
+ if ((0x7fffffe87fffffeL & l) != 0L && kind > 59)
+ kind = 59;
break;
- case 161:
+ case 181:
if (curChar == 92)
- { jjAddStates(99, 100); }
+ { jjAddStates(114, 115); }
break;
- case 162:
+ case 182:
if ((0x4000000080000001L & l) != 0L)
- { jjCheckNAddStates(65, 69); }
+ { jjCheckNAddStates(75, 79); }
break;
- case 164:
+ case 184:
if ((0x7e0000007eL & l) != 0L)
- jjstateSet[jjnewStateCnt++] = 165;
+ jjstateSet[jjnewStateCnt++] = 185;
break;
- case 165:
+ case 185:
if ((0x7e0000007eL & l) != 0L)
- { jjCheckNAddStates(65, 69); }
+ { jjCheckNAddStates(75, 79); }
break;
- case 166:
+ case 186:
if ((0x7e0000007eL & l) != 0L)
- jjstateSet[jjnewStateCnt++] = 167;
+ jjstateSet[jjnewStateCnt++] = 187;
break;
- case 167:
- if ((0x7e0000007eL & l) != 0L && kind > 58)
- kind = 58;
+ case 187:
+ if ((0x7e0000007eL & l) != 0L && kind > 59)
+ kind = 59;
break;
- case 168:
- if ((0x4000000080000001L & l) != 0L && kind > 58)
- kind = 58;
+ case 188:
+ if ((0x4000000080000001L & l) != 0L && kind > 59)
+ kind = 59;
break;
- case 170:
+ case 190:
if (curChar == 92)
- jjstateSet[jjnewStateCnt++] = 171;
+ jjstateSet[jjnewStateCnt++] = 191;
break;
- case 171:
+ case 191:
if ((0x4000000080000001L & l) == 0L)
break;
- if (kind > 58)
- kind = 58;
- { jjCheckNAddStates(65, 69); }
+ if (kind > 59)
+ kind = 59;
+ { jjCheckNAddStates(75, 79); }
break;
- case 173:
+ case 193:
if ((0x7e0000007eL & l) != 0L)
- jjstateSet[jjnewStateCnt++] = 174;
+ jjstateSet[jjnewStateCnt++] = 194;
break;
- case 174:
+ case 194:
if ((0x7e0000007eL & l) == 0L)
break;
- if (kind > 58)
- kind = 58;
- { jjCheckNAddStates(65, 69); }
+ if (kind > 59)
+ kind = 59;
+ { jjCheckNAddStates(75, 79); }
break;
default : break;
}
@@ -1591,9 +1691,9 @@ private int jjMoveNfa_0(int startState, int curPos)
{
case 0:
if (jjCanMove_1(hiByte, i1, i2, l1, l2))
- { jjCheckNAddStates(72, 79); }
+ { jjCheckNAddStates(82, 89); }
if (jjCanMove_19(hiByte, i1, i2, l1, l2))
- { jjAddStates(101, 102); }
+ { jjAddStates(116, 117); }
break;
case 1:
if (!jjCanMove_0(hiByte, i1, i2, l1, l2))
@@ -1606,157 +1706,157 @@ private int jjMoveNfa_0(int startState, int curPos)
if (jjCanMove_0(hiByte, i1, i2, l1, l2))
{ jjAddStates(15, 17); }
break;
- case 23:
+ case 27:
if (jjCanMove_0(hiByte, i1, i2, l1, l2))
{ jjAddStates(24, 26); }
break;
- case 41:
+ case 49:
if (jjCanMove_0(hiByte, i1, i2, l1, l2))
{ jjAddStates(21, 23); }
break;
- case 60:
+ case 72:
if (jjCanMove_0(hiByte, i1, i2, l1, l2))
- { jjAddStates(27, 30); }
+ { jjAddStates(33, 36); }
break;
- case 84:
+ case 100:
if (jjCanMove_0(hiByte, i1, i2, l1, l2))
- { jjAddStates(33, 36); }
+ { jjAddStates(41, 44); }
break;
- case 108:
+ case 128:
if (jjCanMove_0(hiByte, i1, i2, l1, l2))
- { jjAddStates(39, 44); }
+ { jjAddStates(49, 54); }
break;
- case 115:
+ case 135:
if (!jjCanMove_1(hiByte, i1, i2, l1, l2))
break;
- if (kind > 59)
- kind = 59;
- { jjCheckNAddStates(50, 52); }
+ if (kind > 60)
+ kind = 60;
+ { jjCheckNAddStates(60, 62); }
break;
- case 116:
+ case 136:
if (jjCanMove_2(hiByte, i1, i2, l1, l2))
- { jjCheckNAddStates(50, 52); }
+ { jjCheckNAddStates(60, 62); }
break;
- case 117:
- if (jjCanMove_2(hiByte, i1, i2, l1, l2) && kind > 59)
- kind = 59;
+ case 137:
+ if (jjCanMove_2(hiByte, i1, i2, l1, l2) && kind > 60)
+ kind = 60;
break;
- case 118:
+ case 138:
if (jjCanMove_3(hiByte, i1, i2, l1, l2))
- { jjAddStates(103, 104); }
+ { jjAddStates(118, 119); }
break;
- case 119:
+ case 139:
if (jjCanMove_4(hiByte, i1, i2, l1, l2))
- { jjCheckNAddStates(50, 52); }
+ { jjCheckNAddStates(60, 62); }
break;
- case 120:
- if (jjCanMove_5(hiByte, i1, i2, l1, l2) && kind > 59)
- kind = 59;
+ case 140:
+ if (jjCanMove_5(hiByte, i1, i2, l1, l2) && kind > 60)
+ kind = 60;
break;
- case 121:
+ case 141:
if (jjCanMove_6(hiByte, i1, i2, l1, l2))
- jjstateSet[jjnewStateCnt++] = 122;
+ jjstateSet[jjnewStateCnt++] = 142;
break;
- case 122:
+ case 142:
if (!jjCanMove_7(hiByte, i1, i2, l1, l2))
break;
- if (kind > 59)
- kind = 59;
- { jjCheckNAddStates(50, 52); }
+ if (kind > 60)
+ kind = 60;
+ { jjCheckNAddStates(60, 62); }
break;
- case 146:
+ case 166:
if (jjCanMove_1(hiByte, i1, i2, l1, l2))
- { jjCheckNAddStates(72, 79); }
+ { jjCheckNAddStates(82, 89); }
break;
- case 147:
+ case 167:
if (jjCanMove_2(hiByte, i1, i2, l1, l2))
- { jjCheckNAddStates(59, 61); }
+ { jjCheckNAddStates(69, 71); }
break;
- case 148:
+ case 168:
if (jjCanMove_2(hiByte, i1, i2, l1, l2))
- { jjCheckNAdd(149); }
+ { jjCheckNAdd(169); }
break;
- case 150:
+ case 170:
if (jjCanMove_8(hiByte, i1, i2, l1, l2))
- { jjAddStates(105, 106); }
+ { jjAddStates(120, 121); }
break;
- case 151:
+ case 171:
if (jjCanMove_9(hiByte, i1, i2, l1, l2))
- { jjCheckNAddStates(59, 61); }
+ { jjCheckNAddStates(69, 71); }
break;
- case 152:
+ case 172:
if (jjCanMove_10(hiByte, i1, i2, l1, l2))
- { jjCheckNAdd(149); }
+ { jjCheckNAdd(169); }
break;
- case 153:
+ case 173:
if (jjCanMove_2(hiByte, i1, i2, l1, l2))
- { jjCheckNAddStates(62, 64); }
+ { jjCheckNAddStates(72, 74); }
break;
- case 154:
+ case 174:
if (jjCanMove_2(hiByte, i1, i2, l1, l2))
- { jjCheckNAdd(155); }
+ { jjCheckNAdd(175); }
break;
- case 156:
+ case 176:
if (!jjCanMove_1(hiByte, i1, i2, l1, l2))
break;
- if (kind > 58)
- kind = 58;
- { jjCheckNAddStates(65, 69); }
+ if (kind > 59)
+ kind = 59;
+ { jjCheckNAddStates(75, 79); }
break;
- case 157:
+ case 177:
if (jjCanMove_2(hiByte, i1, i2, l1, l2))
- { jjCheckNAddStates(65, 69); }
+ { jjCheckNAddStates(75, 79); }
break;
- case 158:
- if (jjCanMove_2(hiByte, i1, i2, l1, l2) && kind > 58)
- kind = 58;
+ case 178:
+ if (jjCanMove_2(hiByte, i1, i2, l1, l2) && kind > 59)
+ kind = 59;
break;
- case 159:
+ case 179:
if (jjCanMove_11(hiByte, i1, i2, l1, l2))
- { jjAddStates(107, 108); }
+ { jjAddStates(122, 123); }
break;
- case 160:
+ case 180:
if (jjCanMove_12(hiByte, i1, i2, l1, l2))
- { jjCheckNAddStates(65, 69); }
+ { jjCheckNAddStates(75, 79); }
break;
- case 169:
- if (jjCanMove_13(hiByte, i1, i2, l1, l2) && kind > 58)
- kind = 58;
+ case 189:
+ if (jjCanMove_13(hiByte, i1, i2, l1, l2) && kind > 59)
+ kind = 59;
break;
- case 175:
+ case 195:
if (jjCanMove_14(hiByte, i1, i2, l1, l2))
- jjstateSet[jjnewStateCnt++] = 176;
+ jjstateSet[jjnewStateCnt++] = 196;
break;
- case 176:
+ case 196:
if (!jjCanMove_15(hiByte, i1, i2, l1, l2))
break;
- if (kind > 58)
- kind = 58;
- { jjCheckNAddStates(65, 69); }
+ if (kind > 59)
+ kind = 59;
+ { jjCheckNAddStates(75, 79); }
break;
- case 177:
+ case 197:
if (jjCanMove_16(hiByte, i1, i2, l1, l2))
- { jjAddStates(109, 110); }
+ { jjAddStates(124, 125); }
break;
- case 178:
+ case 198:
if (jjCanMove_17(hiByte, i1, i2, l1, l2))
- { jjCheckNAddStates(62, 64); }
+ { jjCheckNAddStates(72, 74); }
break;
- case 179:
+ case 199:
if (jjCanMove_18(hiByte, i1, i2, l1, l2))
- { jjCheckNAdd(155); }
+ { jjCheckNAdd(175); }
break;
- case 180:
+ case 200:
if (jjCanMove_19(hiByte, i1, i2, l1, l2))
- { jjAddStates(101, 102); }
+ { jjAddStates(116, 117); }
break;
- case 181:
+ case 201:
if (jjCanMove_20(hiByte, i1, i2, l1, l2))
- { jjCheckNAddStates(111, 114); }
+ { jjCheckNAddStates(126, 129); }
break;
- case 182:
+ case 202:
if (jjCanMove_21(hiByte, i1, i2, l1, l2))
- { jjCheckNAddStates(115, 118); }
+ { jjCheckNAddStates(130, 133); }
break;
default : if (i1 == 0 || l1 == 0 || i2 == 0 || l2 == 0) break; else break;
}
@@ -1769,7 +1869,7 @@ private int jjMoveNfa_0(int startState, int curPos)
kind = 0x7fffffff;
}
++curPos;
- if ((i = jjnewStateCnt) == (startsAt = 184 - (jjnewStateCnt = startsAt)))
+ if ((i = jjnewStateCnt) == (startsAt = 204 - (jjnewStateCnt = startsAt)))
break;
try { curChar = input_stream.readChar(); }
catch(java.io.IOException e) { break; }
@@ -1800,8 +1900,8 @@ public static final String[] jjstrLiteralImages = {
"", null, null, null, null, null, null, null, "\141",
"\100\160\162\145\146\151\170", "\100\142\141\163\145", "\100\166\145\162\163\151\157\156", null, null, null,
null, null, null, "\ufeff", null, "\53", "\55", null, null, null, null, null, null,
-null, null, null, null, null, null, null, null, null, "\50", "\51", "\173", "\175",
-"\133", "\135", null, "\73", "\54", "\56", "\136\136", "\100", "\74\74\50",
+null, null, null, null, null, null, null, null, null, null, "\50", "\51", "\173",
+"\175", "\133", "\135", null, "\73", "\54", "\56", "\136\136", "\100", "\74\74\50",
"\51\76\76", "\74\74", "\76\76", "\173\174", "\174\175", "\176", "\174", null, null, null,
null, null, null, null, null, null, null, null, null, null, null, null, null, null,
null, };
@@ -1829,14 +1929,15 @@ protected Token jjFillToken()
return t;
}
static final int[] jjnextStates = {
- 132, 133, 134, 136, 137, 139, 132, 133, 134, 136, 142, 156, 170, 172, 175, 6,
- 7, 8, 1, 2, 4, 41, 42, 43, 23, 24, 25, 59, 60, 61, 63, 62,
- 79, 83, 84, 85, 87, 86, 103, 107, 108, 109, 113, 110, 111, 107, 110, 111,
- 115, 121, 116, 117, 118, 126, 127, 130, 136, 137, 139, 147, 148, 150, 153, 154,
- 177, 157, 158, 159, 161, 163, 164, 166, 147, 148, 149, 153, 154, 155, 177, 150,
- 9, 18, 26, 27, 36, 44, 45, 54, 64, 65, 74, 88, 89, 98, 125, 126,
- 130, 140, 141, 162, 168, 181, 182, 119, 120, 151, 152, 160, 169, 178, 179, 147,
- 148, 149, 150, 153, 154, 155, 177,
+ 152, 153, 154, 156, 157, 159, 152, 153, 154, 156, 162, 176, 190, 192, 195, 6,
+ 7, 8, 1, 2, 4, 49, 50, 51, 27, 28, 29, 11, 12, 33, 34, 55,
+ 56, 71, 72, 73, 75, 74, 95, 79, 80, 99, 100, 101, 103, 102, 123, 107,
+ 108, 127, 128, 129, 133, 130, 131, 127, 130, 131, 135, 141, 136, 137, 138, 146,
+ 147, 150, 156, 157, 159, 167, 168, 170, 173, 174, 197, 177, 178, 179, 181, 183,
+ 184, 186, 167, 168, 169, 173, 174, 175, 197, 170, 9, 13, 22, 30, 31, 35,
+ 44, 52, 53, 57, 66, 76, 77, 81, 90, 104, 105, 109, 118, 145, 146, 150,
+ 160, 161, 182, 188, 201, 202, 139, 140, 171, 172, 180, 189, 198, 199, 167, 168,
+ 169, 170, 173, 174, 175, 197,
};
private static final boolean jjCanMove_0(int hiByte, int i1, int i2, long l1, long l2)
{
@@ -2256,7 +2357,7 @@ private void jjCheckNAddStates(int start, int end)
{
int i;
jjround = 0x80000001;
- for (i = 184; i-- > 0;)
+ for (i = 204; i-- > 0;)
jjrounds[i] = 0x80000000;
}
@@ -2288,9 +2389,10 @@ public static final int[] jjnewLexState = {
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
+ -1,
};
static final long[] jjtoToken = {
- 0x1ffffffe03bdff01L, 0x0L,
+ 0x3ffffffc03bdff01L, 0x0L,
};
static final long[] jjtoSkip = {
0xbeL, 0x0L,
@@ -2303,8 +2405,8 @@ static final long[] jjtoMore = {
};
protected SimpleCharStream input_stream;
- private final int[] jjrounds = new int[184];
- private final int[] jjstateSet = new int[2 * 184];
+ private final int[] jjrounds = new int[204];
+ private final int[] jjstateSet = new int[2 * 204];
private final StringBuilder jjimage = new StringBuilder();
private StringBuilder image = jjimage;
private int jjimageLen;
diff --git a/jena-arq/src/main/java/org/apache/jena/riot/tokens/TokenizerText.java b/jena-arq/src/main/java/org/apache/jena/riot/tokens/TokenizerText.java
index 9e0be31a62..3792b9288d 100644
--- a/jena-arq/src/main/java/org/apache/jena/riot/tokens/TokenizerText.java
+++ b/jena-arq/src/main/java/org/apache/jena/riot/tokens/TokenizerText.java
@@ -31,6 +31,7 @@ import org.apache.jena.atlas.AtlasException;
import org.apache.jena.atlas.io.IO;
import org.apache.jena.atlas.io.PeekReader;
import org.apache.jena.atlas.lib.Chars;
+import org.apache.jena.atlas.lib.Hex;
import org.apache.jena.riot.RiotParseException;
import org.apache.jena.riot.system.ErrorHandler;
import org.apache.jena.riot.system.RiotChars;
@@ -679,8 +680,8 @@ public final class TokenizerText implements Tokenizer
}
}
-// // Only high then low is allowed.
-// // Casting int to char is a 16 bit silent truncation (bytecode "i2c").
+ // Only high then low is allowed.
+ // Casting int to char is a 16 bit silent truncation (bytecode "i2c").
private char checkCodepoint(char previousCP, char ch) {
if ( ! Character.isSurrogate(ch) ) {
if ( previousCP == NO_CODEPOINT )
@@ -741,7 +742,7 @@ public final class TokenizerText implements Tokenizer
checkRDFString(str);
return str;
case CH_RSLASH:
- ch = readUnicodeEscape();
+ ch = readUnicodeEscapeOnly();
// Don't check legality of ch (strict syntax at this point).
// IRI parsing will catch errors.
break;
@@ -946,7 +947,7 @@ public final class TokenizerText implements Tokenizer
insertCodepointDirect(ch);
reader.readChar();
} else if ( ch == CH_RSLASH ) {
- ch = readCharEscape(); // Does not allow Unicode escapes.
+ ch = readCharEscapePLX(); // Does not allow Unicode escapes.
insertCodepointDirect(ch);
} else
throw new ARQInternalErrorException("Not a '\\' or a '%' character");
@@ -957,7 +958,7 @@ public final class TokenizerText implements Tokenizer
* An RDF String is a sequence of codepoints in the range U+0000 to U+10FFFF, excluding surrogates.
* Because this is java, we test for no non-paired surrogates.
* A surrogate pair is high-low.
- * This check is performed in readIRI, readStrignQuote1, and readStringQuote3
+ * If enabled, this check is performed in readIRI, readStringQuote1, and readStringQuote3
*/
private void checkRDFString(String string) {
for ( int i = 0 ; i < string.length() ; i++ ) {
@@ -1436,13 +1437,13 @@ public final class TokenizerText implements Tokenizer
// ---- Escape sequences
// Read a unicode escape : does not allow \\ bypass
- private final int readUnicodeEscape() {
+ private final int readUnicodeEscapeOnly() {
int ch = reader.readChar();
if ( ch == EOF )
fatal("Broken escape sequence");
switch (ch) {
- case 'u': return readUnicode4Escape();
+ case 'u': return readUnicode4OrDelimEscape(); //readUnicode4Escape();
case 'U': return readUnicode8Escape();
default:
fatal("Illegal unicode escape sequence value: \\%c (0x%02X)", ch, ch);
@@ -1450,6 +1451,7 @@ public final class TokenizerText implements Tokenizer
return 0;
}
+ // Validating the character is a defined Unicode scalar value happens in insertCodePoint.
private final int readLiteralEscape() {
int c = reader.readChar();
if ( c == EOF )
@@ -1464,7 +1466,7 @@ public final class TokenizerText implements Tokenizer
case '"': return '"';
case '\'': return '\'';
case '\\': return '\\';
- case 'u': return readUnicode4Escape();
+ case 'u': return readUnicode4OrDelimEscape();
case 'U': return readUnicode8Escape();
default:
fatal("Illegal escape sequence value: %c (0x%02X)",c , c);
@@ -1472,7 +1474,7 @@ public final class TokenizerText implements Tokenizer
}
}
- private final int readCharEscape() {
+ private final int readCharEscapePLX() { // Prefix name escapes
// PN_LOCAL_ESC ::= '\' ( '_' | '~' | '.' | '-' | '!' | '$' | '&' | "'"
// | '(' | ')' | '*' | '+' | ',' | ';' | '=' | '/' | '?' | '#' | '@' | '%' )
@@ -1492,12 +1494,52 @@ public final class TokenizerText implements Tokenizer
}
}
+ // Either \-uXXXX or \-u{...}
+ private final int readUnicode4OrDelimEscape() {
+ int nextCh = reader.peekChar();
+ if ( nextCh == CH_LBRACE ) {
+ return readUnicodeDelimitedHex();
+ } else {
+ return readUnicode4Escape();
+ }
+ }
+
+ private final int readUnicodeDelimitedHex() {
+ // The peeked '{'
+ reader.readChar();
+ int value = 0;
+ int n = 0;
+ for (;;) {
+ // read. No need to peek as we will move on one character
+ int ch = reader.readChar();
+ if ( ch == EOF )
+ fatal("Truncated delimited hex escape sequence");
+ int v = Hex.hexDigitToInt(ch, -1);
+ if ( v == -1 ) {
+ if ( ch == CH_RBRACE ) {
+ break;
+ } else
+ fatal("Broken delimited hex escape sequence");
+ }
+ value = (value<<4)+v ;
+ n++;
+ // Do this check here to catch overruns.
+ // 6 (max unicode range) or 8 (max 32 bit).
+ if ( n > 6 )
+ fatal("Delimited hex escape sequence too long");
+ }
+ if ( n == 0 )
+ fatal("Empty delimited hex escape sequence");
+ return value;
+ }
+
private final int readUnicode4Escape() {
return readHexSequence(4);
}
private final int readUnicode8Escape() {
int ch8 = readHexSequence(8);
+ // Check > 0x10FFFF
if ( ! Character.isValidCodePoint(ch8) )
fatal("Illegal code point from \\U sequence value: 0x%08X", ch8);
return ch8;
diff --git a/jena-arq/src/test/java/org/apache/jena/riot/tokens/TestTokenizerText.java b/jena-arq/src/test/java/org/apache/jena/riot/tokens/TestTokenizerText.java
index 197223944a..64af6b8ad7 100644
--- a/jena-arq/src/test/java/org/apache/jena/riot/tokens/TestTokenizerText.java
+++ b/jena-arq/src/test/java/org/apache/jena/riot/tokens/TestTokenizerText.java
@@ -1590,16 +1590,14 @@ public class TestTokenizerText {
public void turtle_bad_surrogate_09() {
// Wrong way round: low-hig);
assertThrows(RiotParseException.class, ()->
- surrogate("'\\uc800\\ud800'")
- );
+ surrogate("'\\uc800\\ud800'"));
}
@Test
public void turtle_bad_surrogate_10() {
assertThrows(RiotParseException.class, ()->
- // Wrong way round: low-high
- surrogate("'a\\uc800\\ud800z'")
- );
+ // Wrong way round: low-high
+ surrogate("'a\\uc800\\ud800z'"));
}
// Compilation failure - illegal escape character
@@ -1621,16 +1619,14 @@ public class TestTokenizerText {
public void turtle_bad_surrogate_13() {
// escaped low - raw high
assertThrows(RiotParseException.class, ()->
- surrogate("'\\uc800\ud800'")
- );
+ surrogate("'\\uc800\ud800'"));
}
@Test
public void turtle_bad_surrogate_14() {
// escaped low - raw high
assertThrows(RiotParseException.class, ()->
- surrogate("'a\\uc800\ud800z'")
- );
+ surrogate("'a\\uc800\ud800z'"));
}
private void surrogate(String string) {
@@ -1640,6 +1636,33 @@ public class TestTokenizerText {
assertFalse(tokenizer.hasNext());
}
+ // \-u{...} style Unicode escapes
+ @Test public void unescape_unicode_20() { test_unesc_unicode("\\u{41}", "A") ; }
+ @Test public void unescape_unicode_21() { test_unesc_unicode("\\u{000000}", "\u0000") ; }
+ @Test public void unescape_unicode_22() { test_unesc_unicode("\\u{1F0A1}", "🂡") ; }
+ @Test public void unescape_unicode_23() { test_unesc_unicode("\\u{01F0A1}", "🂡") ; }
+ @Test public void unescape_unicode_24() { test_unesc_unicode("\\u{10FFFF}", 0x10FFFF) ; }
+
+ @Test public void unescape_unicode_30() { assertThrows(RiotParseException.class, ()->test_unesc_unicode("\\u{}", "")) ; }
+ @Test public void unescape_unicode_31() { assertThrows(RiotParseException.class, ()->test_unesc_unicode("\\u{123456789}", "")) ; }
+ @Test public void unescape_unicode_32() { assertThrows(RiotParseException.class, ()->test_unesc_unicode("\\u{000000000}", "")) ; }
+ // If the limit is 6
+ @Test public void unescape_unicode_33() { assertThrows(RiotParseException.class, ()->test_unesc_unicode("\\u{1234567}", "")) ; }
+ @Test public void unescape_unicode_34() { assertThrows(RiotParseException.class, ()->test_unesc_unicode("\\u{0000000}", "")) ; }
+
+ private void test_unesc_unicode(String string, String expected) {
+ string = "'"+string+"'";
+ tokenizeAndTestExact(string, StringType.STRING1, expected);
+ }
+
+ private void test_unesc_unicode(String string, int expected) {
+ string = "'"+string+"'";
+ Tokenizer tokenizer = tokenizer(string);
+ Token token = testNextToken(tokenizer, TokenType.STRING);
+ int codepoint = token.getImage().codePointAt(0);
+ assertEquals(expected, codepoint);
+ }
+
@Test
public void token_rdf_star_reified_1() {
Tokenizer tokenizer = tokenizer("<<");
diff --git a/jena-base/src/main/java/org/apache/jena/atlas/lib/EscapeStr.java b/jena-base/src/main/java/org/apache/jena/atlas/lib/EscapeStr.java
index 79a8057654..298b7a9e70 100644
--- a/jena-base/src/main/java/org/apache/jena/atlas/lib/EscapeStr.java
+++ b/jena-base/src/main/java/org/apache/jena/atlas/lib/EscapeStr.java
@@ -21,10 +21,10 @@
package org.apache.jena.atlas.lib;
-import org.apache.jena.atlas.AtlasException ;
-import org.apache.jena.atlas.io.AWriter ;
-import org.apache.jena.atlas.io.OutputUtils ;
-import org.apache.jena.atlas.io.StringWriterI ;
+import org.apache.jena.atlas.AtlasException;
+import org.apache.jena.atlas.io.AWriter;
+import org.apache.jena.atlas.io.OutputUtils;
+import org.apache.jena.atlas.io.StringWriterI;
/** String escape utilities */
public class EscapeStr
@@ -44,21 +44,21 @@ public class EscapeStr
* Delimiters are not included in the result.
*/
public static String stringEsc(String s, char quoteChar) {
- AWriter w = new StringWriterI() ;
- stringEsc(w, s, quoteChar, true, CharSpace.UTF8) ;
- return w.toString() ;
+ AWriter w = new StringWriterI();
+ stringEsc(w, s, quoteChar, true, CharSpace.UTF8);
+ return w.toString();
}
/** Write a string - basic escaping, no quote escaping. */
public static void stringEsc(AWriter out, String s, boolean asciiOnly) {
- int len = s.length() ;
+ int len = s.length();
for (int i = 0; i < len; i++) {
char c = s.charAt(i);
// \\ Escape always possible.
if (c == '\\') {
- out.print('\\') ;
- out.print(c) ;
- continue ;
+ out.print('\\');
+ out.print(c);
+ continue;
}
switch(c) {
case '\n': out.print("\\n"); continue;
@@ -70,7 +70,7 @@ public class EscapeStr
if ( !asciiOnly )
out.print(c);
else
- writeCharAsASCII(out, c) ;
+ writeCharAsASCII(out, c);
}
}
@@ -80,21 +80,21 @@ public class EscapeStr
}
public static void stringEsc(AWriter out, String s, char quoteChar, boolean singleLineString, CharSpace charSpace) {
- boolean ascii = ( CharSpace.ASCII == charSpace ) ;
- int len = s.length() ;
- int quotesInARow = 0 ;
+ boolean ascii = ( CharSpace.ASCII == charSpace );
+ int len = s.length();
+ int quotesInARow = 0;
for (int i = 0; i < len; i++) {
char c = s.charAt(i);
// \\ Escape always possible.
if (c == '\\') {
- out.print('\\') ;
- out.print(c) ;
- continue ;
+ out.print('\\');
+ out.print(c);
+ continue;
}
if ( ! singleLineString ) {
// Multiline string.
if ( c == quoteChar ) {
- quotesInARow++ ;
+ quotesInARow++;
if ( (quotesInARow == 3) || (!singleLineString && (i == len - 1)) ) {
// Always quote the final character for multiline use
// otherwise it will run into the wrapping 3 quotes.
@@ -104,12 +104,12 @@ public class EscapeStr
continue;
}
} else {
- quotesInARow = 0 ;
+ quotesInARow = 0;
}
} else {
// Single line.
if ( c == quoteChar ) {
- out.print("\\"); out.print(c) ; continue ;
+ out.print("\\"); out.print(c); continue;
}
switch(c) {
case '\n': out.print("\\n"); continue;
@@ -121,7 +121,7 @@ public class EscapeStr
}
if ( ascii ) {
- writeCharAsASCII(out, c) ;
+ writeCharAsASCII(out, c);
continue;
}
@@ -141,7 +141,7 @@ public class EscapeStr
/** Write a string with Unicode to ASCII conversion using \-u escapes */
public static void writeASCII(AWriter out, String s) {
- int len = s.length() ;
+ int len = s.length();
for (int i = 0; i < len; i++) {
char c = s.charAt(i);
writeCharAsASCII(out, c);
@@ -157,8 +157,8 @@ public class EscapeStr
// Does not cover beyond 16 bits codepoints directly
// (i.e. \U escapes) but Java keeps these as surrogate
// pairs and will print as characters
- out.print("\\u") ;
- OutputUtils.printHex(out, c, 4) ;
+ out.print("\\u");
+ OutputUtils.printHex(out, c, 4);
}
}
@@ -166,60 +166,63 @@ public class EscapeStr
/** Replace \ escapes (\\u, \t, \n etc) in a string */
public static String unescapeStr(String s)
- { return unescapeStr(s, '\\') ; }
+ { return unescapeStr(s, '\\'); }
/** Replace \ escapes (\\u, \t, \n etc) in a string */
public static String unescapeStr(String s, char escapeChar)
- { return unescape(s, escapeChar, false) ; }
+ { return unescape(s, escapeChar, false); }
/** Unicode escapes \-u and \-U only */
public static String unescapeUnicode(String s) {
- return unescape(s, '\\', true) ;
+ return unescape(s, '\\', true);
}
// Main worker function for unescaping strings.
public static String unescape(String s, char escape, boolean pointCodeOnly) {
- int i = s.indexOf(escape) ;
+ int i = s.indexOf(escape);
if ( i == -1 )
- return s ;
+ return s;
// Dump the initial part straight into the string buffer
- StringBuilder sb = new StringBuilder(s.substring(0,i)) ;
+ StringBuilder sb = new StringBuilder(s.substring(0,i));
- for ( ; i < s.length() ; i++ )
- {
- char ch = s.charAt(i) ;
+ for ( ; i < s.length() ; i++ ) {
+ char ch = s.charAt(i);
- if ( ch != escape )
- {
- sb.append(ch) ;
- continue ;
+ if ( ch != escape ) {
+ sb.append(ch);
+ continue;
}
- // Escape
if ( i >= s.length()-1 )
- throw new AtlasException("Illegal escape at end of string") ;
- char ch2 = s.charAt(i+1) ;
- i = i + 1 ;
-
+ throw new AtlasException("Illegal escape at end of string");
+ // Move over the \
+ i = i + 1;
+ char ch2 = s.charAt(i);
// \\u and \\U
- if ( ch2 == 'u' )
- {
+ if ( ch2 == 'u' ) {
+ // Maybe "\-u { ... }"
+ int x = processDelimitedHex(sb, s, i);
+ if ( x >= 0 ) {
+ i = x;
+ // Yes - done.
+ continue;
+ }
+ // \-u-xxxx
if ( i+4 >= s.length() )
- throw new AtlasException("\\u escape too short") ;
- int x4 = Hex.hexStringToInt(s, i+1, 4) ;
- sb.append((char)x4) ;
+ throw new AtlasException("\\u escape too short");
+ int x4 = Hex.hexStringToInt(s, i+1, 4);
+ sb.append((char)x4);
// Jump 1 2 3 4 -- already skipped \ and u
- i = i+4 ;
- continue ;
+ i = i+4;
+ continue;
}
- if ( ch2 == 'U' )
- {
+ if ( ch2 == 'U' ) {
if ( i+8 >= s.length() )
- throw new AtlasException("\\U escape too short") ;
- int ch8 = Hex.hexStringToInt(s, i+1, 8) ;
+ throw new AtlasException("\\U escape too short");
+ int ch8 = Hex.hexStringToInt(s, i+1, 8);
if ( Character.charCount(ch8) == 1 )
sb.append((char)ch8);
else {
@@ -233,38 +236,90 @@ public class EscapeStr
char[] chars = Character.toChars(ch8);
sb.append(chars);
}
- // Jump 1 2 3 4 5 6 7 8 -- already skipped \ and u
- i = i+8 ;
- continue ;
+ // Jump 1 2 3 4 5 6 7 8 -- already skipped \ and U
+ i = i+8;
+ continue;
}
// Are we doing just point code escapes?
// If so, \X-anything else is legal as a literal "\" and "X"
- if ( pointCodeOnly )
- {
- sb.append('\\') ;
- sb.append(ch2) ;
- continue ;
+ if ( pointCodeOnly ) {
+ sb.append('\\');
+ sb.append(ch2);
+ continue;
+ }
+
+ char actualCh = 0;
+ switch(ch2) {
+ case 'n' -> actualCh = '\n';
+ case 't' -> actualCh = '\t';
+ case 'r' -> actualCh = '\r';
+ case 'b' -> actualCh = '\b';
+ case 'f' -> actualCh = '\f';
+ case '\'' -> actualCh = '\'';
+ case '\"' -> actualCh = '\"';
+ case '\\' -> actualCh = '\\';
+ default -> { throw new AtlasException("Unknown escape: \\"+ch2); }
}
- // Not just codepoints. Must be a legal escape.
- char ch3 = 0 ;
- switch (ch2)
- {
- case 'n': ch3 = '\n' ; break ;
- case 't': ch3 = '\t' ; break ;
- case 'r': ch3 = '\r' ; break ;
- case 'b': ch3 = '\b' ; break ;
- case 'f': ch3 = '\f' ; break ;
- case '\'': ch3 = '\'' ; break ;
- case '\"': ch3 = '\"' ; break ;
- case '\\': ch3 = '\\' ; break ;
- default:
- throw new AtlasException("Unknown escape: \\"+ch2) ;
+ if ( actualCh != 0 ) {
+ sb.append(actualCh);
+ continue;
}
- sb.append(ch3) ;
+
+ // Failed to classify the escape sequence
+ throw new AtlasException("Unknown escape: \\"+ch2);
+ }
+ return sb.toString();
+ }
+
+ // Parse "hex...}" - i.e. after "\ u {"
+ // Return the new value of the loop index.
+ // Return -1 if not delimited hex escape sequence
+ private static int processDelimitedHex(StringBuilder sb, String s, int i) {
+ // On entry, i is the index after 'u'
+ // \-u-{hex...}
+ if ( i+2 >= s.length()-1 )
+ // +2 is for the {}
+ throw new AtlasException("\\u escape too short");
+ char ch3 = s.charAt(i+1);
+ if ( ch3 != Chars.CH_LBRACE )
+ return -1;
+ // \-u-{hex...}
+ i = i+2; // Looking after the `{`
+ int j = 0;
+ int value = 0;
+ while( i+j < s.length() ) {
+ char ch4 = s.charAt(i+j);
+ if ( ch4 == Chars.CH_RBRACE )
+ break;
+ int v = Hex.hexDigitToInt(ch4, -1);
+ if ( v == -1 )
+ throw new AtlasException(String.format("Bad character in delimitred hex sequence: %s, 0x%04X", Character.toString(ch4), ch4));
+ value = (value<<4)+v ;
+ j++;
+ // Check length while waiting for }
+ // 6 (max unicode range) or 8 (max 32 bit).
+ if ( j > 6 )
+ throw new AtlasException("\\u{} sequence too long");
+ }
+ if ( j == 0 )
+ throw new AtlasException("Empty \\u{} sequence");
+
+ int ch8 = value;
+ if ( Character.charCount(ch8) == 1 )
+ sb.append((char)ch8);
+ else {
+ if ( !Character.isDefined(ch8) && !Character.isSupplementaryCodePoint(ch8) )
+ throw new AtlasException(String.format("Illegal codepoint: 0x%04X", ch8));
+ if ( ch8 > Character.MAX_CODE_POINT )
+ throw new AtlasException(String.format("Illegal code point in \\u{..} sequence value: 0x%08X", ch8));
+ char[] chars = Character.toChars(ch8);
+ sb.append(chars);
}
- return sb.toString() ;
+ // Looking at the closing '}'
+ i = i+j;
+ return i;
}
}
\ No newline at end of file
diff --git a/jena-base/src/main/java/org/apache/jena/atlas/lib/Hex.java b/jena-base/src/main/java/org/apache/jena/atlas/lib/Hex.java
index f204f21f20..df14cc81c7 100644
--- a/jena-base/src/main/java/org/apache/jena/atlas/lib/Hex.java
+++ b/jena-base/src/main/java/org/apache/jena/atlas/lib/Hex.java
@@ -77,7 +77,7 @@ public class Hex
* Return the value of the hex digit, or the marker value if not a hex
* digit.
*/
- public static int hexByteToInt(int c, int marker) {
+ public static int hexDigitToInt(int c, int marker) {
if ( '0' <= c && c <= '9' )
return c - '0';
else if ( 'A' <= c && c <= 'F' )
@@ -93,29 +93,15 @@ public class Hex
int x = 0;
for ( int j = i ; j < i + len ; j++ ) {
char ch = s.charAt(j);
- int k = 0;
- switch (ch) {
- case '0': k = 0 ; break ;
- case '1': k = 1 ; break ;
- case '2': k = 2 ; break ;
- case '3': k = 3 ; break ;
- case '4': k = 4 ; break ;
- case '5': k = 5 ; break ;
- case '6': k = 6 ; break ;
- case '7': k = 7 ; break ;
- case '8': k = 8 ; break ;
- case '9': k = 9 ; break ;
- case 'A': case 'a': k = 10 ; break ;
- case 'B': case 'b': k = 11 ; break ;
- case 'C': case 'c': k = 12 ; break ;
- case 'D': case 'd': k = 13 ; break ;
- case 'E': case 'e': k = 14 ; break ;
- case 'F': case 'f': k = 15 ; break ;
- default:
- throw new AtlasException("Illegal hex escape: "+ch) ;
- }
+ int k = hexDigitToInt(ch, -1);
+ if ( k == -1 )
+ throw new AtlasException("Illegal hex escape: "+ch) ;
x = (x<<4)+k ;
}
return x ;
}
+
+ public static boolean isHexChar(char ch) {
+ return hexDigitToInt(ch, -1) >= 0;
+ }
}
diff --git a/jena-base/src/test/java/org/apache/jena/atlas/lib/TestEscapeStr.java b/jena-base/src/test/java/org/apache/jena/atlas/lib/TestEscapeStr.java
index ac041bc9f7..7a7a4b9c4a 100644
--- a/jena-base/src/test/java/org/apache/jena/atlas/lib/TestEscapeStr.java
+++ b/jena-base/src/test/java/org/apache/jena/atlas/lib/TestEscapeStr.java
@@ -22,11 +22,13 @@
package org.apache.jena.atlas.lib;
import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertThrows;
import java.io.StringWriter;
import org.junit.jupiter.api.Test ;
+import org.apache.jena.atlas.AtlasException;
import org.apache.jena.atlas.io.AWriter;
import org.apache.jena.atlas.io.IO;
@@ -75,7 +77,6 @@ public class TestEscapeStr {
assertEquals(expected, output);
}
-
// Multiline quoting.
// One character
@Test public void escape_str_multi_01() { test_esc3("a'x", S_QUOTE, "a'x") ; }
@@ -152,8 +153,30 @@ public class TestEscapeStr {
@Test public void unescape_unicode_12() { test_unesc_unicode("\\(\\)", "\\(\\)") ; }
@Test public void unescape_unicode_13() { test_unesc_unicode("\\\\", "\\\\") ; }
+ // See also TestEscapeStr
+ // \-u{...} style Unicode escapes
+ @Test public void unescape_unicode_20() { test_unesc_unicode("\\u{41}", "A") ; }
+ @Test public void unescape_unicode_21() { test_unesc_unicode("\\u{000000}", "\u0000") ; }
+ @Test public void unescape_unicode_22() { test_unesc_unicode("\\u{1F0A1}", "🂡") ; }
+ @Test public void unescape_unicode_23() { test_unesc_unicode("\\u{01F0A1}", "🂡") ; }
+ @Test public void unescape_unicode_24() { test_unesc_unicode("\\u{10FFFF}", 0x10FFFF) ; }
+
+ @Test public void unescape_unicode_30() { assertThrows(AtlasException.class, ()->test_unesc_unicode("\\u{}", "")) ; }
+ @Test public void unescape_unicode_31() { assertThrows(AtlasException.class, ()->test_unesc_unicode("\\u{123456789}", "")) ; }
+ @Test public void unescape_unicode_32() { assertThrows(AtlasException.class, ()->test_unesc_unicode("\\u{000000000}", "")) ; }
+ // If the limit is 6
+ @Test public void unescape_unicode_33() { assertThrows(AtlasException.class, ()->test_unesc_unicode("\\u{1234567}", "")) ; }
+ @Test public void unescape_unicode_34() { assertThrows(AtlasException.class, ()->test_unesc_unicode("\\u{0000000}", "")) ; }
+
+
private void test_unesc_unicode(String input, String expected) {
String output = EscapeStr.unescapeUnicode(input) ;
assertEquals(expected, output);
}
+
+ private void test_unesc_unicode(String input, int expected) {
+ String output = EscapeStr.unescapeUnicode(input) ;
+ int codepoint = output.codePointAt(0);
+ assertEquals(expected, codepoint);
+ }
}