OSDN Git Service

simple XPath grammar
authorleo <leo@ae02f08e-27ec-0310-ae8c-8ba02fe2eafd>
Tue, 29 Sep 2009 05:53:16 +0000 (05:53 +0000)
committerleo <leo@ae02f08e-27ec-0310-ae8c-8ba02fe2eafd>
Tue, 29 Sep 2009 05:53:16 +0000 (05:53 +0000)
git-svn-id: http://www.xerial.org/svn/project/XerialJ/trunk/xerial-core@3611 ae02f08e-27ec-0310-ae8c-8ba02fe2eafd

src/main/java/org/xerial/lens/relation/query/impl/LensQuery.g
src/main/java/org/xerial/lens/relation/query/impl/LensQuery.tokens
src/main/java/org/xerial/lens/relation/query/impl/LensQueryLexer.java
src/main/java/org/xerial/lens/relation/query/impl/LensQueryParser.java
src/main/java/org/xerial/lens/relation/query/impl/XPath.g [new file with mode: 0644]
src/main/java/org/xerial/lens/relation/query/impl/XPath.tokens [new file with mode: 0644]
src/main/java/org/xerial/lens/relation/query/impl/XPathLexer.java [new file with mode: 0644]
src/main/java/org/xerial/lens/relation/query/impl/XPathParser.java [new file with mode: 0644]
src/main/java/org/xerial/lens/relation/query/lang/XPathExpr.java [new file with mode: 0644]
src/test/java/org/xerial/lens/relation/query/lang/XPathExprTest.java [new file with mode: 0644]

index 43764ee..8371c60 100644 (file)
@@ -143,10 +143,6 @@ True: 'true';
 False: 'false';\r
 Null: 'null';\r
 \r
-LBrace: '{' ;\r
-RBrace: '}' ;\r
-LBracket: '[' ;\r
-RBracket: ']' ;\r
 \r
 // comparison operator\r
 Lt: '<';\r
@@ -158,6 +154,7 @@ Neq: '!=';
 Match: '~=';\r
 Regex: '/'  (options{greedy=false;}: .)* '/' ('a' .. 'z' | 'A' .. 'Z')* ;\r
 \r
+\r
 Dot: '.';\r
 Comma: ',';\r
 Colon: ':';\r
@@ -215,6 +212,7 @@ scope
 \r
 relation_i: nodeName alias? LParen! nodeItem (Comma! nodeItem)* RParen!;\r
 \r
+\r
 fragment\r
 nodeName\r
   : QName -> NAME[$QName.text]\r
index c2f2c46..d20e7ca 100644 (file)
@@ -1,9 +1,7 @@
 INDEX=15\r
 PATTERNMATCH=9\r
-Match=44\r
-RBrace=35\r
-Regex=45\r
-LBracket=36\r
+Match=40\r
+Regex=41\r
 Digit=19\r
 Frac=28\r
 HexDigit=21\r
@@ -11,46 +9,44 @@ QUERY=4
 ALIAS=11\r
 VALUE=14\r
 Letter=20\r
-Comma=47\r
-Dot=46\r
+Comma=43\r
+Dot=42\r
 EscapeSequence=23\r
 Integer=27\r
-WhiteSpace=56\r
+WhiteSpace=52\r
 OPERATOR=7\r
 False=32\r
-Colon=48\r
+Colon=44\r
 LineComment=17\r
 NODEVALUE=12\r
-As=49\r
-SafeFirstLetter=54\r
+As=45\r
+SafeFirstLetter=50\r
 Null=33\r
-Star=52\r
-Eq=42\r
+Star=48\r
+Eq=38\r
 Exp=29\r
-QNameChar=57\r
+QNameChar=53\r
 RELATION=5\r
-Gt=39\r
-RParen=51\r
+Gt=35\r
+RParen=47\r
 UnicodeChar=22\r
 StringChar=24\r
 True=31\r
 OPERAND=8\r
 LineBreak=18\r
-LParen=50\r
+LParen=46\r
 String=26\r
-SafeLetter=55\r
+SafeLetter=51\r
 LineBreakChar=16\r
 COMPARE=6\r
-QName=58\r
-Geq=41\r
+QName=54\r
+Geq=37\r
 NODE=10\r
 StringChar_s=25\r
-Neq=43\r
-UnsafeUnicodeChar=53\r
+Neq=39\r
+UnsafeUnicodeChar=49\r
 Double=30\r
-LBrace=34\r
-RBracket=37\r
-Lt=38\r
+Lt=34\r
 NAME=13\r
-Leq=40\r
-WhiteSpaces=59\r
+Leq=36\r
+WhiteSpaces=55\r
index 1f06dcb..f7dc803 100644 (file)
@@ -1,4 +1,4 @@
-// $ANTLR 3.1.3 Mar 17, 2009 19:23:44 LensQuery.g 2009-09-10 16:56:16\r
+// $ANTLR 3.1.3 Mar 17, 2009 19:23:44 LensQuery.g 2009-09-29 14:01:34\r
 \r
 /*--------------------------------------------------------------------------\r
  *  Copyright 2009 Taro L. Saito\r
@@ -35,10 +35,8 @@ import java.util.ArrayList;
 public class LensQueryLexer extends Lexer {\r
     public static final int INDEX=15;\r
     public static final int PATTERNMATCH=9;\r
-    public static final int Match=44;\r
-    public static final int RBrace=35;\r
-    public static final int LBracket=36;\r
-    public static final int Regex=45;\r
+    public static final int Match=40;\r
+    public static final int Regex=41;\r
     public static final int Digit=19;\r
     public static final int Frac=28;\r
     public static final int HexDigit=21;\r
@@ -46,50 +44,48 @@ public class LensQueryLexer extends Lexer {
     public static final int ALIAS=11;\r
     public static final int VALUE=14;\r
     public static final int Letter=20;\r
-    public static final int Comma=47;\r
-    public static final int Dot=46;\r
+    public static final int Comma=43;\r
+    public static final int Dot=42;\r
     public static final int EscapeSequence=23;\r
     public static final int Integer=27;\r
-    public static final int WhiteSpace=56;\r
+    public static final int WhiteSpace=52;\r
     public static final int OPERATOR=7;\r
     public static final int False=32;\r
-    public static final int Colon=48;\r
+    public static final int Colon=44;\r
     public static final int LineComment=17;\r
     public static final int NODEVALUE=12;\r
-    public static final int As=49;\r
-    public static final int SafeFirstLetter=54;\r
+    public static final int As=45;\r
+    public static final int SafeFirstLetter=50;\r
     public static final int Null=33;\r
-    public static final int Star=52;\r
-    public static final int Eq=42;\r
+    public static final int Star=48;\r
+    public static final int Eq=38;\r
     public static final int Exp=29;\r
-    public static final int QNameChar=57;\r
+    public static final int QNameChar=53;\r
     public static final int RELATION=5;\r
-    public static final int Gt=39;\r
-    public static final int RParen=51;\r
+    public static final int Gt=35;\r
+    public static final int RParen=47;\r
     public static final int UnicodeChar=22;\r
     public static final int StringChar=24;\r
     public static final int True=31;\r
     public static final int OPERAND=8;\r
     public static final int LineBreak=18;\r
-    public static final int LParen=50;\r
+    public static final int LParen=46;\r
     public static final int String=26;\r
-    public static final int SafeLetter=55;\r
+    public static final int SafeLetter=51;\r
     public static final int LineBreakChar=16;\r
     public static final int COMPARE=6;\r
-    public static final int QName=58;\r
-    public static final int Geq=41;\r
+    public static final int QName=54;\r
+    public static final int Geq=37;\r
     public static final int EOF=-1;\r
     public static final int NODE=10;\r
-    public static final int Neq=43;\r
+    public static final int Neq=39;\r
     public static final int StringChar_s=25;\r
-    public static final int UnsafeUnicodeChar=53;\r
-    public static final int LBrace=34;\r
+    public static final int UnsafeUnicodeChar=49;\r
     public static final int Double=30;\r
-    public static final int Lt=38;\r
-    public static final int RBracket=37;\r
+    public static final int Lt=34;\r
     public static final int NAME=13;\r
-    public static final int Leq=40;\r
-    public static final int WhiteSpaces=59;\r
+    public static final int Leq=36;\r
+    public static final int WhiteSpaces=55;\r
 \r
 \r
 \r
@@ -949,93 +945,13 @@ public class LensQueryLexer extends Lexer {
     }\r
     // $ANTLR end "Null"\r
 \r
-    // $ANTLR start "LBrace"\r
-    public final void mLBrace() throws RecognitionException {\r
-        try {\r
-            int _type = LBrace;\r
-            int _channel = DEFAULT_TOKEN_CHANNEL;\r
-            // LensQuery.g:146:7: ( '{' )\r
-            // LensQuery.g:146:9: '{'\r
-            {\r
-            match('{'); \r
-\r
-            }\r
-\r
-            state.type = _type;\r
-            state.channel = _channel;\r
-        }\r
-        finally {\r
-        }\r
-    }\r
-    // $ANTLR end "LBrace"\r
-\r
-    // $ANTLR start "RBrace"\r
-    public final void mRBrace() throws RecognitionException {\r
-        try {\r
-            int _type = RBrace;\r
-            int _channel = DEFAULT_TOKEN_CHANNEL;\r
-            // LensQuery.g:147:7: ( '}' )\r
-            // LensQuery.g:147:9: '}'\r
-            {\r
-            match('}'); \r
-\r
-            }\r
-\r
-            state.type = _type;\r
-            state.channel = _channel;\r
-        }\r
-        finally {\r
-        }\r
-    }\r
-    // $ANTLR end "RBrace"\r
-\r
-    // $ANTLR start "LBracket"\r
-    public final void mLBracket() throws RecognitionException {\r
-        try {\r
-            int _type = LBracket;\r
-            int _channel = DEFAULT_TOKEN_CHANNEL;\r
-            // LensQuery.g:148:9: ( '[' )\r
-            // LensQuery.g:148:11: '['\r
-            {\r
-            match('['); \r
-\r
-            }\r
-\r
-            state.type = _type;\r
-            state.channel = _channel;\r
-        }\r
-        finally {\r
-        }\r
-    }\r
-    // $ANTLR end "LBracket"\r
-\r
-    // $ANTLR start "RBracket"\r
-    public final void mRBracket() throws RecognitionException {\r
-        try {\r
-            int _type = RBracket;\r
-            int _channel = DEFAULT_TOKEN_CHANNEL;\r
-            // LensQuery.g:149:9: ( ']' )\r
-            // LensQuery.g:149:11: ']'\r
-            {\r
-            match(']'); \r
-\r
-            }\r
-\r
-            state.type = _type;\r
-            state.channel = _channel;\r
-        }\r
-        finally {\r
-        }\r
-    }\r
-    // $ANTLR end "RBracket"\r
-\r
     // $ANTLR start "Lt"\r
     public final void mLt() throws RecognitionException {\r
         try {\r
             int _type = Lt;\r
             int _channel = DEFAULT_TOKEN_CHANNEL;\r
-            // LensQuery.g:152:3: ( '<' )\r
-            // LensQuery.g:152:5: '<'\r
+            // LensQuery.g:148:3: ( '<' )\r
+            // LensQuery.g:148:5: '<'\r
             {\r
             match('<'); \r
 \r
@@ -1054,8 +970,8 @@ public class LensQueryLexer extends Lexer {
         try {\r
             int _type = Gt;\r
             int _channel = DEFAULT_TOKEN_CHANNEL;\r
-            // LensQuery.g:153:3: ( '>' )\r
-            // LensQuery.g:153:5: '>'\r
+            // LensQuery.g:149:3: ( '>' )\r
+            // LensQuery.g:149:5: '>'\r
             {\r
             match('>'); \r
 \r
@@ -1074,8 +990,8 @@ public class LensQueryLexer extends Lexer {
         try {\r
             int _type = Leq;\r
             int _channel = DEFAULT_TOKEN_CHANNEL;\r
-            // LensQuery.g:154:4: ( '<=' )\r
-            // LensQuery.g:154:6: '<='\r
+            // LensQuery.g:150:4: ( '<=' )\r
+            // LensQuery.g:150:6: '<='\r
             {\r
             match("<="); \r
 \r
@@ -1095,8 +1011,8 @@ public class LensQueryLexer extends Lexer {
         try {\r
             int _type = Geq;\r
             int _channel = DEFAULT_TOKEN_CHANNEL;\r
-            // LensQuery.g:155:4: ( '>=' )\r
-            // LensQuery.g:155:6: '>='\r
+            // LensQuery.g:151:4: ( '>=' )\r
+            // LensQuery.g:151:6: '>='\r
             {\r
             match(">="); \r
 \r
@@ -1116,8 +1032,8 @@ public class LensQueryLexer extends Lexer {
         try {\r
             int _type = Eq;\r
             int _channel = DEFAULT_TOKEN_CHANNEL;\r
-            // LensQuery.g:156:3: ( '=' )\r
-            // LensQuery.g:156:5: '='\r
+            // LensQuery.g:152:3: ( '=' )\r
+            // LensQuery.g:152:5: '='\r
             {\r
             match('='); \r
 \r
@@ -1136,8 +1052,8 @@ public class LensQueryLexer extends Lexer {
         try {\r
             int _type = Neq;\r
             int _channel = DEFAULT_TOKEN_CHANNEL;\r
-            // LensQuery.g:157:4: ( '!=' )\r
-            // LensQuery.g:157:6: '!='\r
+            // LensQuery.g:153:4: ( '!=' )\r
+            // LensQuery.g:153:6: '!='\r
             {\r
             match("!="); \r
 \r
@@ -1157,8 +1073,8 @@ public class LensQueryLexer extends Lexer {
         try {\r
             int _type = Match;\r
             int _channel = DEFAULT_TOKEN_CHANNEL;\r
-            // LensQuery.g:158:6: ( '~=' )\r
-            // LensQuery.g:158:8: '~='\r
+            // LensQuery.g:154:6: ( '~=' )\r
+            // LensQuery.g:154:8: '~='\r
             {\r
             match("~="); \r
 \r
@@ -1178,11 +1094,11 @@ public class LensQueryLexer extends Lexer {
         try {\r
             int _type = Regex;\r
             int _channel = DEFAULT_TOKEN_CHANNEL;\r
-            // LensQuery.g:159:6: ( '/' ( options {greedy=false; } : . )* '/' ( 'a' .. 'z' | 'A' .. 'Z' )* )\r
-            // LensQuery.g:159:8: '/' ( options {greedy=false; } : . )* '/' ( 'a' .. 'z' | 'A' .. 'Z' )*\r
+            // LensQuery.g:155:6: ( '/' ( options {greedy=false; } : . )* '/' ( 'a' .. 'z' | 'A' .. 'Z' )* )\r
+            // LensQuery.g:155:8: '/' ( options {greedy=false; } : . )* '/' ( 'a' .. 'z' | 'A' .. 'Z' )*\r
             {\r
             match('/'); \r
-            // LensQuery.g:159:13: ( options {greedy=false; } : . )*\r
+            // LensQuery.g:155:13: ( options {greedy=false; } : . )*\r
             loop14:\r
             do {\r
                 int alt14=2;\r
@@ -1198,7 +1114,7 @@ public class LensQueryLexer extends Lexer {
 \r
                 switch (alt14) {\r
                case 1 :\r
-                   // LensQuery.g:159:38: .\r
+                   // LensQuery.g:155:38: .\r
                    {\r
                    matchAny(); \r
 \r
@@ -1211,7 +1127,7 @@ public class LensQueryLexer extends Lexer {
             } while (true);\r
 \r
             match('/'); \r
-            // LensQuery.g:159:46: ( 'a' .. 'z' | 'A' .. 'Z' )*\r
+            // LensQuery.g:155:46: ( 'a' .. 'z' | 'A' .. 'Z' )*\r
             loop15:\r
             do {\r
                 int alt15=2;\r
@@ -1260,8 +1176,8 @@ public class LensQueryLexer extends Lexer {
         try {\r
             int _type = Dot;\r
             int _channel = DEFAULT_TOKEN_CHANNEL;\r
-            // LensQuery.g:161:4: ( '.' )\r
-            // LensQuery.g:161:6: '.'\r
+            // LensQuery.g:158:4: ( '.' )\r
+            // LensQuery.g:158:6: '.'\r
             {\r
             match('.'); \r
 \r
@@ -1280,8 +1196,8 @@ public class LensQueryLexer extends Lexer {
         try {\r
             int _type = Comma;\r
             int _channel = DEFAULT_TOKEN_CHANNEL;\r
-            // LensQuery.g:162:6: ( ',' )\r
-            // LensQuery.g:162:8: ','\r
+            // LensQuery.g:159:6: ( ',' )\r
+            // LensQuery.g:159:8: ','\r
             {\r
             match(','); \r
 \r
@@ -1300,8 +1216,8 @@ public class LensQueryLexer extends Lexer {
         try {\r
             int _type = Colon;\r
             int _channel = DEFAULT_TOKEN_CHANNEL;\r
-            // LensQuery.g:163:6: ( ':' )\r
-            // LensQuery.g:163:8: ':'\r
+            // LensQuery.g:160:6: ( ':' )\r
+            // LensQuery.g:160:8: ':'\r
             {\r
             match(':'); \r
 \r
@@ -1320,8 +1236,8 @@ public class LensQueryLexer extends Lexer {
         try {\r
             int _type = As;\r
             int _channel = DEFAULT_TOKEN_CHANNEL;\r
-            // LensQuery.g:165:3: ( 'as' )\r
-            // LensQuery.g:165:5: 'as'\r
+            // LensQuery.g:162:3: ( 'as' )\r
+            // LensQuery.g:162:5: 'as'\r
             {\r
             match("as"); \r
 \r
@@ -1341,8 +1257,8 @@ public class LensQueryLexer extends Lexer {
         try {\r
             int _type = LParen;\r
             int _channel = DEFAULT_TOKEN_CHANNEL;\r
-            // LensQuery.g:167:7: ( '(' )\r
-            // LensQuery.g:167:9: '('\r
+            // LensQuery.g:164:7: ( '(' )\r
+            // LensQuery.g:164:9: '('\r
             {\r
             match('('); \r
 \r
@@ -1361,8 +1277,8 @@ public class LensQueryLexer extends Lexer {
         try {\r
             int _type = RParen;\r
             int _channel = DEFAULT_TOKEN_CHANNEL;\r
-            // LensQuery.g:168:7: ( ')' )\r
-            // LensQuery.g:168:9: ')'\r
+            // LensQuery.g:165:7: ( ')' )\r
+            // LensQuery.g:165:9: ')'\r
             {\r
             match(')'); \r
 \r
@@ -1381,8 +1297,8 @@ public class LensQueryLexer extends Lexer {
         try {\r
             int _type = Star;\r
             int _channel = DEFAULT_TOKEN_CHANNEL;\r
-            // LensQuery.g:170:5: ( '*' )\r
-            // LensQuery.g:170:7: '*'\r
+            // LensQuery.g:167:5: ( '*' )\r
+            // LensQuery.g:167:7: '*'\r
             {\r
             match('*'); \r
 \r
@@ -1399,7 +1315,7 @@ public class LensQueryLexer extends Lexer {
     // $ANTLR start "UnsafeUnicodeChar"\r
     public final void mUnsafeUnicodeChar() throws RecognitionException {\r
         try {\r
-            // LensQuery.g:173:18: ( '(' | ')' | '[' | ']' | '{' | '}' | ',' | ':' | '#' | '<' | '>' | '|' | '*' | '\\'' | '\"' | '@' | '%' | '\\\\' | '.' | '-' )\r
+            // LensQuery.g:170:18: ( '(' | ')' | '[' | ']' | '{' | '}' | ',' | ':' | '#' | '<' | '>' | '|' | '*' | '\\'' | '\"' | '@' | '%' | '\\\\' | '.' | '-' )\r
             // LensQuery.g:\r
             {\r
             if ( (input.LA(1)>='\"' && input.LA(1)<='#')||input.LA(1)=='%'||(input.LA(1)>='\'' && input.LA(1)<='*')||(input.LA(1)>=',' && input.LA(1)<='.')||input.LA(1)==':'||input.LA(1)=='<'||input.LA(1)=='>'||input.LA(1)=='@'||(input.LA(1)>='[' && input.LA(1)<=']')||(input.LA(1)>='{' && input.LA(1)<='}') ) {\r
@@ -1423,7 +1339,7 @@ public class LensQueryLexer extends Lexer {
     // $ANTLR start "SafeFirstLetter"\r
     public final void mSafeFirstLetter() throws RecognitionException {\r
         try {\r
-            // LensQuery.g:175:25: ( 'A' .. 'Z' | 'a' .. 'z' )\r
+            // LensQuery.g:172:25: ( 'A' .. 'Z' | 'a' .. 'z' )\r
             // LensQuery.g:\r
             {\r
             if ( (input.LA(1)>='A' && input.LA(1)<='Z')||(input.LA(1)>='a' && input.LA(1)<='z') ) {\r
@@ -1447,7 +1363,7 @@ public class LensQueryLexer extends Lexer {
     // $ANTLR start "SafeLetter"\r
     public final void mSafeLetter() throws RecognitionException {\r
         try {\r
-            // LensQuery.g:176:20: ( SafeFirstLetter | '0' .. '9' | '-' | '_' )\r
+            // LensQuery.g:173:20: ( SafeFirstLetter | '0' .. '9' | '-' | '_' )\r
             // LensQuery.g:\r
             {\r
             if ( input.LA(1)=='-'||(input.LA(1)>='0' && input.LA(1)<='9')||(input.LA(1)>='A' && input.LA(1)<='Z')||input.LA(1)=='_'||(input.LA(1)>='a' && input.LA(1)<='z') ) {\r
@@ -1471,8 +1387,8 @@ public class LensQueryLexer extends Lexer {
     // $ANTLR start "QNameChar"\r
     public final void mQNameChar() throws RecognitionException {\r
         try {\r
-            // LensQuery.g:179:19: (~ ( LineBreakChar | UnsafeUnicodeChar | WhiteSpace ) )\r
-            // LensQuery.g:179:21: ~ ( LineBreakChar | UnsafeUnicodeChar | WhiteSpace )\r
+            // LensQuery.g:176:19: (~ ( LineBreakChar | UnsafeUnicodeChar | WhiteSpace ) )\r
+            // LensQuery.g:176:21: ~ ( LineBreakChar | UnsafeUnicodeChar | WhiteSpace )\r
             {\r
             if ( (input.LA(1)>='\u0000' && input.LA(1)<='\b')||(input.LA(1)>='\u000B' && input.LA(1)<='\f')||(input.LA(1)>='\u000E' && input.LA(1)<='\u001F')||input.LA(1)=='!'||input.LA(1)=='$'||input.LA(1)=='&'||input.LA(1)=='+'||(input.LA(1)>='/' && input.LA(1)<='9')||input.LA(1)==';'||input.LA(1)=='='||input.LA(1)=='?'||(input.LA(1)>='A' && input.LA(1)<='Z')||(input.LA(1)>='^' && input.LA(1)<='z')||(input.LA(1)>='~' && input.LA(1)<='\uFFFF') ) {\r
                 input.consume();\r
@@ -1497,10 +1413,10 @@ public class LensQueryLexer extends Lexer {
         try {\r
             int _type = QName;\r
             int _channel = DEFAULT_TOKEN_CHANNEL;\r
-            // LensQuery.g:180:6: ( ( QNameChar )+ ( Dot ( QNameChar )+ )* )\r
-            // LensQuery.g:180:8: ( QNameChar )+ ( Dot ( QNameChar )+ )*\r
+            // LensQuery.g:177:6: ( ( QNameChar )+ ( Dot ( QNameChar )+ )* )\r
+            // LensQuery.g:177:8: ( QNameChar )+ ( Dot ( QNameChar )+ )*\r
             {\r
-            // LensQuery.g:180:8: ( QNameChar )+\r
+            // LensQuery.g:177:8: ( QNameChar )+\r
             int cnt16=0;\r
             loop16:\r
             do {\r
@@ -1514,7 +1430,7 @@ public class LensQueryLexer extends Lexer {
 \r
                 switch (alt16) {\r
                case 1 :\r
-                   // LensQuery.g:180:8: QNameChar\r
+                   // LensQuery.g:177:8: QNameChar\r
                    {\r
                    mQNameChar(); \r
 \r
@@ -1530,7 +1446,7 @@ public class LensQueryLexer extends Lexer {
                 cnt16++;\r
             } while (true);\r
 \r
-            // LensQuery.g:180:19: ( Dot ( QNameChar )+ )*\r
+            // LensQuery.g:177:19: ( Dot ( QNameChar )+ )*\r
             loop18:\r
             do {\r
                 int alt18=2;\r
@@ -1543,10 +1459,10 @@ public class LensQueryLexer extends Lexer {
 \r
                 switch (alt18) {\r
                case 1 :\r
-                   // LensQuery.g:180:20: Dot ( QNameChar )+\r
+                   // LensQuery.g:177:20: Dot ( QNameChar )+\r
                    {\r
                    mDot(); \r
-                   // LensQuery.g:180:24: ( QNameChar )+\r
+                   // LensQuery.g:177:24: ( QNameChar )+\r
                    int cnt17=0;\r
                    loop17:\r
                    do {\r
@@ -1560,7 +1476,7 @@ public class LensQueryLexer extends Lexer {
 \r
                        switch (alt17) {\r
                        case 1 :\r
-                           // LensQuery.g:180:24: QNameChar\r
+                           // LensQuery.g:177:24: QNameChar\r
                            {\r
                            mQNameChar(); \r
 \r
@@ -1599,7 +1515,7 @@ public class LensQueryLexer extends Lexer {
     // $ANTLR start "WhiteSpace"\r
     public final void mWhiteSpace() throws RecognitionException {\r
         try {\r
-            // LensQuery.g:184:11: ( ' ' | '\\t' )\r
+            // LensQuery.g:181:11: ( ' ' | '\\t' )\r
             // LensQuery.g:\r
             {\r
             if ( input.LA(1)=='\t'||input.LA(1)==' ' ) {\r
@@ -1625,10 +1541,10 @@ public class LensQueryLexer extends Lexer {
         try {\r
             int _type = WhiteSpaces;\r
             int _channel = DEFAULT_TOKEN_CHANNEL;\r
-            // LensQuery.g:186:12: ( ( WhiteSpace )+ )\r
-            // LensQuery.g:186:14: ( WhiteSpace )+\r
+            // LensQuery.g:183:12: ( ( WhiteSpace )+ )\r
+            // LensQuery.g:183:14: ( WhiteSpace )+\r
             {\r
-            // LensQuery.g:186:14: ( WhiteSpace )+\r
+            // LensQuery.g:183:14: ( WhiteSpace )+\r
             int cnt19=0;\r
             loop19:\r
             do {\r
@@ -1642,7 +1558,7 @@ public class LensQueryLexer extends Lexer {
 \r
                 switch (alt19) {\r
                case 1 :\r
-                   // LensQuery.g:186:14: WhiteSpace\r
+                   // LensQuery.g:183:14: WhiteSpace\r
                    {\r
                    mWhiteSpace(); \r
 \r
@@ -1671,8 +1587,8 @@ public class LensQueryLexer extends Lexer {
     // $ANTLR end "WhiteSpaces"\r
 \r
     public void mTokens() throws RecognitionException {\r
-        // LensQuery.g:1:8: ( LineComment | LineBreak | String | Integer | Double | True | False | Null | LBrace | RBrace | LBracket | RBracket | Lt | Gt | Leq | Geq | Eq | Neq | Match | Regex | Dot | Comma | Colon | As | LParen | RParen | Star | QName | WhiteSpaces )\r
-        int alt20=29;\r
+        // LensQuery.g:1:8: ( LineComment | LineBreak | String | Integer | Double | True | False | Null | Lt | Gt | Leq | Geq | Eq | Neq | Match | Regex | Dot | Comma | Colon | As | LParen | RParen | Star | QName | WhiteSpaces )\r
+        int alt20=25;\r
         alt20 = dfa20.predict(input);\r
         switch (alt20) {\r
             case 1 :\r
@@ -1732,147 +1648,119 @@ public class LensQueryLexer extends Lexer {
                 }\r
                 break;\r
             case 9 :\r
-                // LensQuery.g:1:70: LBrace\r
-                {\r
-                mLBrace(); \r
-\r
-                }\r
-                break;\r
-            case 10 :\r
-                // LensQuery.g:1:77: RBrace\r
-                {\r
-                mRBrace(); \r
-\r
-                }\r
-                break;\r
-            case 11 :\r
-                // LensQuery.g:1:84: LBracket\r
-                {\r
-                mLBracket(); \r
-\r
-                }\r
-                break;\r
-            case 12 :\r
-                // LensQuery.g:1:93: RBracket\r
-                {\r
-                mRBracket(); \r
-\r
-                }\r
-                break;\r
-            case 13 :\r
-                // LensQuery.g:1:102: Lt\r
+                // LensQuery.g:1:70: Lt\r
                 {\r
                 mLt(); \r
 \r
                 }\r
                 break;\r
-            case 14 :\r
-                // LensQuery.g:1:105: Gt\r
+            case 10 :\r
+                // LensQuery.g:1:73: Gt\r
                 {\r
                 mGt(); \r
 \r
                 }\r
                 break;\r
-            case 15 :\r
-                // LensQuery.g:1:108: Leq\r
+            case 11 :\r
+                // LensQuery.g:1:76: Leq\r
                 {\r
                 mLeq(); \r
 \r
                 }\r
                 break;\r
-            case 16 :\r
-                // LensQuery.g:1:112: Geq\r
+            case 12 :\r
+                // LensQuery.g:1:80: Geq\r
                 {\r
                 mGeq(); \r
 \r
                 }\r
                 break;\r
-            case 17 :\r
-                // LensQuery.g:1:116: Eq\r
+            case 13 :\r
+                // LensQuery.g:1:84: Eq\r
                 {\r
                 mEq(); \r
 \r
                 }\r
                 break;\r
-            case 18 :\r
-                // LensQuery.g:1:119: Neq\r
+            case 14 :\r
+                // LensQuery.g:1:87: Neq\r
                 {\r
                 mNeq(); \r
 \r
                 }\r
                 break;\r
-            case 19 :\r
-                // LensQuery.g:1:123: Match\r
+            case 15 :\r
+                // LensQuery.g:1:91: Match\r
                 {\r
                 mMatch(); \r
 \r
                 }\r
                 break;\r
-            case 20 :\r
-                // LensQuery.g:1:129: Regex\r
+            case 16 :\r
+                // LensQuery.g:1:97: Regex\r
                 {\r
                 mRegex(); \r
 \r
                 }\r
                 break;\r
-            case 21 :\r
-                // LensQuery.g:1:135: Dot\r
+            case 17 :\r
+                // LensQuery.g:1:103: Dot\r
                 {\r
                 mDot(); \r
 \r
                 }\r
                 break;\r
-            case 22 :\r
-                // LensQuery.g:1:139: Comma\r
+            case 18 :\r
+                // LensQuery.g:1:107: Comma\r
                 {\r
                 mComma(); \r
 \r
                 }\r
                 break;\r
-            case 23 :\r
-                // LensQuery.g:1:145: Colon\r
+            case 19 :\r
+                // LensQuery.g:1:113: Colon\r
                 {\r
                 mColon(); \r
 \r
                 }\r
                 break;\r
-            case 24 :\r
-                // LensQuery.g:1:151: As\r
+            case 20 :\r
+                // LensQuery.g:1:119: As\r
                 {\r
                 mAs(); \r
 \r
                 }\r
                 break;\r
-            case 25 :\r
-                // LensQuery.g:1:154: LParen\r
+            case 21 :\r
+                // LensQuery.g:1:122: LParen\r
                 {\r
                 mLParen(); \r
 \r
                 }\r
                 break;\r
-            case 26 :\r
-                // LensQuery.g:1:161: RParen\r
+            case 22 :\r
+                // LensQuery.g:1:129: RParen\r
                 {\r
                 mRParen(); \r
 \r
                 }\r
                 break;\r
-            case 27 :\r
-                // LensQuery.g:1:168: Star\r
+            case 23 :\r
+                // LensQuery.g:1:136: Star\r
                 {\r
                 mStar(); \r
 \r
                 }\r
                 break;\r
-            case 28 :\r
-                // LensQuery.g:1:173: QName\r
+            case 24 :\r
+                // LensQuery.g:1:141: QName\r
                 {\r
                 mQName(); \r
 \r
                 }\r
                 break;\r
-            case 29 :\r
-                // LensQuery.g:1:179: WhiteSpaces\r
+            case 25 :\r
+                // LensQuery.g:1:147: WhiteSpaces\r
                 {\r
                 mWhiteSpaces(); \r
 \r
@@ -1886,175 +1774,168 @@ public class LensQueryLexer extends Lexer {
 \r
     protected DFA20 dfa20 = new DFA20(this);\r
     static final String DFA20_eotS =\r
-        "\5\uffff\2\37\3\33\4\uffff\1\47\1\51\1\52\3\33\3\uffff\1\33\5\uffff"+\r
-        "\2\37\2\uffff\1\33\1\37\3\33\5\uffff\1\72\1\73\1\uffff\1\57\1\uffff"+\r
-        "\1\33\1\77\1\uffff\1\37\1\62\1\33\1\62\3\33\2\uffff\1\57\1\33\1"+\r
-        "\57\1\uffff\1\33\1\107\1\33\1\111\1\57\1\33\1\62\1\uffff\1\112\2"+\r
-        "\uffff";\r
+        "\5\uffff\2\33\3\27\1\43\1\45\1\46\3\27\3\uffff\1\27\5\uffff\2\33"+\r
+        "\2\uffff\1\27\1\33\3\27\5\uffff\1\66\1\67\1\uffff\1\53\1\uffff\1"+\r
+        "\27\1\73\1\uffff\1\33\1\56\1\27\1\56\3\27\2\uffff\1\53\1\27\1\53"+\r
+        "\1\uffff\1\27\1\103\1\27\1\105\1\53\1\27\1\56\1\uffff\1\106\2\uffff";\r
     static final String DFA20_eofS =\r
-        "\113\uffff";\r
+        "\107\uffff";\r
     static final String DFA20_minS =\r
-        "\1\0\3\uffff\1\60\2\0\1\162\1\141\1\165\4\uffff\2\75\1\0\2\75\1"+\r
-        "\0\3\uffff\1\163\5\uffff\2\56\1\uffff\1\0\1\53\1\0\1\165\2\154\5"+\r
-        "\uffff\4\0\1\uffff\2\0\1\uffff\1\56\1\0\1\60\1\0\1\145\1\163\1\154"+\r
-        "\2\uffff\3\0\1\uffff\1\53\1\0\1\145\2\0\1\60\1\0\1\uffff\1\0\2\uffff";\r
+        "\1\0\3\uffff\1\60\2\0\1\162\1\141\1\165\2\75\1\0\2\75\1\0\3\uffff"+\r
+        "\1\163\5\uffff\2\56\1\uffff\1\0\1\53\1\0\1\165\2\154\5\uffff\4\0"+\r
+        "\1\uffff\2\0\1\uffff\1\56\1\0\1\60\1\0\1\145\1\163\1\154\2\uffff"+\r
+        "\3\0\1\uffff\1\53\1\0\1\145\2\0\1\60\1\0\1\uffff\1\0\2\uffff";\r
     static final String DFA20_maxS =\r
-        "\1\uffff\3\uffff\1\71\2\uffff\1\162\1\141\1\165\4\uffff\2\75\1"+\r
-        "\uffff\2\75\1\uffff\3\uffff\1\163\5\uffff\2\145\1\uffff\1\uffff"+\r
-        "\1\71\1\uffff\1\165\2\154\5\uffff\4\uffff\1\uffff\2\uffff\1\uffff"+\r
-        "\1\145\1\uffff\1\71\1\uffff\1\145\1\163\1\154\2\uffff\3\uffff\1"+\r
-        "\uffff\1\71\1\uffff\1\145\2\uffff\1\71\1\uffff\1\uffff\1\uffff\2"+\r
-        "\uffff";\r
+        "\1\uffff\3\uffff\1\71\2\uffff\1\162\1\141\1\165\2\75\1\uffff\2"+\r
+        "\75\1\uffff\3\uffff\1\163\5\uffff\2\145\1\uffff\1\uffff\1\71\1\uffff"+\r
+        "\1\165\2\154\5\uffff\4\uffff\1\uffff\2\uffff\1\uffff\1\145\1\uffff"+\r
+        "\1\71\1\uffff\1\145\1\163\1\154\2\uffff\3\uffff\1\uffff\1\71\1\uffff"+\r
+        "\1\145\2\uffff\1\71\1\uffff\1\uffff\1\uffff\2\uffff";\r
     static final String DFA20_acceptS =\r
-        "\1\uffff\1\1\1\2\1\3\6\uffff\1\11\1\12\1\13\1\14\6\uffff\1\25\1"+\r
-        "\26\1\27\1\uffff\1\31\1\32\1\33\1\34\1\35\2\uffff\1\4\6\uffff\1"+\r
-        "\17\1\15\1\20\1\16\1\21\4\uffff\1\24\2\uffff\1\5\7\uffff\1\22\1"+\r
-        "\23\3\uffff\1\30\7\uffff\1\6\1\uffff\1\10\1\7";\r
+        "\1\uffff\1\1\1\2\1\3\14\uffff\1\21\1\22\1\23\1\uffff\1\25\1\26"+\r
+        "\1\27\1\30\1\31\2\uffff\1\4\6\uffff\1\13\1\11\1\14\1\12\1\15\4\uffff"+\r
+        "\1\20\2\uffff\1\5\7\uffff\1\16\1\17\3\uffff\1\24\7\uffff\1\6\1\uffff"+\r
+        "\1\10\1\7";\r
     static final String DFA20_specialS =\r
-        "\1\0\4\uffff\1\20\1\1\11\uffff\1\21\2\uffff\1\22\14\uffff\1\6\1"+\r
-        "\uffff\1\25\10\uffff\1\2\1\17\1\12\1\24\1\uffff\1\14\1\16\2\uffff"+\r
-        "\1\11\1\uffff\1\10\5\uffff\1\5\1\26\1\23\2\uffff\1\3\1\uffff\1\4"+\r
-        "\1\13\1\uffff\1\15\1\uffff\1\7\2\uffff}>";\r
+        "\1\20\4\uffff\1\26\1\14\5\uffff\1\4\2\uffff\1\22\14\uffff\1\21"+\r
+        "\1\uffff\1\7\10\uffff\1\0\1\23\1\5\1\16\1\uffff\1\2\1\17\2\uffff"+\r
+        "\1\25\1\uffff\1\6\5\uffff\1\10\1\15\1\24\2\uffff\1\1\1\uffff\1\13"+\r
+        "\1\3\1\uffff\1\12\1\uffff\1\11\2\uffff}>";\r
     static final String[] DFA20_transitionS = {\r
-            "\11\33\1\34\1\2\2\33\1\2\22\33\1\34\1\21\1\3\1\1\1\33\1\uffff"+\r
-            "\1\33\1\uffff\1\30\1\31\1\32\1\33\1\25\1\4\1\24\1\23\1\5\11"+\r
-            "\6\1\26\1\33\1\16\1\20\1\17\1\33\1\uffff\32\33\1\14\1\uffff"+\r
-            "\1\15\3\33\1\27\4\33\1\10\7\33\1\11\5\33\1\7\6\33\1\12\1\uffff"+\r
-            "\1\13\1\22\uff81\33",\r
+            "\11\27\1\30\1\2\2\27\1\2\22\27\1\30\1\15\1\3\1\1\1\27\1\uffff"+\r
+            "\1\27\1\uffff\1\24\1\25\1\26\1\27\1\21\1\4\1\20\1\17\1\5\11"+\r
+            "\6\1\22\1\27\1\12\1\14\1\13\1\27\1\uffff\32\27\3\uffff\3\27"+\r
+            "\1\23\4\27\1\10\7\27\1\11\5\27\1\7\6\27\3\uffff\1\16\uff81\27",\r
             "",\r
             "",\r
             "",\r
-            "\1\35\11\36",\r
-            "\11\33\2\uffff\2\33\1\uffff\22\33\1\uffff\1\33\2\uffff\1\33"+\r
-            "\1\uffff\1\33\4\uffff\1\33\2\uffff\1\40\13\33\1\uffff\1\33\1"+\r
-            "\uffff\1\33\1\uffff\1\33\1\uffff\4\33\1\41\25\33\3\uffff\7\33"+\r
-            "\1\41\25\33\3\uffff\uff82\33",\r
-            "\11\33\2\uffff\2\33\1\uffff\22\33\1\uffff\1\33\2\uffff\1\33"+\r
-            "\1\uffff\1\33\4\uffff\1\33\2\uffff\1\40\1\33\12\42\1\uffff\1"+\r
-            "\33\1\uffff\1\33\1\uffff\1\33\1\uffff\4\33\1\41\25\33\3\uffff"+\r
-            "\7\33\1\41\25\33\3\uffff\uff82\33",\r
-            "\1\43",\r
+            "\1\31\11\32",\r
+            "\11\27\2\uffff\2\27\1\uffff\22\27\1\uffff\1\27\2\uffff\1\27"+\r
+            "\1\uffff\1\27\4\uffff\1\27\2\uffff\1\34\13\27\1\uffff\1\27\1"+\r
+            "\uffff\1\27\1\uffff\1\27\1\uffff\4\27\1\35\25\27\3\uffff\7\27"+\r
+            "\1\35\25\27\3\uffff\uff82\27",\r
+            "\11\27\2\uffff\2\27\1\uffff\22\27\1\uffff\1\27\2\uffff\1\27"+\r
+            "\1\uffff\1\27\4\uffff\1\27\2\uffff\1\34\1\27\12\36\1\uffff\1"+\r
+            "\27\1\uffff\1\27\1\uffff\1\27\1\uffff\4\27\1\35\25\27\3\uffff"+\r
+            "\7\27\1\35\25\27\3\uffff\uff82\27",\r
+            "\1\37",\r
+            "\1\40",\r
+            "\1\41",\r
+            "\1\42",\r
             "\1\44",\r
-            "\1\45",\r
-            "",\r
-            "",\r
-            "",\r
-            "",\r
-            "\1\46",\r
+            "\11\27\2\uffff\2\27\1\uffff\22\27\1\uffff\1\27\2\uffff\1\27"+\r
+            "\1\uffff\1\27\4\uffff\1\27\2\uffff\14\27\1\uffff\1\27\1\uffff"+\r
+            "\1\27\1\uffff\1\27\1\uffff\32\27\3\uffff\35\27\3\uffff\uff82"+\r
+            "\27",\r
+            "\1\47",\r
             "\1\50",\r
-            "\11\33\2\uffff\2\33\1\uffff\22\33\1\uffff\1\33\2\uffff\1\33"+\r
-            "\1\uffff\1\33\4\uffff\1\33\2\uffff\14\33\1\uffff\1\33\1\uffff"+\r
-            "\1\33\1\uffff\1\33\1\uffff\32\33\3\uffff\35\33\3\uffff\uff82"+\r
-            "\33",\r
-            "\1\53",\r
-            "\1\54",\r
-            "\11\60\2\57\2\60\1\57\22\60\1\57\1\60\2\57\1\60\1\57\1\60"+\r
-            "\4\57\1\60\2\57\1\55\1\56\12\60\1\57\1\60\1\57\1\60\1\57\1\60"+\r
-            "\1\57\32\60\3\57\35\60\3\57\uff82\60",\r
+            "\11\54\2\53\2\54\1\53\22\54\1\53\1\54\2\53\1\54\1\53\1\54"+\r
+            "\4\53\1\54\2\53\1\51\1\52\12\54\1\53\1\54\1\53\1\54\1\53\1\54"+\r
+            "\1\53\32\54\3\53\35\54\3\53\uff82\54",\r
             "",\r
             "",\r
             "",\r
-            "\1\61",\r
+            "\1\55",\r
             "",\r
             "",\r
             "",\r
             "",\r
             "",\r
-            "\1\62\26\uffff\1\62\37\uffff\1\62",\r
-            "\1\62\1\uffff\12\63\13\uffff\1\62\37\uffff\1\62",\r
+            "\1\56\26\uffff\1\56\37\uffff\1\56",\r
+            "\1\56\1\uffff\12\57\13\uffff\1\56\37\uffff\1\56",\r
             "",\r
-            "\11\33\2\uffff\2\33\1\uffff\22\33\1\uffff\1\33\2\uffff\1\33"+\r
-            "\1\uffff\1\33\4\uffff\1\33\3\uffff\1\33\12\64\1\uffff\1\33\1"+\r
-            "\uffff\1\33\1\uffff\1\33\1\uffff\32\33\3\uffff\35\33\3\uffff"+\r
-            "\uff82\33",\r
-            "\1\65\1\uffff\1\62\2\uffff\12\66",\r
-            "\11\33\2\uffff\2\33\1\uffff\22\33\1\uffff\1\33\2\uffff\1\33"+\r
-            "\1\uffff\1\33\4\uffff\1\33\2\uffff\1\40\1\33\12\42\1\uffff\1"+\r
-            "\33\1\uffff\1\33\1\uffff\1\33\1\uffff\4\33\1\41\25\33\3\uffff"+\r
-            "\7\33\1\41\25\33\3\uffff\uff82\33",\r
-            "\1\67",\r
-            "\1\70",\r
-            "\1\71",\r
+            "\11\27\2\uffff\2\27\1\uffff\22\27\1\uffff\1\27\2\uffff\1\27"+\r
+            "\1\uffff\1\27\4\uffff\1\27\3\uffff\1\27\12\60\1\uffff\1\27\1"+\r
+            "\uffff\1\27\1\uffff\1\27\1\uffff\32\27\3\uffff\35\27\3\uffff"+\r
+            "\uff82\27",\r
+            "\1\61\1\uffff\1\56\2\uffff\12\62",\r
+            "\11\27\2\uffff\2\27\1\uffff\22\27\1\uffff\1\27\2\uffff\1\27"+\r
+            "\1\uffff\1\27\4\uffff\1\27\2\uffff\1\34\1\27\12\36\1\uffff\1"+\r
+            "\27\1\uffff\1\27\1\uffff\1\27\1\uffff\4\27\1\35\25\27\3\uffff"+\r
+            "\7\27\1\35\25\27\3\uffff\uff82\27",\r
+            "\1\63",\r
+            "\1\64",\r
+            "\1\65",\r
             "",\r
             "",\r
             "",\r
             "",\r
             "",\r
-            "\11\33\2\uffff\2\33\1\uffff\22\33\1\uffff\1\33\2\uffff\1\33"+\r
-            "\1\uffff\1\33\4\uffff\1\33\2\uffff\14\33\1\uffff\1\33\1\uffff"+\r
-            "\1\33\1\uffff\1\33\1\uffff\32\33\3\uffff\35\33\3\uffff\uff82"+\r
-            "\33",\r
-            "\11\33\2\uffff\2\33\1\uffff\22\33\1\uffff\1\33\2\uffff\1\33"+\r
-            "\1\uffff\1\33\4\uffff\1\33\2\uffff\14\33\1\uffff\1\33\1\uffff"+\r
-            "\1\33\1\uffff\1\33\1\uffff\32\33\3\uffff\35\33\3\uffff\uff82"+\r
-            "\33",\r
-            "\11\75\2\57\2\75\1\57\22\75\1\57\1\75\2\57\1\75\1\57\1\75"+\r
-            "\4\57\1\75\3\57\1\74\12\75\1\57\1\75\1\57\1\75\1\57\1\75\1\57"+\r
-            "\32\75\3\57\35\75\3\57\uff82\75",\r
-            "\11\60\2\uffff\2\60\1\uffff\22\60\1\uffff\1\60\2\uffff\1\60"+\r
-            "\1\uffff\1\60\4\uffff\1\60\2\uffff\1\55\1\56\12\60\1\uffff\1"+\r
-            "\60\1\uffff\1\60\1\uffff\1\60\1\uffff\32\76\3\uffff\3\60\32"+\r
-            "\76\3\uffff\uff82\60",\r
+            "\11\27\2\uffff\2\27\1\uffff\22\27\1\uffff\1\27\2\uffff\1\27"+\r
+            "\1\uffff\1\27\4\uffff\1\27\2\uffff\14\27\1\uffff\1\27\1\uffff"+\r
+            "\1\27\1\uffff\1\27\1\uffff\32\27\3\uffff\35\27\3\uffff\uff82"+\r
+            "\27",\r
+            "\11\27\2\uffff\2\27\1\uffff\22\27\1\uffff\1\27\2\uffff\1\27"+\r
+            "\1\uffff\1\27\4\uffff\1\27\2\uffff\14\27\1\uffff\1\27\1\uffff"+\r
+            "\1\27\1\uffff\1\27\1\uffff\32\27\3\uffff\35\27\3\uffff\uff82"+\r
+            "\27",\r
+            "\11\71\2\53\2\71\1\53\22\71\1\53\1\71\2\53\1\71\1\53\1\71"+\r
+            "\4\53\1\71\3\53\1\70\12\71\1\53\1\71\1\53\1\71\1\53\1\71\1\53"+\r
+            "\32\71\3\53\35\71\3\53\uff82\71",\r
+            "\11\54\2\uffff\2\54\1\uffff\22\54\1\uffff\1\54\2\uffff\1\54"+\r
+            "\1\uffff\1\54\4\uffff\1\54\2\uffff\1\51\1\52\12\54\1\uffff\1"+\r
+            "\54\1\uffff\1\54\1\uffff\1\54\1\uffff\32\72\3\uffff\3\54\32"+\r
+            "\72\3\uffff\uff82\54",\r
             "",\r
-            "\11\60\2\57\2\60\1\57\22\60\1\57\1\60\2\57\1\60\1\57\1\60"+\r
-            "\4\57\1\60\2\57\1\55\1\56\12\60\1\57\1\60\1\57\1\60\1\57\1\60"+\r
-            "\1\57\32\60\3\57\35\60\3\57\uff82\60",\r
-            "\11\33\2\uffff\2\33\1\uffff\22\33\1\uffff\1\33\2\uffff\1\33"+\r
-            "\1\uffff\1\33\4\uffff\1\33\2\uffff\14\33\1\uffff\1\33\1\uffff"+\r
-            "\1\33\1\uffff\1\33\1\uffff\32\33\3\uffff\35\33\3\uffff\uff82"+\r
-            "\33",\r
+            "\11\54\2\53\2\54\1\53\22\54\1\53\1\54\2\53\1\54\1\53\1\54"+\r
+            "\4\53\1\54\2\53\1\51\1\52\12\54\1\53\1\54\1\53\1\54\1\53\1\54"+\r
+            "\1\53\32\54\3\53\35\54\3\53\uff82\54",\r
+            "\11\27\2\uffff\2\27\1\uffff\22\27\1\uffff\1\27\2\uffff\1\27"+\r
+            "\1\uffff\1\27\4\uffff\1\27\2\uffff\14\27\1\uffff\1\27\1\uffff"+\r
+            "\1\27\1\uffff\1\27\1\uffff\32\27\3\uffff\35\27\3\uffff\uff82"+\r
+            "\27",\r
             "",\r
-            "\1\62\1\uffff\12\63\13\uffff\1\62\37\uffff\1\62",\r
-            "\11\33\2\uffff\2\33\1\uffff\22\33\1\uffff\1\33\2\uffff\1\33"+\r
-            "\1\uffff\1\33\4\uffff\1\33\2\uffff\2\33\12\64\1\uffff\1\33\1"+\r
-            "\uffff\1\33\1\uffff\1\33\1\uffff\4\33\1\100\25\33\3\uffff\7"+\r
-            "\33\1\100\25\33\3\uffff\uff82\33",\r
-            "\12\66",\r
-            "\11\33\2\uffff\2\33\1\uffff\22\33\1\uffff\1\33\2\uffff\1\33"+\r
-            "\1\uffff\1\33\4\uffff\1\33\2\uffff\2\33\12\66\1\uffff\1\33\1"+\r
-            "\uffff\1\33\1\uffff\1\33\1\uffff\32\33\3\uffff\35\33\3\uffff"+\r
-            "\uff82\33",\r
-            "\1\101",\r
-            "\1\102",\r
-            "\1\103",\r
+            "\1\56\1\uffff\12\57\13\uffff\1\56\37\uffff\1\56",\r
+            "\11\27\2\uffff\2\27\1\uffff\22\27\1\uffff\1\27\2\uffff\1\27"+\r
+            "\1\uffff\1\27\4\uffff\1\27\2\uffff\2\27\12\60\1\uffff\1\27\1"+\r
+            "\uffff\1\27\1\uffff\1\27\1\uffff\4\27\1\74\25\27\3\uffff\7\27"+\r
+            "\1\74\25\27\3\uffff\uff82\27",\r
+            "\12\62",\r
+            "\11\27\2\uffff\2\27\1\uffff\22\27\1\uffff\1\27\2\uffff\1\27"+\r
+            "\1\uffff\1\27\4\uffff\1\27\2\uffff\2\27\12\62\1\uffff\1\27\1"+\r
+            "\uffff\1\27\1\uffff\1\27\1\uffff\32\27\3\uffff\35\27\3\uffff"+\r
+            "\uff82\27",\r
+            "\1\75",\r
+            "\1\76",\r
+            "\1\77",\r
             "",\r
             "",\r
-            "\11\75\2\uffff\2\75\1\uffff\22\75\1\uffff\1\75\2\uffff\1\75"+\r
-            "\1\uffff\1\75\4\uffff\1\75\2\uffff\1\55\1\74\12\75\1\uffff\1"+\r
-            "\75\1\uffff\1\75\1\uffff\1\75\1\uffff\32\104\3\uffff\3\75\32"+\r
-            "\104\3\uffff\uff82\75",\r
-            "\11\75\2\57\2\75\1\57\22\75\1\57\1\75\2\57\1\75\1\57\1\75"+\r
-            "\4\57\1\75\2\57\1\55\1\74\12\75\1\57\1\75\1\57\1\75\1\57\1\75"+\r
-            "\1\57\32\75\3\57\35\75\3\57\uff82\75",\r
-            "\11\60\2\uffff\2\60\1\uffff\22\60\1\uffff\1\60\2\uffff\1\60"+\r
-            "\1\uffff\1\60\4\uffff\1\60\2\uffff\1\55\1\56\12\60\1\uffff\1"+\r
-            "\60\1\uffff\1\60\1\uffff\1\60\1\uffff\32\76\3\uffff\3\60\32"+\r
-            "\76\3\uffff\uff82\60",\r
+            "\11\71\2\uffff\2\71\1\uffff\22\71\1\uffff\1\71\2\uffff\1\71"+\r
+            "\1\uffff\1\71\4\uffff\1\71\2\uffff\1\51\1\70\12\71\1\uffff\1"+\r
+            "\71\1\uffff\1\71\1\uffff\1\71\1\uffff\32\100\3\uffff\3\71\32"+\r
+            "\100\3\uffff\uff82\71",\r
+            "\11\71\2\53\2\71\1\53\22\71\1\53\1\71\2\53\1\71\1\53\1\71"+\r
+            "\4\53\1\71\2\53\1\51\1\70\12\71\1\53\1\71\1\53\1\71\1\53\1\71"+\r
+            "\1\53\32\71\3\53\35\71\3\53\uff82\71",\r
+            "\11\54\2\uffff\2\54\1\uffff\22\54\1\uffff\1\54\2\uffff\1\54"+\r
+            "\1\uffff\1\54\4\uffff\1\54\2\uffff\1\51\1\52\12\54\1\uffff\1"+\r
+            "\54\1\uffff\1\54\1\uffff\1\54\1\uffff\32\72\3\uffff\3\54\32"+\r
+            "\72\3\uffff\uff82\54",\r
             "",\r
-            "\1\105\1\uffff\1\62\2\uffff\12\106",\r
-            "\11\33\2\uffff\2\33\1\uffff\22\33\1\uffff\1\33\2\uffff\1\33"+\r
-            "\1\uffff\1\33\4\uffff\1\33\2\uffff\14\33\1\uffff\1\33\1\uffff"+\r
-            "\1\33\1\uffff\1\33\1\uffff\32\33\3\uffff\35\33\3\uffff\uff82"+\r
-            "\33",\r
-            "\1\110",\r
-            "\11\33\2\uffff\2\33\1\uffff\22\33\1\uffff\1\33\2\uffff\1\33"+\r
-            "\1\uffff\1\33\4\uffff\1\33\2\uffff\14\33\1\uffff\1\33\1\uffff"+\r
-            "\1\33\1\uffff\1\33\1\uffff\32\33\3\uffff\35\33\3\uffff\uff82"+\r
-            "\33",\r
-            "\11\75\2\uffff\2\75\1\uffff\22\75\1\uffff\1\75\2\uffff\1\75"+\r
-            "\1\uffff\1\75\4\uffff\1\75\2\uffff\1\55\1\74\12\75\1\uffff\1"+\r
-            "\75\1\uffff\1\75\1\uffff\1\75\1\uffff\32\104\3\uffff\3\75\32"+\r
-            "\104\3\uffff\uff82\75",\r
-            "\12\106",\r
-            "\11\33\2\uffff\2\33\1\uffff\22\33\1\uffff\1\33\2\uffff\1\33"+\r
-            "\1\uffff\1\33\4\uffff\1\33\2\uffff\2\33\12\106\1\uffff\1\33"+\r
-            "\1\uffff\1\33\1\uffff\1\33\1\uffff\32\33\3\uffff\35\33\3\uffff"+\r
-            "\uff82\33",\r
+            "\1\101\1\uffff\1\56\2\uffff\12\102",\r
+            "\11\27\2\uffff\2\27\1\uffff\22\27\1\uffff\1\27\2\uffff\1\27"+\r
+            "\1\uffff\1\27\4\uffff\1\27\2\uffff\14\27\1\uffff\1\27\1\uffff"+\r
+            "\1\27\1\uffff\1\27\1\uffff\32\27\3\uffff\35\27\3\uffff\uff82"+\r
+            "\27",\r
+            "\1\104",\r
+            "\11\27\2\uffff\2\27\1\uffff\22\27\1\uffff\1\27\2\uffff\1\27"+\r
+            "\1\uffff\1\27\4\uffff\1\27\2\uffff\14\27\1\uffff\1\27\1\uffff"+\r
+            "\1\27\1\uffff\1\27\1\uffff\32\27\3\uffff\35\27\3\uffff\uff82"+\r
+            "\27",\r
+            "\11\71\2\uffff\2\71\1\uffff\22\71\1\uffff\1\71\2\uffff\1\71"+\r
+            "\1\uffff\1\71\4\uffff\1\71\2\uffff\1\51\1\70\12\71\1\uffff\1"+\r
+            "\71\1\uffff\1\71\1\uffff\1\71\1\uffff\32\100\3\uffff\3\71\32"+\r
+            "\100\3\uffff\uff82\71",\r
+            "\12\102",\r
+            "\11\27\2\uffff\2\27\1\uffff\22\27\1\uffff\1\27\2\uffff\1\27"+\r
+            "\1\uffff\1\27\4\uffff\1\27\2\uffff\2\27\12\102\1\uffff\1\27"+\r
+            "\1\uffff\1\27\1\uffff\1\27\1\uffff\32\27\3\uffff\35\27\3\uffff"+\r
+            "\uff82\27",\r
             "",\r
-            "\11\33\2\uffff\2\33\1\uffff\22\33\1\uffff\1\33\2\uffff\1\33"+\r
-            "\1\uffff\1\33\4\uffff\1\33\2\uffff\14\33\1\uffff\1\33\1\uffff"+\r
-            "\1\33\1\uffff\1\33\1\uffff\32\33\3\uffff\35\33\3\uffff\uff82"+\r
-            "\33",\r
+            "\11\27\2\uffff\2\27\1\uffff\22\27\1\uffff\1\27\2\uffff\1\27"+\r
+            "\1\uffff\1\27\4\uffff\1\27\2\uffff\14\27\1\uffff\1\27\1\uffff"+\r
+            "\1\27\1\uffff\1\27\1\uffff\32\27\3\uffff\35\27\3\uffff\uff82"+\r
+            "\27",\r
             "",\r
             ""\r
     };\r
@@ -2089,357 +1970,349 @@ public class LensQueryLexer extends Lexer {
             this.transition = DFA20_transition;\r
         }\r
         public String getDescription() {\r
-            return "1:1: Tokens : ( LineComment | LineBreak | String | Integer | Double | True | False | Null | LBrace | RBrace | LBracket | RBracket | Lt | Gt | Leq | Geq | Eq | Neq | Match | Regex | Dot | Comma | Colon | As | LParen | RParen | Star | QName | WhiteSpaces );";\r
+            return "1:1: Tokens : ( LineComment | LineBreak | String | Integer | Double | True | False | Null | Lt | Gt | Leq | Geq | Eq | Neq | Match | Regex | Dot | Comma | Colon | As | LParen | RParen | Star | QName | WhiteSpaces );";\r
         }\r
         public int specialStateTransition(int s, IntStream _input) throws NoViableAltException {\r
             IntStream input = _input;\r
                int _s = s;\r
             switch ( s ) {\r
                     case 0 : \r
-                        int LA20_0 = input.LA(1);\r
+                        int LA20_39 = input.LA(1);\r
 \r
                         s = -1;\r
-                        if ( (LA20_0=='#') ) {s = 1;}\r
-\r
-                        else if ( (LA20_0=='\n'||LA20_0=='\r') ) {s = 2;}\r
-\r
-                        else if ( (LA20_0=='\"') ) {s = 3;}\r
-\r
-                        else if ( (LA20_0=='-') ) {s = 4;}\r
-\r
-                        else if ( (LA20_0=='0') ) {s = 5;}\r
-\r
-                        else if ( ((LA20_0>='1' && LA20_0<='9')) ) {s = 6;}\r
-\r
-                        else if ( (LA20_0=='t') ) {s = 7;}\r
-\r
-                        else if ( (LA20_0=='f') ) {s = 8;}\r
-\r
-                        else if ( (LA20_0=='n') ) {s = 9;}\r
-\r
-                        else if ( (LA20_0=='{') ) {s = 10;}\r
-\r
-                        else if ( (LA20_0=='}') ) {s = 11;}\r
-\r
-                        else if ( (LA20_0=='[') ) {s = 12;}\r
-\r
-                        else if ( (LA20_0==']') ) {s = 13;}\r
-\r
-                        else if ( (LA20_0=='<') ) {s = 14;}\r
-\r
-                        else if ( (LA20_0=='>') ) {s = 15;}\r
-\r
-                        else if ( (LA20_0=='=') ) {s = 16;}\r
-\r
-                        else if ( (LA20_0=='!') ) {s = 17;}\r
-\r
-                        else if ( (LA20_0=='~') ) {s = 18;}\r
-\r
-                        else if ( (LA20_0=='/') ) {s = 19;}\r
-\r
-                        else if ( (LA20_0=='.') ) {s = 20;}\r
-\r
-                        else if ( (LA20_0==',') ) {s = 21;}\r
-\r
-                        else if ( (LA20_0==':') ) {s = 22;}\r
-\r
-                        else if ( (LA20_0=='a') ) {s = 23;}\r
-\r
-                        else if ( (LA20_0=='(') ) {s = 24;}\r
+                        if ( ((LA20_39>='\u0000' && LA20_39<='\b')||(LA20_39>='\u000B' && LA20_39<='\f')||(LA20_39>='\u000E' && LA20_39<='\u001F')||LA20_39=='!'||LA20_39=='$'||LA20_39=='&'||LA20_39=='+'||(LA20_39>='.' && LA20_39<='9')||LA20_39==';'||LA20_39=='='||LA20_39=='?'||(LA20_39>='A' && LA20_39<='Z')||(LA20_39>='^' && LA20_39<='z')||(LA20_39>='~' && LA20_39<='\uFFFF')) ) {s = 23;}\r
 \r
-                        else if ( (LA20_0==')') ) {s = 25;}\r
-\r
-                        else if ( (LA20_0=='*') ) {s = 26;}\r
-\r
-                        else if ( ((LA20_0>='\u0000' && LA20_0<='\b')||(LA20_0>='\u000B' && LA20_0<='\f')||(LA20_0>='\u000E' && LA20_0<='\u001F')||LA20_0=='$'||LA20_0=='&'||LA20_0=='+'||LA20_0==';'||LA20_0=='?'||(LA20_0>='A' && LA20_0<='Z')||(LA20_0>='^' && LA20_0<='`')||(LA20_0>='b' && LA20_0<='e')||(LA20_0>='g' && LA20_0<='m')||(LA20_0>='o' && LA20_0<='s')||(LA20_0>='u' && LA20_0<='z')||(LA20_0>='\u007F' && LA20_0<='\uFFFF')) ) {s = 27;}\r
-\r
-                        else if ( (LA20_0=='\t'||LA20_0==' ') ) {s = 28;}\r
+                        else s = 54;\r
 \r
                         if ( s>=0 ) return s;\r
                         break;\r
                     case 1 : \r
-                        int LA20_6 = input.LA(1);\r
+                        int LA20_61 = input.LA(1);\r
 \r
                         s = -1;\r
-                        if ( (LA20_6=='.') ) {s = 32;}\r
-\r
-                        else if ( ((LA20_6>='0' && LA20_6<='9')) ) {s = 34;}\r
-\r
-                        else if ( (LA20_6=='E'||LA20_6=='e') ) {s = 33;}\r
+                        if ( ((LA20_61>='\u0000' && LA20_61<='\b')||(LA20_61>='\u000B' && LA20_61<='\f')||(LA20_61>='\u000E' && LA20_61<='\u001F')||LA20_61=='!'||LA20_61=='$'||LA20_61=='&'||LA20_61=='+'||(LA20_61>='.' && LA20_61<='9')||LA20_61==';'||LA20_61=='='||LA20_61=='?'||(LA20_61>='A' && LA20_61<='Z')||(LA20_61>='^' && LA20_61<='z')||(LA20_61>='~' && LA20_61<='\uFFFF')) ) {s = 23;}\r
 \r
-                        else if ( ((LA20_6>='\u0000' && LA20_6<='\b')||(LA20_6>='\u000B' && LA20_6<='\f')||(LA20_6>='\u000E' && LA20_6<='\u001F')||LA20_6=='!'||LA20_6=='$'||LA20_6=='&'||LA20_6=='+'||LA20_6=='/'||LA20_6==';'||LA20_6=='='||LA20_6=='?'||(LA20_6>='A' && LA20_6<='D')||(LA20_6>='F' && LA20_6<='Z')||(LA20_6>='^' && LA20_6<='d')||(LA20_6>='f' && LA20_6<='z')||(LA20_6>='~' && LA20_6<='\uFFFF')) ) {s = 27;}\r
-\r
-                        else s = 31;\r
+                        else s = 67;\r
 \r
                         if ( s>=0 ) return s;\r
                         break;\r
                     case 2 : \r
-                        int LA20_43 = input.LA(1);\r
+                        int LA20_44 = input.LA(1);\r
 \r
                         s = -1;\r
-                        if ( ((LA20_43>='\u0000' && LA20_43<='\b')||(LA20_43>='\u000B' && LA20_43<='\f')||(LA20_43>='\u000E' && LA20_43<='\u001F')||LA20_43=='!'||LA20_43=='$'||LA20_43=='&'||LA20_43=='+'||(LA20_43>='.' && LA20_43<='9')||LA20_43==';'||LA20_43=='='||LA20_43=='?'||(LA20_43>='A' && LA20_43<='Z')||(LA20_43>='^' && LA20_43<='z')||(LA20_43>='~' && LA20_43<='\uFFFF')) ) {s = 27;}\r
+                        if ( (LA20_44=='.') ) {s = 41;}\r
+\r
+                        else if ( (LA20_44=='/') ) {s = 42;}\r
+\r
+                        else if ( ((LA20_44>='\u0000' && LA20_44<='\b')||(LA20_44>='\u000B' && LA20_44<='\f')||(LA20_44>='\u000E' && LA20_44<='\u001F')||LA20_44=='!'||LA20_44=='$'||LA20_44=='&'||LA20_44=='+'||(LA20_44>='0' && LA20_44<='9')||LA20_44==';'||LA20_44=='='||LA20_44=='?'||(LA20_44>='A' && LA20_44<='Z')||(LA20_44>='^' && LA20_44<='z')||(LA20_44>='~' && LA20_44<='\uFFFF')) ) {s = 44;}\r
 \r
-                        else s = 58;\r
+                        else if ( ((LA20_44>='\t' && LA20_44<='\n')||LA20_44=='\r'||LA20_44==' '||(LA20_44>='\"' && LA20_44<='#')||LA20_44=='%'||(LA20_44>='\'' && LA20_44<='*')||(LA20_44>=',' && LA20_44<='-')||LA20_44==':'||LA20_44=='<'||LA20_44=='>'||LA20_44=='@'||(LA20_44>='[' && LA20_44<=']')||(LA20_44>='{' && LA20_44<='}')) ) {s = 43;}\r
+\r
+                        else s = 23;\r
 \r
                         if ( s>=0 ) return s;\r
                         break;\r
                     case 3 : \r
-                        int LA20_65 = input.LA(1);\r
+                        int LA20_64 = input.LA(1);\r
 \r
                         s = -1;\r
-                        if ( ((LA20_65>='\u0000' && LA20_65<='\b')||(LA20_65>='\u000B' && LA20_65<='\f')||(LA20_65>='\u000E' && LA20_65<='\u001F')||LA20_65=='!'||LA20_65=='$'||LA20_65=='&'||LA20_65=='+'||(LA20_65>='.' && LA20_65<='9')||LA20_65==';'||LA20_65=='='||LA20_65=='?'||(LA20_65>='A' && LA20_65<='Z')||(LA20_65>='^' && LA20_65<='z')||(LA20_65>='~' && LA20_65<='\uFFFF')) ) {s = 27;}\r
+                        if ( (LA20_64=='/') ) {s = 56;}\r
+\r
+                        else if ( (LA20_64=='.') ) {s = 41;}\r
+\r
+                        else if ( ((LA20_64>='A' && LA20_64<='Z')||(LA20_64>='a' && LA20_64<='z')) ) {s = 64;}\r
 \r
-                        else s = 71;\r
+                        else if ( ((LA20_64>='\u0000' && LA20_64<='\b')||(LA20_64>='\u000B' && LA20_64<='\f')||(LA20_64>='\u000E' && LA20_64<='\u001F')||LA20_64=='!'||LA20_64=='$'||LA20_64=='&'||LA20_64=='+'||(LA20_64>='0' && LA20_64<='9')||LA20_64==';'||LA20_64=='='||LA20_64=='?'||(LA20_64>='^' && LA20_64<='`')||(LA20_64>='~' && LA20_64<='\uFFFF')) ) {s = 57;}\r
+\r
+                        else s = 43;\r
 \r
                         if ( s>=0 ) return s;\r
                         break;\r
                     case 4 : \r
-                        int LA20_67 = input.LA(1);\r
+                        int LA20_12 = input.LA(1);\r
 \r
                         s = -1;\r
-                        if ( ((LA20_67>='\u0000' && LA20_67<='\b')||(LA20_67>='\u000B' && LA20_67<='\f')||(LA20_67>='\u000E' && LA20_67<='\u001F')||LA20_67=='!'||LA20_67=='$'||LA20_67=='&'||LA20_67=='+'||(LA20_67>='.' && LA20_67<='9')||LA20_67==';'||LA20_67=='='||LA20_67=='?'||(LA20_67>='A' && LA20_67<='Z')||(LA20_67>='^' && LA20_67<='z')||(LA20_67>='~' && LA20_67<='\uFFFF')) ) {s = 27;}\r
+                        if ( ((LA20_12>='\u0000' && LA20_12<='\b')||(LA20_12>='\u000B' && LA20_12<='\f')||(LA20_12>='\u000E' && LA20_12<='\u001F')||LA20_12=='!'||LA20_12=='$'||LA20_12=='&'||LA20_12=='+'||(LA20_12>='.' && LA20_12<='9')||LA20_12==';'||LA20_12=='='||LA20_12=='?'||(LA20_12>='A' && LA20_12<='Z')||(LA20_12>='^' && LA20_12<='z')||(LA20_12>='~' && LA20_12<='\uFFFF')) ) {s = 23;}\r
 \r
-                        else s = 73;\r
+                        else s = 38;\r
 \r
                         if ( s>=0 ) return s;\r
                         break;\r
                     case 5 : \r
-                        int LA20_60 = input.LA(1);\r
+                        int LA20_41 = input.LA(1);\r
 \r
                         s = -1;\r
-                        if ( ((LA20_60>='A' && LA20_60<='Z')||(LA20_60>='a' && LA20_60<='z')) ) {s = 68;}\r
-\r
-                        else if ( (LA20_60=='/') ) {s = 60;}\r
+                        if ( (LA20_41=='/') ) {s = 56;}\r
 \r
-                        else if ( (LA20_60=='.') ) {s = 45;}\r
+                        else if ( ((LA20_41>='\u0000' && LA20_41<='\b')||(LA20_41>='\u000B' && LA20_41<='\f')||(LA20_41>='\u000E' && LA20_41<='\u001F')||LA20_41=='!'||LA20_41=='$'||LA20_41=='&'||LA20_41=='+'||(LA20_41>='0' && LA20_41<='9')||LA20_41==';'||LA20_41=='='||LA20_41=='?'||(LA20_41>='A' && LA20_41<='Z')||(LA20_41>='^' && LA20_41<='z')||(LA20_41>='~' && LA20_41<='\uFFFF')) ) {s = 57;}\r
 \r
-                        else if ( ((LA20_60>='\u0000' && LA20_60<='\b')||(LA20_60>='\u000B' && LA20_60<='\f')||(LA20_60>='\u000E' && LA20_60<='\u001F')||LA20_60=='!'||LA20_60=='$'||LA20_60=='&'||LA20_60=='+'||(LA20_60>='0' && LA20_60<='9')||LA20_60==';'||LA20_60=='='||LA20_60=='?'||(LA20_60>='^' && LA20_60<='`')||(LA20_60>='~' && LA20_60<='\uFFFF')) ) {s = 61;}\r
-\r
-                        else s = 47;\r
+                        else if ( ((LA20_41>='\t' && LA20_41<='\n')||LA20_41=='\r'||LA20_41==' '||(LA20_41>='\"' && LA20_41<='#')||LA20_41=='%'||(LA20_41>='\'' && LA20_41<='*')||(LA20_41>=',' && LA20_41<='.')||LA20_41==':'||LA20_41=='<'||LA20_41=='>'||LA20_41=='@'||(LA20_41>='[' && LA20_41<=']')||(LA20_41>='{' && LA20_41<='}')) ) {s = 43;}\r
 \r
                         if ( s>=0 ) return s;\r
                         break;\r
                     case 6 : \r
-                        int LA20_32 = input.LA(1);\r
+                        int LA20_50 = input.LA(1);\r
 \r
                         s = -1;\r
-                        if ( ((LA20_32>='0' && LA20_32<='9')) ) {s = 52;}\r
+                        if ( ((LA20_50>='\u0000' && LA20_50<='\b')||(LA20_50>='\u000B' && LA20_50<='\f')||(LA20_50>='\u000E' && LA20_50<='\u001F')||LA20_50=='!'||LA20_50=='$'||LA20_50=='&'||LA20_50=='+'||(LA20_50>='.' && LA20_50<='/')||LA20_50==';'||LA20_50=='='||LA20_50=='?'||(LA20_50>='A' && LA20_50<='Z')||(LA20_50>='^' && LA20_50<='z')||(LA20_50>='~' && LA20_50<='\uFFFF')) ) {s = 23;}\r
+\r
+                        else if ( ((LA20_50>='0' && LA20_50<='9')) ) {s = 50;}\r
 \r
-                        else if ( ((LA20_32>='\u0000' && LA20_32<='\b')||(LA20_32>='\u000B' && LA20_32<='\f')||(LA20_32>='\u000E' && LA20_32<='\u001F')||LA20_32=='!'||LA20_32=='$'||LA20_32=='&'||LA20_32=='+'||LA20_32=='/'||LA20_32==';'||LA20_32=='='||LA20_32=='?'||(LA20_32>='A' && LA20_32<='Z')||(LA20_32>='^' && LA20_32<='z')||(LA20_32>='~' && LA20_32<='\uFFFF')) ) {s = 27;}\r
+                        else s = 46;\r
 \r
                         if ( s>=0 ) return s;\r
                         break;\r
                     case 7 : \r
-                        int LA20_72 = input.LA(1);\r
+                        int LA20_30 = input.LA(1);\r
 \r
                         s = -1;\r
-                        if ( ((LA20_72>='\u0000' && LA20_72<='\b')||(LA20_72>='\u000B' && LA20_72<='\f')||(LA20_72>='\u000E' && LA20_72<='\u001F')||LA20_72=='!'||LA20_72=='$'||LA20_72=='&'||LA20_72=='+'||(LA20_72>='.' && LA20_72<='9')||LA20_72==';'||LA20_72=='='||LA20_72=='?'||(LA20_72>='A' && LA20_72<='Z')||(LA20_72>='^' && LA20_72<='z')||(LA20_72>='~' && LA20_72<='\uFFFF')) ) {s = 27;}\r
+                        if ( (LA20_30=='.') ) {s = 28;}\r
 \r
-                        else s = 74;\r
+                        else if ( ((LA20_30>='0' && LA20_30<='9')) ) {s = 30;}\r
+\r
+                        else if ( (LA20_30=='E'||LA20_30=='e') ) {s = 29;}\r
+\r
+                        else if ( ((LA20_30>='\u0000' && LA20_30<='\b')||(LA20_30>='\u000B' && LA20_30<='\f')||(LA20_30>='\u000E' && LA20_30<='\u001F')||LA20_30=='!'||LA20_30=='$'||LA20_30=='&'||LA20_30=='+'||LA20_30=='/'||LA20_30==';'||LA20_30=='='||LA20_30=='?'||(LA20_30>='A' && LA20_30<='D')||(LA20_30>='F' && LA20_30<='Z')||(LA20_30>='^' && LA20_30<='d')||(LA20_30>='f' && LA20_30<='z')||(LA20_30>='~' && LA20_30<='\uFFFF')) ) {s = 23;}\r
+\r
+                        else s = 27;\r
 \r
                         if ( s>=0 ) return s;\r
                         break;\r
                     case 8 : \r
-                        int LA20_54 = input.LA(1);\r
+                        int LA20_56 = input.LA(1);\r
 \r
                         s = -1;\r
-                        if ( ((LA20_54>='0' && LA20_54<='9')) ) {s = 54;}\r
+                        if ( (LA20_56=='/') ) {s = 56;}\r
+\r
+                        else if ( (LA20_56=='.') ) {s = 41;}\r
+\r
+                        else if ( ((LA20_56>='A' && LA20_56<='Z')||(LA20_56>='a' && LA20_56<='z')) ) {s = 64;}\r
 \r
-                        else if ( ((LA20_54>='\u0000' && LA20_54<='\b')||(LA20_54>='\u000B' && LA20_54<='\f')||(LA20_54>='\u000E' && LA20_54<='\u001F')||LA20_54=='!'||LA20_54=='$'||LA20_54=='&'||LA20_54=='+'||(LA20_54>='.' && LA20_54<='/')||LA20_54==';'||LA20_54=='='||LA20_54=='?'||(LA20_54>='A' && LA20_54<='Z')||(LA20_54>='^' && LA20_54<='z')||(LA20_54>='~' && LA20_54<='\uFFFF')) ) {s = 27;}\r
+                        else if ( ((LA20_56>='\u0000' && LA20_56<='\b')||(LA20_56>='\u000B' && LA20_56<='\f')||(LA20_56>='\u000E' && LA20_56<='\u001F')||LA20_56=='!'||LA20_56=='$'||LA20_56=='&'||LA20_56=='+'||(LA20_56>='0' && LA20_56<='9')||LA20_56==';'||LA20_56=='='||LA20_56=='?'||(LA20_56>='^' && LA20_56<='`')||(LA20_56>='~' && LA20_56<='\uFFFF')) ) {s = 57;}\r
 \r
-                        else s = 50;\r
+                        else s = 43;\r
 \r
                         if ( s>=0 ) return s;\r
                         break;\r
                     case 9 : \r
-                        int LA20_52 = input.LA(1);\r
+                        int LA20_68 = input.LA(1);\r
 \r
                         s = -1;\r
-                        if ( (LA20_52=='E'||LA20_52=='e') ) {s = 64;}\r
-\r
-                        else if ( ((LA20_52>='0' && LA20_52<='9')) ) {s = 52;}\r
-\r
-                        else if ( ((LA20_52>='\u0000' && LA20_52<='\b')||(LA20_52>='\u000B' && LA20_52<='\f')||(LA20_52>='\u000E' && LA20_52<='\u001F')||LA20_52=='!'||LA20_52=='$'||LA20_52=='&'||LA20_52=='+'||(LA20_52>='.' && LA20_52<='/')||LA20_52==';'||LA20_52=='='||LA20_52=='?'||(LA20_52>='A' && LA20_52<='D')||(LA20_52>='F' && LA20_52<='Z')||(LA20_52>='^' && LA20_52<='d')||(LA20_52>='f' && LA20_52<='z')||(LA20_52>='~' && LA20_52<='\uFFFF')) ) {s = 27;}\r
+                        if ( ((LA20_68>='\u0000' && LA20_68<='\b')||(LA20_68>='\u000B' && LA20_68<='\f')||(LA20_68>='\u000E' && LA20_68<='\u001F')||LA20_68=='!'||LA20_68=='$'||LA20_68=='&'||LA20_68=='+'||(LA20_68>='.' && LA20_68<='9')||LA20_68==';'||LA20_68=='='||LA20_68=='?'||(LA20_68>='A' && LA20_68<='Z')||(LA20_68>='^' && LA20_68<='z')||(LA20_68>='~' && LA20_68<='\uFFFF')) ) {s = 23;}\r
 \r
-                        else s = 50;\r
+                        else s = 70;\r
 \r
                         if ( s>=0 ) return s;\r
                         break;\r
                     case 10 : \r
-                        int LA20_45 = input.LA(1);\r
+                        int LA20_66 = input.LA(1);\r
 \r
                         s = -1;\r
-                        if ( (LA20_45=='/') ) {s = 60;}\r
+                        if ( ((LA20_66>='0' && LA20_66<='9')) ) {s = 66;}\r
 \r
-                        else if ( ((LA20_45>='\u0000' && LA20_45<='\b')||(LA20_45>='\u000B' && LA20_45<='\f')||(LA20_45>='\u000E' && LA20_45<='\u001F')||LA20_45=='!'||LA20_45=='$'||LA20_45=='&'||LA20_45=='+'||(LA20_45>='0' && LA20_45<='9')||LA20_45==';'||LA20_45=='='||LA20_45=='?'||(LA20_45>='A' && LA20_45<='Z')||(LA20_45>='^' && LA20_45<='z')||(LA20_45>='~' && LA20_45<='\uFFFF')) ) {s = 61;}\r
+                        else if ( ((LA20_66>='\u0000' && LA20_66<='\b')||(LA20_66>='\u000B' && LA20_66<='\f')||(LA20_66>='\u000E' && LA20_66<='\u001F')||LA20_66=='!'||LA20_66=='$'||LA20_66=='&'||LA20_66=='+'||(LA20_66>='.' && LA20_66<='/')||LA20_66==';'||LA20_66=='='||LA20_66=='?'||(LA20_66>='A' && LA20_66<='Z')||(LA20_66>='^' && LA20_66<='z')||(LA20_66>='~' && LA20_66<='\uFFFF')) ) {s = 23;}\r
 \r
-                        else if ( ((LA20_45>='\t' && LA20_45<='\n')||LA20_45=='\r'||LA20_45==' '||(LA20_45>='\"' && LA20_45<='#')||LA20_45=='%'||(LA20_45>='\'' && LA20_45<='*')||(LA20_45>=',' && LA20_45<='.')||LA20_45==':'||LA20_45=='<'||LA20_45=='>'||LA20_45=='@'||(LA20_45>='[' && LA20_45<=']')||(LA20_45>='{' && LA20_45<='}')) ) {s = 47;}\r
+                        else s = 46;\r
 \r
                         if ( s>=0 ) return s;\r
                         break;\r
                     case 11 : \r
-                        int LA20_68 = input.LA(1);\r
+                        int LA20_63 = input.LA(1);\r
 \r
                         s = -1;\r
-                        if ( ((LA20_68>='A' && LA20_68<='Z')||(LA20_68>='a' && LA20_68<='z')) ) {s = 68;}\r
-\r
-                        else if ( (LA20_68=='/') ) {s = 60;}\r
-\r
-                        else if ( (LA20_68=='.') ) {s = 45;}\r
+                        if ( ((LA20_63>='\u0000' && LA20_63<='\b')||(LA20_63>='\u000B' && LA20_63<='\f')||(LA20_63>='\u000E' && LA20_63<='\u001F')||LA20_63=='!'||LA20_63=='$'||LA20_63=='&'||LA20_63=='+'||(LA20_63>='.' && LA20_63<='9')||LA20_63==';'||LA20_63=='='||LA20_63=='?'||(LA20_63>='A' && LA20_63<='Z')||(LA20_63>='^' && LA20_63<='z')||(LA20_63>='~' && LA20_63<='\uFFFF')) ) {s = 23;}\r
 \r
-                        else if ( ((LA20_68>='\u0000' && LA20_68<='\b')||(LA20_68>='\u000B' && LA20_68<='\f')||(LA20_68>='\u000E' && LA20_68<='\u001F')||LA20_68=='!'||LA20_68=='$'||LA20_68=='&'||LA20_68=='+'||(LA20_68>='0' && LA20_68<='9')||LA20_68==';'||LA20_68=='='||LA20_68=='?'||(LA20_68>='^' && LA20_68<='`')||(LA20_68>='~' && LA20_68<='\uFFFF')) ) {s = 61;}\r
-\r
-                        else s = 47;\r
+                        else s = 69;\r
 \r
                         if ( s>=0 ) return s;\r
                         break;\r
                     case 12 : \r
-                        int LA20_48 = input.LA(1);\r
+                        int LA20_6 = input.LA(1);\r
 \r
                         s = -1;\r
-                        if ( (LA20_48=='.') ) {s = 45;}\r
+                        if ( (LA20_6=='.') ) {s = 28;}\r
 \r
-                        else if ( (LA20_48=='/') ) {s = 46;}\r
+                        else if ( ((LA20_6>='0' && LA20_6<='9')) ) {s = 30;}\r
 \r
-                        else if ( ((LA20_48>='\u0000' && LA20_48<='\b')||(LA20_48>='\u000B' && LA20_48<='\f')||(LA20_48>='\u000E' && LA20_48<='\u001F')||LA20_48=='!'||LA20_48=='$'||LA20_48=='&'||LA20_48=='+'||(LA20_48>='0' && LA20_48<='9')||LA20_48==';'||LA20_48=='='||LA20_48=='?'||(LA20_48>='A' && LA20_48<='Z')||(LA20_48>='^' && LA20_48<='z')||(LA20_48>='~' && LA20_48<='\uFFFF')) ) {s = 48;}\r
+                        else if ( (LA20_6=='E'||LA20_6=='e') ) {s = 29;}\r
 \r
-                        else if ( ((LA20_48>='\t' && LA20_48<='\n')||LA20_48=='\r'||LA20_48==' '||(LA20_48>='\"' && LA20_48<='#')||LA20_48=='%'||(LA20_48>='\'' && LA20_48<='*')||(LA20_48>=',' && LA20_48<='-')||LA20_48==':'||LA20_48=='<'||LA20_48=='>'||LA20_48=='@'||(LA20_48>='[' && LA20_48<=']')||(LA20_48>='{' && LA20_48<='}')) ) {s = 47;}\r
+                        else if ( ((LA20_6>='\u0000' && LA20_6<='\b')||(LA20_6>='\u000B' && LA20_6<='\f')||(LA20_6>='\u000E' && LA20_6<='\u001F')||LA20_6=='!'||LA20_6=='$'||LA20_6=='&'||LA20_6=='+'||LA20_6=='/'||LA20_6==';'||LA20_6=='='||LA20_6=='?'||(LA20_6>='A' && LA20_6<='D')||(LA20_6>='F' && LA20_6<='Z')||(LA20_6>='^' && LA20_6<='d')||(LA20_6>='f' && LA20_6<='z')||(LA20_6>='~' && LA20_6<='\uFFFF')) ) {s = 23;}\r
 \r
                         else s = 27;\r
 \r
                         if ( s>=0 ) return s;\r
                         break;\r
                     case 13 : \r
-                        int LA20_70 = input.LA(1);\r
+                        int LA20_57 = input.LA(1);\r
 \r
                         s = -1;\r
-                        if ( ((LA20_70>='0' && LA20_70<='9')) ) {s = 70;}\r
+                        if ( (LA20_57=='/') ) {s = 56;}\r
 \r
-                        else if ( ((LA20_70>='\u0000' && LA20_70<='\b')||(LA20_70>='\u000B' && LA20_70<='\f')||(LA20_70>='\u000E' && LA20_70<='\u001F')||LA20_70=='!'||LA20_70=='$'||LA20_70=='&'||LA20_70=='+'||(LA20_70>='.' && LA20_70<='/')||LA20_70==';'||LA20_70=='='||LA20_70=='?'||(LA20_70>='A' && LA20_70<='Z')||(LA20_70>='^' && LA20_70<='z')||(LA20_70>='~' && LA20_70<='\uFFFF')) ) {s = 27;}\r
+                        else if ( (LA20_57=='.') ) {s = 41;}\r
 \r
-                        else s = 50;\r
+                        else if ( ((LA20_57>='\u0000' && LA20_57<='\b')||(LA20_57>='\u000B' && LA20_57<='\f')||(LA20_57>='\u000E' && LA20_57<='\u001F')||LA20_57=='!'||LA20_57=='$'||LA20_57=='&'||LA20_57=='+'||(LA20_57>='0' && LA20_57<='9')||LA20_57==';'||LA20_57=='='||LA20_57=='?'||(LA20_57>='A' && LA20_57<='Z')||(LA20_57>='^' && LA20_57<='z')||(LA20_57>='~' && LA20_57<='\uFFFF')) ) {s = 57;}\r
+\r
+                        else if ( ((LA20_57>='\t' && LA20_57<='\n')||LA20_57=='\r'||LA20_57==' '||(LA20_57>='\"' && LA20_57<='#')||LA20_57=='%'||(LA20_57>='\'' && LA20_57<='*')||(LA20_57>=',' && LA20_57<='-')||LA20_57==':'||LA20_57=='<'||LA20_57=='>'||LA20_57=='@'||(LA20_57>='[' && LA20_57<=']')||(LA20_57>='{' && LA20_57<='}')) ) {s = 43;}\r
+\r
+                        else s = 23;\r
 \r
                         if ( s>=0 ) return s;\r
                         break;\r
                     case 14 : \r
-                        int LA20_49 = input.LA(1);\r
+                        int LA20_42 = input.LA(1);\r
 \r
                         s = -1;\r
-                        if ( ((LA20_49>='\u0000' && LA20_49<='\b')||(LA20_49>='\u000B' && LA20_49<='\f')||(LA20_49>='\u000E' && LA20_49<='\u001F')||LA20_49=='!'||LA20_49=='$'||LA20_49=='&'||LA20_49=='+'||(LA20_49>='.' && LA20_49<='9')||LA20_49==';'||LA20_49=='='||LA20_49=='?'||(LA20_49>='A' && LA20_49<='Z')||(LA20_49>='^' && LA20_49<='z')||(LA20_49>='~' && LA20_49<='\uFFFF')) ) {s = 27;}\r
+                        if ( (LA20_42=='.') ) {s = 41;}\r
+\r
+                        else if ( (LA20_42=='/') ) {s = 42;}\r
+\r
+                        else if ( ((LA20_42>='A' && LA20_42<='Z')||(LA20_42>='a' && LA20_42<='z')) ) {s = 58;}\r
 \r
-                        else s = 63;\r
+                        else if ( ((LA20_42>='\u0000' && LA20_42<='\b')||(LA20_42>='\u000B' && LA20_42<='\f')||(LA20_42>='\u000E' && LA20_42<='\u001F')||LA20_42=='!'||LA20_42=='$'||LA20_42=='&'||LA20_42=='+'||(LA20_42>='0' && LA20_42<='9')||LA20_42==';'||LA20_42=='='||LA20_42=='?'||(LA20_42>='^' && LA20_42<='`')||(LA20_42>='~' && LA20_42<='\uFFFF')) ) {s = 44;}\r
+\r
+                        else s = 43;\r
 \r
                         if ( s>=0 ) return s;\r
                         break;\r
                     case 15 : \r
-                        int LA20_44 = input.LA(1);\r
+                        int LA20_45 = input.LA(1);\r
 \r
                         s = -1;\r
-                        if ( ((LA20_44>='\u0000' && LA20_44<='\b')||(LA20_44>='\u000B' && LA20_44<='\f')||(LA20_44>='\u000E' && LA20_44<='\u001F')||LA20_44=='!'||LA20_44=='$'||LA20_44=='&'||LA20_44=='+'||(LA20_44>='.' && LA20_44<='9')||LA20_44==';'||LA20_44=='='||LA20_44=='?'||(LA20_44>='A' && LA20_44<='Z')||(LA20_44>='^' && LA20_44<='z')||(LA20_44>='~' && LA20_44<='\uFFFF')) ) {s = 27;}\r
+                        if ( ((LA20_45>='\u0000' && LA20_45<='\b')||(LA20_45>='\u000B' && LA20_45<='\f')||(LA20_45>='\u000E' && LA20_45<='\u001F')||LA20_45=='!'||LA20_45=='$'||LA20_45=='&'||LA20_45=='+'||(LA20_45>='.' && LA20_45<='9')||LA20_45==';'||LA20_45=='='||LA20_45=='?'||(LA20_45>='A' && LA20_45<='Z')||(LA20_45>='^' && LA20_45<='z')||(LA20_45>='~' && LA20_45<='\uFFFF')) ) {s = 23;}\r
 \r
                         else s = 59;\r
 \r
                         if ( s>=0 ) return s;\r
                         break;\r
                     case 16 : \r
-                        int LA20_5 = input.LA(1);\r
+                        int LA20_0 = input.LA(1);\r
 \r
                         s = -1;\r
-                        if ( (LA20_5=='.') ) {s = 32;}\r
+                        if ( (LA20_0=='#') ) {s = 1;}\r
+\r
+                        else if ( (LA20_0=='\n'||LA20_0=='\r') ) {s = 2;}\r
+\r
+                        else if ( (LA20_0=='\"') ) {s = 3;}\r
+\r
+                        else if ( (LA20_0=='-') ) {s = 4;}\r
+\r
+                        else if ( (LA20_0=='0') ) {s = 5;}\r
+\r
+                        else if ( ((LA20_0>='1' && LA20_0<='9')) ) {s = 6;}\r
 \r
-                        else if ( (LA20_5=='E'||LA20_5=='e') ) {s = 33;}\r
+                        else if ( (LA20_0=='t') ) {s = 7;}\r
+\r
+                        else if ( (LA20_0=='f') ) {s = 8;}\r
+\r
+                        else if ( (LA20_0=='n') ) {s = 9;}\r
+\r
+                        else if ( (LA20_0=='<') ) {s = 10;}\r
+\r
+                        else if ( (LA20_0=='>') ) {s = 11;}\r
+\r
+                        else if ( (LA20_0=='=') ) {s = 12;}\r
+\r
+                        else if ( (LA20_0=='!') ) {s = 13;}\r
+\r
+                        else if ( (LA20_0=='~') ) {s = 14;}\r
+\r
+                        else if ( (LA20_0=='/') ) {s = 15;}\r
+\r
+                        else if ( (LA20_0=='.') ) {s = 16;}\r
+\r
+                        else if ( (LA20_0==',') ) {s = 17;}\r
+\r
+                        else if ( (LA20_0==':') ) {s = 18;}\r
 \r
-                        else if ( ((LA20_5>='\u0000' && LA20_5<='\b')||(LA20_5>='\u000B' && LA20_5<='\f')||(LA20_5>='\u000E' && LA20_5<='\u001F')||LA20_5=='!'||LA20_5=='$'||LA20_5=='&'||LA20_5=='+'||(LA20_5>='/' && LA20_5<='9')||LA20_5==';'||LA20_5=='='||LA20_5=='?'||(LA20_5>='A' && LA20_5<='D')||(LA20_5>='F' && LA20_5<='Z')||(LA20_5>='^' && LA20_5<='d')||(LA20_5>='f' && LA20_5<='z')||(LA20_5>='~' && LA20_5<='\uFFFF')) ) {s = 27;}\r
+                        else if ( (LA20_0=='a') ) {s = 19;}\r
 \r
-                        else s = 31;\r
+                        else if ( (LA20_0=='(') ) {s = 20;}\r
+\r
+                        else if ( (LA20_0==')') ) {s = 21;}\r
+\r
+                        else if ( (LA20_0=='*') ) {s = 22;}\r
+\r
+                        else if ( ((LA20_0>='\u0000' && LA20_0<='\b')||(LA20_0>='\u000B' && LA20_0<='\f')||(LA20_0>='\u000E' && LA20_0<='\u001F')||LA20_0=='$'||LA20_0=='&'||LA20_0=='+'||LA20_0==';'||LA20_0=='?'||(LA20_0>='A' && LA20_0<='Z')||(LA20_0>='^' && LA20_0<='`')||(LA20_0>='b' && LA20_0<='e')||(LA20_0>='g' && LA20_0<='m')||(LA20_0>='o' && LA20_0<='s')||(LA20_0>='u' && LA20_0<='z')||(LA20_0>='\u007F' && LA20_0<='\uFFFF')) ) {s = 23;}\r
+\r
+                        else if ( (LA20_0=='\t'||LA20_0==' ') ) {s = 24;}\r
 \r
                         if ( s>=0 ) return s;\r
                         break;\r
                     case 17 : \r
-                        int LA20_16 = input.LA(1);\r
+                        int LA20_28 = input.LA(1);\r
 \r
                         s = -1;\r
-                        if ( ((LA20_16>='\u0000' && LA20_16<='\b')||(LA20_16>='\u000B' && LA20_16<='\f')||(LA20_16>='\u000E' && LA20_16<='\u001F')||LA20_16=='!'||LA20_16=='$'||LA20_16=='&'||LA20_16=='+'||(LA20_16>='.' && LA20_16<='9')||LA20_16==';'||LA20_16=='='||LA20_16=='?'||(LA20_16>='A' && LA20_16<='Z')||(LA20_16>='^' && LA20_16<='z')||(LA20_16>='~' && LA20_16<='\uFFFF')) ) {s = 27;}\r
+                        if ( ((LA20_28>='0' && LA20_28<='9')) ) {s = 48;}\r
 \r
-                        else s = 42;\r
+                        else if ( ((LA20_28>='\u0000' && LA20_28<='\b')||(LA20_28>='\u000B' && LA20_28<='\f')||(LA20_28>='\u000E' && LA20_28<='\u001F')||LA20_28=='!'||LA20_28=='$'||LA20_28=='&'||LA20_28=='+'||LA20_28=='/'||LA20_28==';'||LA20_28=='='||LA20_28=='?'||(LA20_28>='A' && LA20_28<='Z')||(LA20_28>='^' && LA20_28<='z')||(LA20_28>='~' && LA20_28<='\uFFFF')) ) {s = 23;}\r
 \r
                         if ( s>=0 ) return s;\r
                         break;\r
                     case 18 : \r
-                        int LA20_19 = input.LA(1);\r
+                        int LA20_15 = input.LA(1);\r
 \r
                         s = -1;\r
-                        if ( (LA20_19=='.') ) {s = 45;}\r
+                        if ( (LA20_15=='.') ) {s = 41;}\r
 \r
-                        else if ( (LA20_19=='/') ) {s = 46;}\r
+                        else if ( (LA20_15=='/') ) {s = 42;}\r
 \r
-                        else if ( ((LA20_19>='\t' && LA20_19<='\n')||LA20_19=='\r'||LA20_19==' '||(LA20_19>='\"' && LA20_19<='#')||LA20_19=='%'||(LA20_19>='\'' && LA20_19<='*')||(LA20_19>=',' && LA20_19<='-')||LA20_19==':'||LA20_19=='<'||LA20_19=='>'||LA20_19=='@'||(LA20_19>='[' && LA20_19<=']')||(LA20_19>='{' && LA20_19<='}')) ) {s = 47;}\r
+                        else if ( ((LA20_15>='\t' && LA20_15<='\n')||LA20_15=='\r'||LA20_15==' '||(LA20_15>='\"' && LA20_15<='#')||LA20_15=='%'||(LA20_15>='\'' && LA20_15<='*')||(LA20_15>=',' && LA20_15<='-')||LA20_15==':'||LA20_15=='<'||LA20_15=='>'||LA20_15=='@'||(LA20_15>='[' && LA20_15<=']')||(LA20_15>='{' && LA20_15<='}')) ) {s = 43;}\r
 \r
-                        else if ( ((LA20_19>='\u0000' && LA20_19<='\b')||(LA20_19>='\u000B' && LA20_19<='\f')||(LA20_19>='\u000E' && LA20_19<='\u001F')||LA20_19=='!'||LA20_19=='$'||LA20_19=='&'||LA20_19=='+'||(LA20_19>='0' && LA20_19<='9')||LA20_19==';'||LA20_19=='='||LA20_19=='?'||(LA20_19>='A' && LA20_19<='Z')||(LA20_19>='^' && LA20_19<='z')||(LA20_19>='~' && LA20_19<='\uFFFF')) ) {s = 48;}\r
+                        else if ( ((LA20_15>='\u0000' && LA20_15<='\b')||(LA20_15>='\u000B' && LA20_15<='\f')||(LA20_15>='\u000E' && LA20_15<='\u001F')||LA20_15=='!'||LA20_15=='$'||LA20_15=='&'||LA20_15=='+'||(LA20_15>='0' && LA20_15<='9')||LA20_15==';'||LA20_15=='='||LA20_15=='?'||(LA20_15>='A' && LA20_15<='Z')||(LA20_15>='^' && LA20_15<='z')||(LA20_15>='~' && LA20_15<='\uFFFF')) ) {s = 44;}\r
 \r
-                        else s = 27;\r
+                        else s = 23;\r
 \r
                         if ( s>=0 ) return s;\r
                         break;\r
                     case 19 : \r
-                        int LA20_62 = input.LA(1);\r
+                        int LA20_40 = input.LA(1);\r
 \r
                         s = -1;\r
-                        if ( (LA20_62=='.') ) {s = 45;}\r
-\r
-                        else if ( ((LA20_62>='A' && LA20_62<='Z')||(LA20_62>='a' && LA20_62<='z')) ) {s = 62;}\r
-\r
-                        else if ( (LA20_62=='/') ) {s = 46;}\r
+                        if ( ((LA20_40>='\u0000' && LA20_40<='\b')||(LA20_40>='\u000B' && LA20_40<='\f')||(LA20_40>='\u000E' && LA20_40<='\u001F')||LA20_40=='!'||LA20_40=='$'||LA20_40=='&'||LA20_40=='+'||(LA20_40>='.' && LA20_40<='9')||LA20_40==';'||LA20_40=='='||LA20_40=='?'||(LA20_40>='A' && LA20_40<='Z')||(LA20_40>='^' && LA20_40<='z')||(LA20_40>='~' && LA20_40<='\uFFFF')) ) {s = 23;}\r
 \r
-                        else if ( ((LA20_62>='\u0000' && LA20_62<='\b')||(LA20_62>='\u000B' && LA20_62<='\f')||(LA20_62>='\u000E' && LA20_62<='\u001F')||LA20_62=='!'||LA20_62=='$'||LA20_62=='&'||LA20_62=='+'||(LA20_62>='0' && LA20_62<='9')||LA20_62==';'||LA20_62=='='||LA20_62=='?'||(LA20_62>='^' && LA20_62<='`')||(LA20_62>='~' && LA20_62<='\uFFFF')) ) {s = 48;}\r
-\r
-                        else s = 47;\r
+                        else s = 55;\r
 \r
                         if ( s>=0 ) return s;\r
                         break;\r
                     case 20 : \r
-                        int LA20_46 = input.LA(1);\r
+                        int LA20_58 = input.LA(1);\r
 \r
                         s = -1;\r
-                        if ( ((LA20_46>='A' && LA20_46<='Z')||(LA20_46>='a' && LA20_46<='z')) ) {s = 62;}\r
+                        if ( (LA20_58=='.') ) {s = 41;}\r
 \r
-                        else if ( (LA20_46=='.') ) {s = 45;}\r
+                        else if ( (LA20_58=='/') ) {s = 42;}\r
 \r
-                        else if ( (LA20_46=='/') ) {s = 46;}\r
+                        else if ( ((LA20_58>='A' && LA20_58<='Z')||(LA20_58>='a' && LA20_58<='z')) ) {s = 58;}\r
 \r
-                        else if ( ((LA20_46>='\u0000' && LA20_46<='\b')||(LA20_46>='\u000B' && LA20_46<='\f')||(LA20_46>='\u000E' && LA20_46<='\u001F')||LA20_46=='!'||LA20_46=='$'||LA20_46=='&'||LA20_46=='+'||(LA20_46>='0' && LA20_46<='9')||LA20_46==';'||LA20_46=='='||LA20_46=='?'||(LA20_46>='^' && LA20_46<='`')||(LA20_46>='~' && LA20_46<='\uFFFF')) ) {s = 48;}\r
+                        else if ( ((LA20_58>='\u0000' && LA20_58<='\b')||(LA20_58>='\u000B' && LA20_58<='\f')||(LA20_58>='\u000E' && LA20_58<='\u001F')||LA20_58=='!'||LA20_58=='$'||LA20_58=='&'||LA20_58=='+'||(LA20_58>='0' && LA20_58<='9')||LA20_58==';'||LA20_58=='='||LA20_58=='?'||(LA20_58>='^' && LA20_58<='`')||(LA20_58>='~' && LA20_58<='\uFFFF')) ) {s = 44;}\r
 \r
-                        else s = 47;\r
+                        else s = 43;\r
 \r
                         if ( s>=0 ) return s;\r
                         break;\r
                     case 21 : \r
-                        int LA20_34 = input.LA(1);\r
+                        int LA20_48 = input.LA(1);\r
 \r
                         s = -1;\r
-                        if ( ((LA20_34>='0' && LA20_34<='9')) ) {s = 34;}\r
-\r
-                        else if ( (LA20_34=='.') ) {s = 32;}\r
+                        if ( (LA20_48=='E'||LA20_48=='e') ) {s = 60;}\r
 \r
-                        else if ( (LA20_34=='E'||LA20_34=='e') ) {s = 33;}\r
+                        else if ( ((LA20_48>='0' && LA20_48<='9')) ) {s = 48;}\r
 \r
-                        else if ( ((LA20_34>='\u0000' && LA20_34<='\b')||(LA20_34>='\u000B' && LA20_34<='\f')||(LA20_34>='\u000E' && LA20_34<='\u001F')||LA20_34=='!'||LA20_34=='$'||LA20_34=='&'||LA20_34=='+'||LA20_34=='/'||LA20_34==';'||LA20_34=='='||LA20_34=='?'||(LA20_34>='A' && LA20_34<='D')||(LA20_34>='F' && LA20_34<='Z')||(LA20_34>='^' && LA20_34<='d')||(LA20_34>='f' && LA20_34<='z')||(LA20_34>='~' && LA20_34<='\uFFFF')) ) {s = 27;}\r
+                        else if ( ((LA20_48>='\u0000' && LA20_48<='\b')||(LA20_48>='\u000B' && LA20_48<='\f')||(LA20_48>='\u000E' && LA20_48<='\u001F')||LA20_48=='!'||LA20_48=='$'||LA20_48=='&'||LA20_48=='+'||(LA20_48>='.' && LA20_48<='/')||LA20_48==';'||LA20_48=='='||LA20_48=='?'||(LA20_48>='A' && LA20_48<='D')||(LA20_48>='F' && LA20_48<='Z')||(LA20_48>='^' && LA20_48<='d')||(LA20_48>='f' && LA20_48<='z')||(LA20_48>='~' && LA20_48<='\uFFFF')) ) {s = 23;}\r
 \r
-                        else s = 31;\r
+                        else s = 46;\r
 \r
                         if ( s>=0 ) return s;\r
                         break;\r
                     case 22 : \r
-                        int LA20_61 = input.LA(1);\r
+                        int LA20_5 = input.LA(1);\r
 \r
                         s = -1;\r
-                        if ( (LA20_61=='/') ) {s = 60;}\r
-\r
-                        else if ( (LA20_61=='.') ) {s = 45;}\r
+                        if ( (LA20_5=='.') ) {s = 28;}\r
 \r
-                        else if ( ((LA20_61>='\u0000' && LA20_61<='\b')||(LA20_61>='\u000B' && LA20_61<='\f')||(LA20_61>='\u000E' && LA20_61<='\u001F')||LA20_61=='!'||LA20_61=='$'||LA20_61=='&'||LA20_61=='+'||(LA20_61>='0' && LA20_61<='9')||LA20_61==';'||LA20_61=='='||LA20_61=='?'||(LA20_61>='A' && LA20_61<='Z')||(LA20_61>='^' && LA20_61<='z')||(LA20_61>='~' && LA20_61<='\uFFFF')) ) {s = 61;}\r
+                        else if ( (LA20_5=='E'||LA20_5=='e') ) {s = 29;}\r
 \r
-                        else if ( ((LA20_61>='\t' && LA20_61<='\n')||LA20_61=='\r'||LA20_61==' '||(LA20_61>='\"' && LA20_61<='#')||LA20_61=='%'||(LA20_61>='\'' && LA20_61<='*')||(LA20_61>=',' && LA20_61<='-')||LA20_61==':'||LA20_61=='<'||LA20_61=='>'||LA20_61=='@'||(LA20_61>='[' && LA20_61<=']')||(LA20_61>='{' && LA20_61<='}')) ) {s = 47;}\r
+                        else if ( ((LA20_5>='\u0000' && LA20_5<='\b')||(LA20_5>='\u000B' && LA20_5<='\f')||(LA20_5>='\u000E' && LA20_5<='\u001F')||LA20_5=='!'||LA20_5=='$'||LA20_5=='&'||LA20_5=='+'||(LA20_5>='/' && LA20_5<='9')||LA20_5==';'||LA20_5=='='||LA20_5=='?'||(LA20_5>='A' && LA20_5<='D')||(LA20_5>='F' && LA20_5<='Z')||(LA20_5>='^' && LA20_5<='d')||(LA20_5>='f' && LA20_5<='z')||(LA20_5>='~' && LA20_5<='\uFFFF')) ) {s = 23;}\r
 \r
                         else s = 27;\r
 \r
index ed2f0d9..cd0dea5 100644 (file)
@@ -1,4 +1,4 @@
-// $ANTLR 3.1.3 Mar 17, 2009 19:23:44 LensQuery.g 2009-09-10 16:56:16\r
+// $ANTLR 3.1.3 Mar 17, 2009 19:23:44 LensQuery.g 2009-09-29 14:01:34\r
 \r
 /*--------------------------------------------------------------------------\r
  *  Copyright 2009 Taro L. Saito\r
@@ -37,14 +37,12 @@ import org.antlr.runtime.tree.*;
 \r
 public class LensQueryParser extends Parser {\r
     public static final String[] tokenNames = new String[] {\r
-        "<invalid>", "<EOR>", "<DOWN>", "<UP>", "QUERY", "RELATION", "COMPARE", "OPERATOR", "OPERAND", "PATTERNMATCH", "NODE", "ALIAS", "NODEVALUE", "NAME", "VALUE", "INDEX", "LineBreakChar", "LineComment", "LineBreak", "Digit", "Letter", "HexDigit", "UnicodeChar", "EscapeSequence", "StringChar", "StringChar_s", "String", "Integer", "Frac", "Exp", "Double", "True", "False", "Null", "LBrace", "RBrace", "LBracket", "RBracket", "Lt", "Gt", "Leq", "Geq", "Eq", "Neq", "Match", "Regex", "Dot", "Comma", "Colon", "As", "LParen", "RParen", "Star", "UnsafeUnicodeChar", "SafeFirstLetter", "SafeLetter", "WhiteSpace", "QNameChar", "QName", "WhiteSpaces"\r
+        "<invalid>", "<EOR>", "<DOWN>", "<UP>", "QUERY", "RELATION", "COMPARE", "OPERATOR", "OPERAND", "PATTERNMATCH", "NODE", "ALIAS", "NODEVALUE", "NAME", "VALUE", "INDEX", "LineBreakChar", "LineComment", "LineBreak", "Digit", "Letter", "HexDigit", "UnicodeChar", "EscapeSequence", "StringChar", "StringChar_s", "String", "Integer", "Frac", "Exp", "Double", "True", "False", "Null", "Lt", "Gt", "Leq", "Geq", "Eq", "Neq", "Match", "Regex", "Dot", "Comma", "Colon", "As", "LParen", "RParen", "Star", "UnsafeUnicodeChar", "SafeFirstLetter", "SafeLetter", "WhiteSpace", "QNameChar", "QName", "WhiteSpaces"\r
     };\r
     public static final int INDEX=15;\r
     public static final int PATTERNMATCH=9;\r
-    public static final int Match=44;\r
-    public static final int RBrace=35;\r
-    public static final int Regex=45;\r
-    public static final int LBracket=36;\r
+    public static final int Match=40;\r
+    public static final int Regex=41;\r
     public static final int Digit=19;\r
     public static final int Frac=28;\r
     public static final int HexDigit=21;\r
@@ -52,50 +50,48 @@ public class LensQueryParser extends Parser {
     public static final int ALIAS=11;\r
     public static final int VALUE=14;\r
     public static final int Letter=20;\r
-    public static final int Comma=47;\r
-    public static final int Dot=46;\r
+    public static final int Comma=43;\r
+    public static final int Dot=42;\r
     public static final int EscapeSequence=23;\r
     public static final int Integer=27;\r
-    public static final int WhiteSpace=56;\r
+    public static final int WhiteSpace=52;\r
     public static final int OPERATOR=7;\r
     public static final int False=32;\r
-    public static final int Colon=48;\r
+    public static final int Colon=44;\r
     public static final int LineComment=17;\r
     public static final int NODEVALUE=12;\r
-    public static final int As=49;\r
-    public static final int SafeFirstLetter=54;\r
+    public static final int As=45;\r
+    public static final int SafeFirstLetter=50;\r
     public static final int Null=33;\r
-    public static final int Star=52;\r
-    public static final int Eq=42;\r
+    public static final int Star=48;\r
+    public static final int Eq=38;\r
     public static final int Exp=29;\r
-    public static final int QNameChar=57;\r
+    public static final int QNameChar=53;\r
     public static final int RELATION=5;\r
-    public static final int Gt=39;\r
-    public static final int RParen=51;\r
+    public static final int Gt=35;\r
+    public static final int RParen=47;\r
     public static final int UnicodeChar=22;\r
     public static final int StringChar=24;\r
     public static final int True=31;\r
     public static final int OPERAND=8;\r
     public static final int LineBreak=18;\r
-    public static final int LParen=50;\r
+    public static final int LParen=46;\r
     public static final int String=26;\r
-    public static final int SafeLetter=55;\r
+    public static final int SafeLetter=51;\r
     public static final int LineBreakChar=16;\r
     public static final int COMPARE=6;\r
-    public static final int QName=58;\r
+    public static final int QName=54;\r
     public static final int EOF=-1;\r
-    public static final int Geq=41;\r
+    public static final int Geq=37;\r
     public static final int NODE=10;\r
     public static final int StringChar_s=25;\r
-    public static final int Neq=43;\r
-    public static final int UnsafeUnicodeChar=53;\r
+    public static final int Neq=39;\r
+    public static final int UnsafeUnicodeChar=49;\r
     public static final int Double=30;\r
-    public static final int LBrace=34;\r
-    public static final int RBracket=37;\r
-    public static final int Lt=38;\r
+    public static final int Lt=34;\r
     public static final int NAME=13;\r
-    public static final int Leq=40;\r
-    public static final int WhiteSpaces=59;\r
+    public static final int Leq=36;\r
+    public static final int WhiteSpaces=55;\r
 \r
     // delegates\r
     // delegators\r
@@ -131,7 +127,7 @@ public class LensQueryParser extends Parser {
     };\r
 \r
     // $ANTLR start "expr"\r
-    // LensQuery.g:191:1: expr : relation ;\r
+    // LensQuery.g:188:1: expr : relation ;\r
     public final LensQueryParser.expr_return expr() throws RecognitionException {\r
         LensQueryParser.expr_return retval = new LensQueryParser.expr_return();\r
         retval.start = input.LT(1);\r
@@ -143,12 +139,12 @@ public class LensQueryParser extends Parser {
 \r
 \r
         try {\r
-            // LensQuery.g:191:5: ( relation )\r
-            // LensQuery.g:192:3: relation\r
+            // LensQuery.g:188:5: ( relation )\r
+            // LensQuery.g:189:3: relation\r
             {\r
             root_0 = (Object)adaptor.nil();\r
 \r
-            pushFollow(FOLLOW_relation_in_expr806);\r
+            pushFollow(FOLLOW_relation_in_expr779);\r
             relation1=relation();\r
 \r
             state._fsp--;\r
@@ -187,7 +183,7 @@ public class LensQueryParser extends Parser {
     };\r
 \r
     // $ANTLR start "relation"\r
-    // LensQuery.g:195:1: relation : relation_i -> ^( RELATION relation_i INDEX[currentIndex.toString()] ) ;\r
+    // LensQuery.g:192:1: relation : relation_i -> ^( RELATION relation_i INDEX[currentIndex.toString()] ) ;\r
     public final LensQueryParser.relation_return relation() throws RecognitionException {\r
         relation_stack.push(new relation_scope());\r
         LensQueryParser.relation_return retval = new LensQueryParser.relation_return();\r
@@ -207,10 +203,10 @@ public class LensQueryParser extends Parser {
             currentIndex = new TupleIndex(currentIndex, 1); \r
 \r
         try {\r
-            // LensQuery.g:213:4: ( relation_i -> ^( RELATION relation_i INDEX[currentIndex.toString()] ) )\r
-            // LensQuery.g:213:6: relation_i\r
+            // LensQuery.g:210:4: ( relation_i -> ^( RELATION relation_i INDEX[currentIndex.toString()] ) )\r
+            // LensQuery.g:210:6: relation_i\r
             {\r
-            pushFollow(FOLLOW_relation_i_in_relation840);\r
+            pushFollow(FOLLOW_relation_i_in_relation813);\r
             relation_i2=relation_i();\r
 \r
             state._fsp--;\r
@@ -229,9 +225,9 @@ public class LensQueryParser extends Parser {
             RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"rule retval",retval!=null?retval.tree:null);\r
 \r
             root_0 = (Object)adaptor.nil();\r
-            // 213:17: -> ^( RELATION relation_i INDEX[currentIndex.toString()] )\r
+            // 210:17: -> ^( RELATION relation_i INDEX[currentIndex.toString()] )\r
             {\r
-                // LensQuery.g:213:20: ^( RELATION relation_i INDEX[currentIndex.toString()] )\r
+                // LensQuery.g:210:20: ^( RELATION relation_i INDEX[currentIndex.toString()] )\r
                 {\r
                 Object root_1 = (Object)adaptor.nil();\r
                 root_1 = (Object)adaptor.becomeRoot((Object)adaptor.create(RELATION, "RELATION"), root_1);\r
@@ -275,7 +271,7 @@ public class LensQueryParser extends Parser {
     };\r
 \r
     // $ANTLR start "relation_i"\r
-    // LensQuery.g:216:1: relation_i : nodeName ( alias )? LParen nodeItem ( Comma nodeItem )* RParen ;\r
+    // LensQuery.g:213:1: relation_i : nodeName ( alias )? LParen nodeItem ( Comma nodeItem )* RParen ;\r
     public final LensQueryParser.relation_i_return relation_i() throws RecognitionException {\r
         LensQueryParser.relation_i_return retval = new LensQueryParser.relation_i_return();\r
         retval.start = input.LT(1);\r
@@ -299,18 +295,18 @@ public class LensQueryParser extends Parser {
         Object RParen9_tree=null;\r
 \r
         try {\r
-            // LensQuery.g:216:11: ( nodeName ( alias )? LParen nodeItem ( Comma nodeItem )* RParen )\r
-            // LensQuery.g:216:13: nodeName ( alias )? LParen nodeItem ( Comma nodeItem )* RParen\r
+            // LensQuery.g:213:11: ( nodeName ( alias )? LParen nodeItem ( Comma nodeItem )* RParen )\r
+            // LensQuery.g:213:13: nodeName ( alias )? LParen nodeItem ( Comma nodeItem )* RParen\r
             {\r
             root_0 = (Object)adaptor.nil();\r
 \r
-            pushFollow(FOLLOW_nodeName_in_relation_i859);\r
+            pushFollow(FOLLOW_nodeName_in_relation_i832);\r
             nodeName3=nodeName();\r
 \r
             state._fsp--;\r
 \r
             adaptor.addChild(root_0, nodeName3.getTree());\r
-            // LensQuery.g:216:22: ( alias )?\r
+            // LensQuery.g:213:22: ( alias )?\r
             int alt1=2;\r
             int LA1_0 = input.LA(1);\r
 \r
@@ -319,9 +315,9 @@ public class LensQueryParser extends Parser {
             }\r
             switch (alt1) {\r
                 case 1 :\r
-                    // LensQuery.g:216:22: alias\r
+                    // LensQuery.g:213:22: alias\r
                     {\r
-                    pushFollow(FOLLOW_alias_in_relation_i861);\r
+                    pushFollow(FOLLOW_alias_in_relation_i834);\r
                     alias4=alias();\r
 \r
                     state._fsp--;\r
@@ -333,14 +329,14 @@ public class LensQueryParser extends Parser {
 \r
             }\r
 \r
-            LParen5=(Token)match(input,LParen,FOLLOW_LParen_in_relation_i864); \r
-            pushFollow(FOLLOW_nodeItem_in_relation_i867);\r
+            LParen5=(Token)match(input,LParen,FOLLOW_LParen_in_relation_i837); \r
+            pushFollow(FOLLOW_nodeItem_in_relation_i840);\r
             nodeItem6=nodeItem();\r
 \r
             state._fsp--;\r
 \r
             adaptor.addChild(root_0, nodeItem6.getTree());\r
-            // LensQuery.g:216:46: ( Comma nodeItem )*\r
+            // LensQuery.g:213:46: ( Comma nodeItem )*\r
             loop2:\r
             do {\r
                 int alt2=2;\r
@@ -353,10 +349,10 @@ public class LensQueryParser extends Parser {
 \r
                 switch (alt2) {\r
                case 1 :\r
-                   // LensQuery.g:216:47: Comma nodeItem\r
+                   // LensQuery.g:213:47: Comma nodeItem\r
                    {\r
-                   Comma7=(Token)match(input,Comma,FOLLOW_Comma_in_relation_i870); \r
-                   pushFollow(FOLLOW_nodeItem_in_relation_i873);\r
+                   Comma7=(Token)match(input,Comma,FOLLOW_Comma_in_relation_i843); \r
+                   pushFollow(FOLLOW_nodeItem_in_relation_i846);\r
                    nodeItem8=nodeItem();\r
 \r
                    state._fsp--;\r
@@ -371,7 +367,7 @@ public class LensQueryParser extends Parser {
                 }\r
             } while (true);\r
 \r
-            RParen9=(Token)match(input,RParen,FOLLOW_RParen_in_relation_i877); \r
+            RParen9=(Token)match(input,RParen,FOLLOW_RParen_in_relation_i850); \r
 \r
             }\r
 \r
@@ -399,7 +395,7 @@ public class LensQueryParser extends Parser {
     };\r
 \r
     // $ANTLR start "nodeName"\r
-    // LensQuery.g:218:1: fragment nodeName : ( QName -> NAME[$QName.text] | String -> NAME[$String.text] );\r
+    // LensQuery.g:216:1: fragment nodeName : ( QName -> NAME[$QName.text] | String -> NAME[$String.text] );\r
     public final LensQueryParser.nodeName_return nodeName() throws RecognitionException {\r
         LensQueryParser.nodeName_return retval = new LensQueryParser.nodeName_return();\r
         retval.start = input.LT(1);\r
@@ -415,7 +411,7 @@ public class LensQueryParser extends Parser {
         RewriteRuleTokenStream stream_QName=new RewriteRuleTokenStream(adaptor,"token QName");\r
 \r
         try {\r
-            // LensQuery.g:220:3: ( QName -> NAME[$QName.text] | String -> NAME[$String.text] )\r
+            // LensQuery.g:218:3: ( QName -> NAME[$QName.text] | String -> NAME[$String.text] )\r
             int alt3=2;\r
             int LA3_0 = input.LA(1);\r
 \r
@@ -433,9 +429,9 @@ public class LensQueryParser extends Parser {
             }\r
             switch (alt3) {\r
                 case 1 :\r
-                    // LensQuery.g:220:5: QName\r
+                    // LensQuery.g:218:5: QName\r
                     {\r
-                    QName10=(Token)match(input,QName,FOLLOW_QName_in_nodeName890);  \r
+                    QName10=(Token)match(input,QName,FOLLOW_QName_in_nodeName864);  \r
                     stream_QName.add(QName10);\r
 \r
 \r
@@ -451,7 +447,7 @@ public class LensQueryParser extends Parser {
                     RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"rule retval",retval!=null?retval.tree:null);\r
 \r
                     root_0 = (Object)adaptor.nil();\r
-                    // 220:11: -> NAME[$QName.text]\r
+                    // 218:11: -> NAME[$QName.text]\r
                     {\r
                         adaptor.addChild(root_0, (Object)adaptor.create(NAME, (QName10!=null?QName10.getText():null)));\r
 \r
@@ -461,9 +457,9 @@ public class LensQueryParser extends Parser {
                     }\r
                     break;\r
                 case 2 :\r
-                    // LensQuery.g:221:5: String\r
+                    // LensQuery.g:219:5: String\r
                     {\r
-                    String11=(Token)match(input,String,FOLLOW_String_in_nodeName901);  \r
+                    String11=(Token)match(input,String,FOLLOW_String_in_nodeName875);  \r
                     stream_String.add(String11);\r
 \r
 \r
@@ -479,7 +475,7 @@ public class LensQueryParser extends Parser {
                     RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"rule retval",retval!=null?retval.tree:null);\r
 \r
                     root_0 = (Object)adaptor.nil();\r
-                    // 221:12: -> NAME[$String.text]\r
+                    // 219:12: -> NAME[$String.text]\r
                     {\r
                         adaptor.addChild(root_0, (Object)adaptor.create(NAME, (String11!=null?String11.getText():null)));\r
 \r
@@ -514,7 +510,7 @@ public class LensQueryParser extends Parser {
     };\r
 \r
     // $ANTLR start "alias"\r
-    // LensQuery.g:224:1: fragment alias : As QName -> ALIAS[$QName.text] ;\r
+    // LensQuery.g:222:1: fragment alias : As QName -> ALIAS[$QName.text] ;\r
     public final LensQueryParser.alias_return alias() throws RecognitionException {\r
         LensQueryParser.alias_return retval = new LensQueryParser.alias_return();\r
         retval.start = input.LT(1);\r
@@ -530,13 +526,13 @@ public class LensQueryParser extends Parser {
         RewriteRuleTokenStream stream_QName=new RewriteRuleTokenStream(adaptor,"token QName");\r
 \r
         try {\r
-            // LensQuery.g:225:6: ( As QName -> ALIAS[$QName.text] )\r
-            // LensQuery.g:225:8: As QName\r
+            // LensQuery.g:223:6: ( As QName -> ALIAS[$QName.text] )\r
+            // LensQuery.g:223:8: As QName\r
             {\r
-            As12=(Token)match(input,As,FOLLOW_As_in_alias918);  \r
+            As12=(Token)match(input,As,FOLLOW_As_in_alias892);  \r
             stream_As.add(As12);\r
 \r
-            QName13=(Token)match(input,QName,FOLLOW_QName_in_alias920);  \r
+            QName13=(Token)match(input,QName,FOLLOW_QName_in_alias894);  \r
             stream_QName.add(QName13);\r
 \r
 \r
@@ -552,7 +548,7 @@ public class LensQueryParser extends Parser {
             RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"rule retval",retval!=null?retval.tree:null);\r
 \r
             root_0 = (Object)adaptor.nil();\r
-            // 225:17: -> ALIAS[$QName.text]\r
+            // 223:17: -> ALIAS[$QName.text]\r
             {\r
                 adaptor.addChild(root_0, (Object)adaptor.create(ALIAS, (QName13!=null?QName13.getText():null)));\r
 \r
@@ -585,7 +581,7 @@ public class LensQueryParser extends Parser {
     };\r
 \r
     // $ANTLR start "nodeItem"\r
-    // LensQuery.g:228:1: fragment nodeItem : ( nodeName ( alias )? ( nodeValue )? -> ^( NODE nodeName ( alias )? ( nodeValue )? INDEX[new TupleIndex(currentIndex, index).toString()] ) | relation );\r
+    // LensQuery.g:226:1: fragment nodeItem : ( nodeName ( alias )? ( nodeValue )? -> ^( NODE nodeName ( alias )? ( nodeValue )? INDEX[new TupleIndex(currentIndex, index).toString()] ) | relation );\r
     public final LensQueryParser.nodeItem_return nodeItem() throws RecognitionException {\r
         LensQueryParser.nodeItem_return retval = new LensQueryParser.nodeItem_return();\r
         retval.start = input.LT(1);\r
@@ -608,7 +604,7 @@ public class LensQueryParser extends Parser {
           int index = ((relation_scope)relation_stack.peek()).nodeItemIndex++;\r
 \r
         try {\r
-            // LensQuery.g:233:3: ( nodeName ( alias )? ( nodeValue )? -> ^( NODE nodeName ( alias )? ( nodeValue )? INDEX[new TupleIndex(currentIndex, index).toString()] ) | relation )\r
+            // LensQuery.g:231:3: ( nodeName ( alias )? ( nodeValue )? -> ^( NODE nodeName ( alias )? ( nodeValue )? INDEX[new TupleIndex(currentIndex, index).toString()] ) | relation )\r
             int alt6=2;\r
             int LA6_0 = input.LA(1);\r
 \r
@@ -734,15 +730,15 @@ public class LensQueryParser extends Parser {
             }\r
             switch (alt6) {\r
                 case 1 :\r
-                    // LensQuery.g:233:5: nodeName ( alias )? ( nodeValue )?\r
+                    // LensQuery.g:231:5: nodeName ( alias )? ( nodeValue )?\r
                     {\r
-                    pushFollow(FOLLOW_nodeName_in_nodeItem945);\r
+                    pushFollow(FOLLOW_nodeName_in_nodeItem919);\r
                     nodeName14=nodeName();\r
 \r
                     state._fsp--;\r
 \r
                     stream_nodeName.add(nodeName14.getTree());\r
-                    // LensQuery.g:233:14: ( alias )?\r
+                    // LensQuery.g:231:14: ( alias )?\r
                     int alt4=2;\r
                     int LA4_0 = input.LA(1);\r
 \r
@@ -751,9 +747,9 @@ public class LensQueryParser extends Parser {
                     }\r
                     switch (alt4) {\r
                         case 1 :\r
-                            // LensQuery.g:233:14: alias\r
+                            // LensQuery.g:231:14: alias\r
                             {\r
-                            pushFollow(FOLLOW_alias_in_nodeItem947);\r
+                            pushFollow(FOLLOW_alias_in_nodeItem921);\r
                             alias15=alias();\r
 \r
                             state._fsp--;\r
@@ -765,7 +761,7 @@ public class LensQueryParser extends Parser {
 \r
                     }\r
 \r
-                    // LensQuery.g:233:21: ( nodeValue )?\r
+                    // LensQuery.g:231:21: ( nodeValue )?\r
                     int alt5=2;\r
                     int LA5_0 = input.LA(1);\r
 \r
@@ -774,9 +770,9 @@ public class LensQueryParser extends Parser {
                     }\r
                     switch (alt5) {\r
                         case 1 :\r
-                            // LensQuery.g:233:21: nodeValue\r
+                            // LensQuery.g:231:21: nodeValue\r
                             {\r
-                            pushFollow(FOLLOW_nodeValue_in_nodeItem950);\r
+                            pushFollow(FOLLOW_nodeValue_in_nodeItem924);\r
                             nodeValue16=nodeValue();\r
 \r
                             state._fsp--;\r
@@ -791,7 +787,7 @@ public class LensQueryParser extends Parser {
 \r
 \r
                     // AST REWRITE\r
-                    // elements: nodeName, nodeValue, alias\r
+                    // elements: nodeValue, nodeName, alias\r
                     // token labels: \r
                     // rule labels: retval\r
                     // token list labels: \r
@@ -801,21 +797,21 @@ public class LensQueryParser extends Parser {
                     RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"rule retval",retval!=null?retval.tree:null);\r
 \r
                     root_0 = (Object)adaptor.nil();\r
-                    // 234:5: -> ^( NODE nodeName ( alias )? ( nodeValue )? INDEX[new TupleIndex(currentIndex, index).toString()] )\r
+                    // 232:5: -> ^( NODE nodeName ( alias )? ( nodeValue )? INDEX[new TupleIndex(currentIndex, index).toString()] )\r
                     {\r
-                        // LensQuery.g:234:8: ^( NODE nodeName ( alias )? ( nodeValue )? INDEX[new TupleIndex(currentIndex, index).toString()] )\r
+                        // LensQuery.g:232:8: ^( NODE nodeName ( alias )? ( nodeValue )? INDEX[new TupleIndex(currentIndex, index).toString()] )\r
                         {\r
                         Object root_1 = (Object)adaptor.nil();\r
                         root_1 = (Object)adaptor.becomeRoot((Object)adaptor.create(NODE, "NODE"), root_1);\r
 \r
                         adaptor.addChild(root_1, stream_nodeName.nextTree());\r
-                        // LensQuery.g:234:24: ( alias )?\r
+                        // LensQuery.g:232:24: ( alias )?\r
                         if ( stream_alias.hasNext() ) {\r
                             adaptor.addChild(root_1, stream_alias.nextTree());\r
 \r
                         }\r
                         stream_alias.reset();\r
-                        // LensQuery.g:234:31: ( nodeValue )?\r
+                        // LensQuery.g:232:31: ( nodeValue )?\r
                         if ( stream_nodeValue.hasNext() ) {\r
                             adaptor.addChild(root_1, stream_nodeValue.nextTree());\r
 \r
@@ -832,11 +828,11 @@ public class LensQueryParser extends Parser {
                     }\r
                     break;\r
                 case 2 :\r
-                    // LensQuery.g:235:5: relation\r
+                    // LensQuery.g:233:5: relation\r
                     {\r
                     root_0 = (Object)adaptor.nil();\r
 \r
-                    pushFollow(FOLLOW_relation_in_nodeItem979);\r
+                    pushFollow(FOLLOW_relation_in_nodeItem953);\r
                     relation17=relation();\r
 \r
                     state._fsp--;\r
@@ -871,7 +867,7 @@ public class LensQueryParser extends Parser {
     };\r
 \r
     // $ANTLR start "value"\r
-    // LensQuery.g:238:1: fragment value : ( String | Integer | Double | QName );\r
+    // LensQuery.g:236:1: fragment value : ( String | Integer | Double | QName );\r
     public final LensQueryParser.value_return value() throws RecognitionException {\r
         LensQueryParser.value_return retval = new LensQueryParser.value_return();\r
         retval.start = input.LT(1);\r
@@ -883,7 +879,7 @@ public class LensQueryParser extends Parser {
         Object set18_tree=null;\r
 \r
         try {\r
-            // LensQuery.g:240:3: ( String | Integer | Double | QName )\r
+            // LensQuery.g:238:3: ( String | Integer | Double | QName )\r
             // LensQuery.g:\r
             {\r
             root_0 = (Object)adaptor.nil();\r
@@ -926,7 +922,7 @@ public class LensQueryParser extends Parser {
     };\r
 \r
     // $ANTLR start "nodeValue"\r
-    // LensQuery.g:243:1: fragment nodeValue : ( Colon value -> NODEVALUE[$value.text] | nodeCmp );\r
+    // LensQuery.g:241:1: fragment nodeValue : ( Colon value -> NODEVALUE[$value.text] | nodeCmp );\r
     public final LensQueryParser.nodeValue_return nodeValue() throws RecognitionException {\r
         LensQueryParser.nodeValue_return retval = new LensQueryParser.nodeValue_return();\r
         retval.start = input.LT(1);\r
@@ -943,7 +939,7 @@ public class LensQueryParser extends Parser {
         RewriteRuleTokenStream stream_Colon=new RewriteRuleTokenStream(adaptor,"token Colon");\r
         RewriteRuleSubtreeStream stream_value=new RewriteRuleSubtreeStream(adaptor,"rule value");\r
         try {\r
-            // LensQuery.g:245:3: ( Colon value -> NODEVALUE[$value.text] | nodeCmp )\r
+            // LensQuery.g:243:3: ( Colon value -> NODEVALUE[$value.text] | nodeCmp )\r
             int alt7=2;\r
             int LA7_0 = input.LA(1);\r
 \r
@@ -961,12 +957,12 @@ public class LensQueryParser extends Parser {
             }\r
             switch (alt7) {\r
                 case 1 :\r
-                    // LensQuery.g:245:5: Colon value\r
+                    // LensQuery.g:243:5: Colon value\r
                     {\r
-                    Colon19=(Token)match(input,Colon,FOLLOW_Colon_in_nodeValue1028);  \r
+                    Colon19=(Token)match(input,Colon,FOLLOW_Colon_in_nodeValue1002);  \r
                     stream_Colon.add(Colon19);\r
 \r
-                    pushFollow(FOLLOW_value_in_nodeValue1030);\r
+                    pushFollow(FOLLOW_value_in_nodeValue1004);\r
                     value20=value();\r
 \r
                     state._fsp--;\r
@@ -985,7 +981,7 @@ public class LensQueryParser extends Parser {
                     RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"rule retval",retval!=null?retval.tree:null);\r
 \r
                     root_0 = (Object)adaptor.nil();\r
-                    // 245:17: -> NODEVALUE[$value.text]\r
+                    // 243:17: -> NODEVALUE[$value.text]\r
                     {\r
                         adaptor.addChild(root_0, (Object)adaptor.create(NODEVALUE, (value20!=null?input.toString(value20.start,value20.stop):null)));\r
 \r
@@ -995,11 +991,11 @@ public class LensQueryParser extends Parser {
                     }\r
                     break;\r
                 case 2 :\r
-                    // LensQuery.g:246:5: nodeCmp\r
+                    // LensQuery.g:244:5: nodeCmp\r
                     {\r
                     root_0 = (Object)adaptor.nil();\r
 \r
-                    pushFollow(FOLLOW_nodeCmp_in_nodeValue1041);\r
+                    pushFollow(FOLLOW_nodeCmp_in_nodeValue1015);\r
                     nodeCmp21=nodeCmp();\r
 \r
                     state._fsp--;\r
@@ -1034,7 +1030,7 @@ public class LensQueryParser extends Parser {
     };\r
 \r
     // $ANTLR start "nodeCmp"\r
-    // LensQuery.g:249:1: fragment nodeCmp : ( cmpOp value -> ^( COMPARE OPERATOR[$cmpOp.text] OPERAND[$value.text] ) | Match Regex -> ^( PATTERNMATCH OPERAND[$Regex.text] ) );\r
+    // LensQuery.g:247:1: fragment nodeCmp : ( cmpOp value -> ^( COMPARE OPERATOR[$cmpOp.text] OPERAND[$value.text] ) | Match Regex -> ^( PATTERNMATCH OPERAND[$Regex.text] ) );\r
     public final LensQueryParser.nodeCmp_return nodeCmp() throws RecognitionException {\r
         LensQueryParser.nodeCmp_return retval = new LensQueryParser.nodeCmp_return();\r
         retval.start = input.LT(1);\r
@@ -1055,7 +1051,7 @@ public class LensQueryParser extends Parser {
         RewriteRuleSubtreeStream stream_value=new RewriteRuleSubtreeStream(adaptor,"rule value");\r
         RewriteRuleSubtreeStream stream_cmpOp=new RewriteRuleSubtreeStream(adaptor,"rule cmpOp");\r
         try {\r
-            // LensQuery.g:251:3: ( cmpOp value -> ^( COMPARE OPERATOR[$cmpOp.text] OPERAND[$value.text] ) | Match Regex -> ^( PATTERNMATCH OPERAND[$Regex.text] ) )\r
+            // LensQuery.g:249:3: ( cmpOp value -> ^( COMPARE OPERATOR[$cmpOp.text] OPERAND[$value.text] ) | Match Regex -> ^( PATTERNMATCH OPERAND[$Regex.text] ) )\r
             int alt8=2;\r
             int LA8_0 = input.LA(1);\r
 \r
@@ -1073,15 +1069,15 @@ public class LensQueryParser extends Parser {
             }\r
             switch (alt8) {\r
                 case 1 :\r
-                    // LensQuery.g:251:5: cmpOp value\r
+                    // LensQuery.g:249:5: cmpOp value\r
                     {\r
-                    pushFollow(FOLLOW_cmpOp_in_nodeCmp1061);\r
+                    pushFollow(FOLLOW_cmpOp_in_nodeCmp1035);\r
                     cmpOp22=cmpOp();\r
 \r
                     state._fsp--;\r
 \r
                     stream_cmpOp.add(cmpOp22.getTree());\r
-                    pushFollow(FOLLOW_value_in_nodeCmp1063);\r
+                    pushFollow(FOLLOW_value_in_nodeCmp1037);\r
                     value23=value();\r
 \r
                     state._fsp--;\r
@@ -1100,9 +1096,9 @@ public class LensQueryParser extends Parser {
                     RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"rule retval",retval!=null?retval.tree:null);\r
 \r
                     root_0 = (Object)adaptor.nil();\r
-                    // 251:17: -> ^( COMPARE OPERATOR[$cmpOp.text] OPERAND[$value.text] )\r
+                    // 249:17: -> ^( COMPARE OPERATOR[$cmpOp.text] OPERAND[$value.text] )\r
                     {\r
-                        // LensQuery.g:251:20: ^( COMPARE OPERATOR[$cmpOp.text] OPERAND[$value.text] )\r
+                        // LensQuery.g:249:20: ^( COMPARE OPERATOR[$cmpOp.text] OPERAND[$value.text] )\r
                         {\r
                         Object root_1 = (Object)adaptor.nil();\r
                         root_1 = (Object)adaptor.becomeRoot((Object)adaptor.create(COMPARE, "COMPARE"), root_1);\r
@@ -1119,12 +1115,12 @@ public class LensQueryParser extends Parser {
                     }\r
                     break;\r
                 case 2 :\r
-                    // LensQuery.g:252:5: Match Regex\r
+                    // LensQuery.g:250:5: Match Regex\r
                     {\r
-                    Match24=(Token)match(input,Match,FOLLOW_Match_in_nodeCmp1081);  \r
+                    Match24=(Token)match(input,Match,FOLLOW_Match_in_nodeCmp1055);  \r
                     stream_Match.add(Match24);\r
 \r
-                    Regex25=(Token)match(input,Regex,FOLLOW_Regex_in_nodeCmp1083);  \r
+                    Regex25=(Token)match(input,Regex,FOLLOW_Regex_in_nodeCmp1057);  \r
                     stream_Regex.add(Regex25);\r
 \r
 \r
@@ -1140,9 +1136,9 @@ public class LensQueryParser extends Parser {
                     RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"rule retval",retval!=null?retval.tree:null);\r
 \r
                     root_0 = (Object)adaptor.nil();\r
-                    // 252:17: -> ^( PATTERNMATCH OPERAND[$Regex.text] )\r
+                    // 250:17: -> ^( PATTERNMATCH OPERAND[$Regex.text] )\r
                     {\r
-                        // LensQuery.g:252:20: ^( PATTERNMATCH OPERAND[$Regex.text] )\r
+                        // LensQuery.g:250:20: ^( PATTERNMATCH OPERAND[$Regex.text] )\r
                         {\r
                         Object root_1 = (Object)adaptor.nil();\r
                         root_1 = (Object)adaptor.becomeRoot((Object)adaptor.create(PATTERNMATCH, "PATTERNMATCH"), root_1);\r
@@ -1183,7 +1179,7 @@ public class LensQueryParser extends Parser {
     };\r
 \r
     // $ANTLR start "cmpOp"\r
-    // LensQuery.g:255:1: fragment cmpOp : ( Lt | Gt | Eq | Leq | Geq | Neq ) ;\r
+    // LensQuery.g:253:1: fragment cmpOp : ( Lt | Gt | Eq | Leq | Geq | Neq ) ;\r
     public final LensQueryParser.cmpOp_return cmpOp() throws RecognitionException {\r
         LensQueryParser.cmpOp_return retval = new LensQueryParser.cmpOp_return();\r
         retval.start = input.LT(1);\r
@@ -1195,8 +1191,8 @@ public class LensQueryParser extends Parser {
         Object set26_tree=null;\r
 \r
         try {\r
-            // LensQuery.g:256:6: ( ( Lt | Gt | Eq | Leq | Geq | Neq ) )\r
-            // LensQuery.g:256:8: ( Lt | Gt | Eq | Leq | Geq | Neq )\r
+            // LensQuery.g:254:6: ( ( Lt | Gt | Eq | Leq | Geq | Neq ) )\r
+            // LensQuery.g:254:8: ( Lt | Gt | Eq | Leq | Geq | Neq )\r
             {\r
             root_0 = (Object)adaptor.nil();\r
 \r
@@ -1237,31 +1233,31 @@ public class LensQueryParser extends Parser {
 \r
  \r
 \r
-    public static final BitSet FOLLOW_relation_in_expr806 = new BitSet(new long[]{0x0000000000000002L});\r
-    public static final BitSet FOLLOW_relation_i_in_relation840 = new BitSet(new long[]{0x0000000000000002L});\r
-    public static final BitSet FOLLOW_nodeName_in_relation_i859 = new BitSet(new long[]{0x0006000000000000L});\r
-    public static final BitSet FOLLOW_alias_in_relation_i861 = new BitSet(new long[]{0x0004000000000000L});\r
-    public static final BitSet FOLLOW_LParen_in_relation_i864 = new BitSet(new long[]{0x0400000004000000L});\r
-    public static final BitSet FOLLOW_nodeItem_in_relation_i867 = new BitSet(new long[]{0x0008800000000000L});\r
-    public static final BitSet FOLLOW_Comma_in_relation_i870 = new BitSet(new long[]{0x0400000004000000L});\r
-    public static final BitSet FOLLOW_nodeItem_in_relation_i873 = new BitSet(new long[]{0x0008800000000000L});\r
-    public static final BitSet FOLLOW_RParen_in_relation_i877 = new BitSet(new long[]{0x0000000000000002L});\r
-    public static final BitSet FOLLOW_QName_in_nodeName890 = new BitSet(new long[]{0x0000000000000002L});\r
-    public static final BitSet FOLLOW_String_in_nodeName901 = new BitSet(new long[]{0x0000000000000002L});\r
-    public static final BitSet FOLLOW_As_in_alias918 = new BitSet(new long[]{0x0400000000000000L});\r
-    public static final BitSet FOLLOW_QName_in_alias920 = new BitSet(new long[]{0x0000000000000002L});\r
-    public static final BitSet FOLLOW_nodeName_in_nodeItem945 = new BitSet(new long[]{0x00031FC000000002L});\r
-    public static final BitSet FOLLOW_alias_in_nodeItem947 = new BitSet(new long[]{0x00011FC000000002L});\r
-    public static final BitSet FOLLOW_nodeValue_in_nodeItem950 = new BitSet(new long[]{0x0000000000000002L});\r
-    public static final BitSet FOLLOW_relation_in_nodeItem979 = new BitSet(new long[]{0x0000000000000002L});\r
+    public static final BitSet FOLLOW_relation_in_expr779 = new BitSet(new long[]{0x0000000000000002L});\r
+    public static final BitSet FOLLOW_relation_i_in_relation813 = new BitSet(new long[]{0x0000000000000002L});\r
+    public static final BitSet FOLLOW_nodeName_in_relation_i832 = new BitSet(new long[]{0x0000600000000000L});\r
+    public static final BitSet FOLLOW_alias_in_relation_i834 = new BitSet(new long[]{0x0000400000000000L});\r
+    public static final BitSet FOLLOW_LParen_in_relation_i837 = new BitSet(new long[]{0x0040000004000000L});\r
+    public static final BitSet FOLLOW_nodeItem_in_relation_i840 = new BitSet(new long[]{0x0000880000000000L});\r
+    public static final BitSet FOLLOW_Comma_in_relation_i843 = new BitSet(new long[]{0x0040000004000000L});\r
+    public static final BitSet FOLLOW_nodeItem_in_relation_i846 = new BitSet(new long[]{0x0000880000000000L});\r
+    public static final BitSet FOLLOW_RParen_in_relation_i850 = new BitSet(new long[]{0x0000000000000002L});\r
+    public static final BitSet FOLLOW_QName_in_nodeName864 = new BitSet(new long[]{0x0000000000000002L});\r
+    public static final BitSet FOLLOW_String_in_nodeName875 = new BitSet(new long[]{0x0000000000000002L});\r
+    public static final BitSet FOLLOW_As_in_alias892 = new BitSet(new long[]{0x0040000000000000L});\r
+    public static final BitSet FOLLOW_QName_in_alias894 = new BitSet(new long[]{0x0000000000000002L});\r
+    public static final BitSet FOLLOW_nodeName_in_nodeItem919 = new BitSet(new long[]{0x000031FC00000002L});\r
+    public static final BitSet FOLLOW_alias_in_nodeItem921 = new BitSet(new long[]{0x000011FC00000002L});\r
+    public static final BitSet FOLLOW_nodeValue_in_nodeItem924 = new BitSet(new long[]{0x0000000000000002L});\r
+    public static final BitSet FOLLOW_relation_in_nodeItem953 = new BitSet(new long[]{0x0000000000000002L});\r
     public static final BitSet FOLLOW_set_in_value0 = new BitSet(new long[]{0x0000000000000002L});\r
-    public static final BitSet FOLLOW_Colon_in_nodeValue1028 = new BitSet(new long[]{0x040000004C000000L});\r
-    public static final BitSet FOLLOW_value_in_nodeValue1030 = new BitSet(new long[]{0x0000000000000002L});\r
-    public static final BitSet FOLLOW_nodeCmp_in_nodeValue1041 = new BitSet(new long[]{0x0000000000000002L});\r
-    public static final BitSet FOLLOW_cmpOp_in_nodeCmp1061 = new BitSet(new long[]{0x040000004C000000L});\r
-    public static final BitSet FOLLOW_value_in_nodeCmp1063 = new BitSet(new long[]{0x0000000000000002L});\r
-    public static final BitSet FOLLOW_Match_in_nodeCmp1081 = new BitSet(new long[]{0x0000200000000000L});\r
-    public static final BitSet FOLLOW_Regex_in_nodeCmp1083 = new BitSet(new long[]{0x0000000000000002L});\r
-    public static final BitSet FOLLOW_set_in_cmpOp1108 = new BitSet(new long[]{0x0000000000000002L});\r
+    public static final BitSet FOLLOW_Colon_in_nodeValue1002 = new BitSet(new long[]{0x004000004C000000L});\r
+    public static final BitSet FOLLOW_value_in_nodeValue1004 = new BitSet(new long[]{0x0000000000000002L});\r
+    public static final BitSet FOLLOW_nodeCmp_in_nodeValue1015 = new BitSet(new long[]{0x0000000000000002L});\r
+    public static final BitSet FOLLOW_cmpOp_in_nodeCmp1035 = new BitSet(new long[]{0x004000004C000000L});\r
+    public static final BitSet FOLLOW_value_in_nodeCmp1037 = new BitSet(new long[]{0x0000000000000002L});\r
+    public static final BitSet FOLLOW_Match_in_nodeCmp1055 = new BitSet(new long[]{0x0000020000000000L});\r
+    public static final BitSet FOLLOW_Regex_in_nodeCmp1057 = new BitSet(new long[]{0x0000000000000002L});\r
+    public static final BitSet FOLLOW_set_in_cmpOp1082 = new BitSet(new long[]{0x0000000000000002L});\r
 \r
 }
\ No newline at end of file
diff --git a/src/main/java/org/xerial/lens/relation/query/impl/XPath.g b/src/main/java/org/xerial/lens/relation/query/impl/XPath.g
new file mode 100644 (file)
index 0000000..d54fba3
--- /dev/null
@@ -0,0 +1,243 @@
+/*--------------------------------------------------------------------------\r
+ *  Copyright 2009 Taro L. Saito\r
+ *\r
+ *  Licensed under the Apache License, Version 2.0 (the "License");\r
+ *  you may not use this file except in compliance with the License.\r
+ *  You may obtain a copy of the License at\r
+ *\r
+ *     http://www.apache.org/licenses/LICENSE-2.0\r
+ *\r
+ *  Unless required by applicable law or agreed to in writing, software\r
+ *  distributed under the License is distributed on an "AS IS" BASIS,\r
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r
+ *  See the License for the specific language governing permissions and\r
+ *  limitations under the License.\r
+ *--------------------------------------------------------------------------*/\r
+//--------------------------------------\r
+// XerialJ\r
+//\r
+// XPath.g\r
+// Since: Aug 6, 2009 08:30:02 AM\r
+//\r
+//--------------------------------------\r
\r
+grammar XPath;\r
+options \r
+{\r
+  language=Java;\r
+  output=AST;\r
+}\r
+tokens {\r
+  XPATH;\r
+  NAME;\r
+  VALUE;\r
+  STEP;\r
+  AXIS;\r
+  PREDICATE;\r
+}\r
+\r
+@lexer::header\r
+{\r
+/*--------------------------------------------------------------------------\r
+ *  Copyright 2009 Taro L. Saito\r
+ *\r
+ *  Licensed under the Apache License, Version 2.0 (the "License");\r
+ *  you may not use this file except in compliance with the License.\r
+ *  You may obtain a copy of the License at\r
+ *\r
+ *     http://www.apache.org/licenses/LICENSE-2.0\r
+ *\r
+ *  Unless required by applicable law or agreed to in writing, software\r
+ *  distributed under the License is distributed on an "AS IS" BASIS,\r
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r
+ *  See the License for the specific language governing permissions and\r
+ *  limitations under the License.\r
+ *--------------------------------------------------------------------------*/\r
+//--------------------------------------\r
+// XerialJ\r
+//\r
+// XPathLexer.g\r
+// Since: Aug 6, 2009 08:30:02 AM\r
+//\r
+//--------------------------------------\r
+\r
+package org.xerial.lens.relation.query.impl;\r
+\r
+}\r
+\r
\r
+@header\r
+{\r
+/*--------------------------------------------------------------------------\r
+ *  Copyright 2009 Taro L. Saito\r
+ *\r
+ *  Licensed under the Apache License, Version 2.0 (the "License");\r
+ *  you may not use this file except in compliance with the License.\r
+ *  You may obtain a copy of the License at\r
+ *\r
+ *     http://www.apache.org/licenses/LICENSE-2.0\r
+ *\r
+ *  Unless required by applicable law or agreed to in writing, software\r
+ *  distributed under the License is distributed on an "AS IS" BASIS,\r
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r
+ *  See the License for the specific language governing permissions and\r
+ *  limitations under the License.\r
+ *--------------------------------------------------------------------------*/\r
+//--------------------------------------\r
+// XerialJ\r
+//\r
+// XPathParser.g\r
+// Since: Aug 6, 2009 08:30:02 AM\r
+//\r
+//--------------------------------------\r
+package org.xerial.lens.relation.query.impl;\r
+\r
+\r
+}\r
+\r
+@lexer::members {\r
+\r
+}\r
+\r
+@members {\r
+\r
+} \r
+\r
+//-------------------------\r
+// lexer rules\r
+//-------------------------\r
+\r
+// Line Comment\r
+fragment LineBreakChar: '\n' | '\r'; // r: <CR> n : <LF>\r
+LineComment: '#' ~(LineBreakChar)* { $channel = HIDDEN; };\r
+\r
+LineBreak: ('\r' '\n' | '\r' | '\n' ) { $channel = HIDDEN; }; \r
+\r
+fragment Digit: '0' .. '9';\r
+fragment Letter: 'A' .. 'F' | 'a' .. 'f';\r
+fragment HexDigit: Digit | Letter;\r
+fragment UnicodeChar: ~('"'| '\\');\r
+fragment EscapeSequence\r
+  : '\\' ('\"' | '\\' | '/' | 'b' | 'f' | 'n' | 'r' | 't' | 'u' HexDigit HexDigit HexDigit HexDigit)\r
+  ; \r
+\r
+fragment StringChar :  UnicodeChar | EscapeSequence;\r
+fragment StringChar_s: StringChar*;\r
+\r
+String: '"' s=StringChar_s '"' { setText($s.text); };\r
+\r
+Integer: '-'? ('0' | '1'..'9' Digit*);\r
+fragment Frac: '.' Digit+;\r
+fragment Exp: ('e' | 'E') ('+' | '-')? Digit+;\r
+Double: Integer (Frac Exp? | Exp);\r
+\r
+// comparison operator\r
+\r
+Comma: ',';\r
+Colon: ':';\r
+\r
+\r
+\r
+fragment\r
+UnsafeUnicodeChar: '(' | ')' | '[' | ']' | '{' | '}' | ',' | ':' | '#' | '<' | '>' | '|' | '*' | '\'' | '"' | '@' | '%' | '\\' | '.' | '-'; \r
+\r
+fragment SafeFirstLetter: 'A' .. 'Z' | 'a' .. 'z';\r
+fragment SafeLetter: SafeFirstLetter | '0' .. '9' | '-' | '_';\r
+\r
+fragment QNameChar: ~(LineBreakChar | UnsafeUnicodeChar | WhiteSpace | '/' | '//');\r
+QName: QNameChar+ ('.' QNameChar+)*;\r
+\r
+\r
+fragment \r
+WhiteSpace: ' ' | '\t';\r
\r
+WhiteSpaces: WhiteSpace+ { $channel = HIDDEN; }; \r
+\r
+\r
+\r
+//---------------------------\r
+// parser rules\r
+//---------------------------\r
+\r
+xpath\r
+  : locationExpr\r
+  -> ^(XPATH locationExpr)\r
+  ; \r
+\r
+fragment\r
+locationExpr\r
+  : relativePath\r
+  | absolutePath\r
+  ;\r
+  \r
+fragment\r
+relativePath\r
+  : step \r
+  -> ^(STEP step)\r
+  | (step '/') => step '/' relativePath\r
+  -> ^(STEP AXIS["PC"] step relativePath)  \r
+  | (step '//') => step '//' relativePath \r
+  -> ^(STEP AXIS["AD"] step relativePath)\r
+  ;\r
+\r
+fragment\r
+absolutePath\r
+  : '/' relativePath \r
+  -> ^(STEP AXIS["PC"] NAME["_root"] relativePath)\r
+  ;\r
+  \r
+fragment\r
+step\r
+  : nodeTest predicate* -> NAME[$nodeTest.text] predicate* \r
+  ;\r
+\r
+  \r
+fragment\r
+nodeTest\r
+  : '@'? (QName ':')? QName \r
+  ;  \r
+\r
+fragment\r
+predicate\r
+  : '[' expr ']'\r
+  -> ^(PREDICATE expr)\r
+  ;\r
+\r
+expr\r
+  : comparisonExpr\r
+  ;\r
+\r
+fragment\r
+comparisonExpr\r
+  : pathExpr\r
+  | (pathExpr '=') => pathExpr '=' pathExpr\r
+  | (pathExpr '!=') => pathExpr '!=' pathExpr\r
+  | (pathExpr '>') => pathExpr '>' pathExpr\r
+  | (pathExpr '>=') => pathExpr '>=' pathExpr\r
+  | (pathExpr '<') => pathExpr '<' pathExpr\r
+  | (pathExpr '<=') => pathExpr '<=' pathExpr\r
+  | (pathExpr '~=') => pathExpr '~=' pathExpr\r
+  ;\r
+\r
+\r
+fragment\r
+pathExpr\r
+  : locationExpr\r
+  | primaryExpr \r
+  ;\r
+   \r
+fragment\r
+primaryExpr\r
+  : String\r
+  | Integer\r
+  | Double\r
+  | functionCall  \r
+  ;\r
+  \r
+\r
+fragment\r
+functionCall\r
+  : QName '(' (expr (',' expr)*)? ')'\r
+  ;  \r
+  \r
+  
\ No newline at end of file
diff --git a/src/main/java/org/xerial/lens/relation/query/impl/XPath.tokens b/src/main/java/org/xerial/lens/relation/query/impl/XPath.tokens
new file mode 100644 (file)
index 0000000..cb4b201
--- /dev/null
@@ -0,0 +1,60 @@
+T__42=42\r
+Digit=13\r
+Frac=22\r
+HexDigit=15\r
+T__47=47\r
+STEP=7\r
+VALUE=6\r
+T__39=39\r
+PREDICATE=9\r
+Letter=14\r
+T__46=46\r
+Comma=25\r
+EscapeSequence=17\r
+XPATH=4\r
+Integer=21\r
+WhiteSpace=30\r
+T__34=34\r
+AXIS=8\r
+LineComment=11\r
+Colon=26\r
+T__35=35\r
+SafeFirstLetter=28\r
+T__36=36\r
+Exp=23\r
+QNameChar=31\r
+T__44=44\r
+UnicodeChar=16\r
+StringChar=18\r
+LineBreak=12\r
+T__45=45\r
+String=20\r
+SafeLetter=29\r
+LineBreakChar=10\r
+T__43=43\r
+QName=32\r
+T__40=40\r
+T__38=38\r
+T__37=37\r
+StringChar_s=19\r
+UnsafeUnicodeChar=27\r
+Double=24\r
+NAME=5\r
+T__41=41\r
+WhiteSpaces=33\r
+'~='=45\r
+'<'=43\r
+'>'=41\r
+')'=47\r
+'@'=36\r
+']'=38\r
+'!='=40\r
+','=25\r
+'('=46\r
+'>='=42\r
+':'=26\r
+'//'=35\r
+'<='=44\r
+'='=39\r
+'['=37\r
+'/'=34\r
diff --git a/src/main/java/org/xerial/lens/relation/query/impl/XPathLexer.java b/src/main/java/org/xerial/lens/relation/query/impl/XPathLexer.java
new file mode 100644 (file)
index 0000000..382a583
--- /dev/null
@@ -0,0 +1,1970 @@
+// $ANTLR 3.1.3 Mar 17, 2009 19:23:44 XPath.g 2009-09-29 14:52:04\r
+\r
+/*--------------------------------------------------------------------------\r
+ *  Copyright 2009 Taro L. Saito\r
+ *\r
+ *  Licensed under the Apache License, Version 2.0 (the "License");\r
+ *  you may not use this file except in compliance with the License.\r
+ *  You may obtain a copy of the License at\r
+ *\r
+ *     http://www.apache.org/licenses/LICENSE-2.0\r
+ *\r
+ *  Unless required by applicable law or agreed to in writing, software\r
+ *  distributed under the License is distributed on an "AS IS" BASIS,\r
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r
+ *  See the License for the specific language governing permissions and\r
+ *  limitations under the License.\r
+ *--------------------------------------------------------------------------*/\r
+//--------------------------------------\r
+// XerialJ\r
+//\r
+// XPathLexer.g\r
+// Since: Aug 6, 2009 08:30:02 AM\r
+//\r
+//--------------------------------------\r
+\r
+package org.xerial.lens.relation.query.impl;\r
+\r
+\r
+\r
+import org.antlr.runtime.*;\r
+import java.util.Stack;\r
+import java.util.List;\r
+import java.util.ArrayList;\r
+\r
+public class XPathLexer extends Lexer {\r
+    public static final int T__42=42;\r
+    public static final int Digit=13;\r
+    public static final int Frac=22;\r
+    public static final int HexDigit=15;\r
+    public static final int T__47=47;\r
+    public static final int STEP=7;\r
+    public static final int VALUE=6;\r
+    public static final int T__39=39;\r
+    public static final int Letter=14;\r
+    public static final int PREDICATE=9;\r
+    public static final int Comma=25;\r
+    public static final int T__46=46;\r
+    public static final int EscapeSequence=17;\r
+    public static final int XPATH=4;\r
+    public static final int Integer=21;\r
+    public static final int WhiteSpace=30;\r
+    public static final int T__34=34;\r
+    public static final int AXIS=8;\r
+    public static final int LineComment=11;\r
+    public static final int Colon=26;\r
+    public static final int T__35=35;\r
+    public static final int SafeFirstLetter=28;\r
+    public static final int T__36=36;\r
+    public static final int Exp=23;\r
+    public static final int QNameChar=31;\r
+    public static final int T__44=44;\r
+    public static final int UnicodeChar=16;\r
+    public static final int StringChar=18;\r
+    public static final int LineBreak=12;\r
+    public static final int T__45=45;\r
+    public static final int String=20;\r
+    public static final int SafeLetter=29;\r
+    public static final int LineBreakChar=10;\r
+    public static final int T__43=43;\r
+    public static final int QName=32;\r
+    public static final int T__40=40;\r
+    public static final int EOF=-1;\r
+    public static final int T__38=38;\r
+    public static final int T__37=37;\r
+    public static final int StringChar_s=19;\r
+    public static final int UnsafeUnicodeChar=27;\r
+    public static final int Double=24;\r
+    public static final int NAME=5;\r
+    public static final int T__41=41;\r
+    public static final int WhiteSpaces=33;\r
+\r
+\r
+\r
+\r
+    // delegates\r
+    // delegators\r
+\r
+    public XPathLexer() {;} \r
+    public XPathLexer(CharStream input) {\r
+        this(input, new RecognizerSharedState());\r
+    }\r
+    public XPathLexer(CharStream input, RecognizerSharedState state) {\r
+        super(input,state);\r
+\r
+    }\r
+    public String getGrammarFileName() { return "XPath.g"; }\r
+\r
+    // $ANTLR start "T__34"\r
+    public final void mT__34() throws RecognitionException {\r
+        try {\r
+            int _type = T__34;\r
+            int _channel = DEFAULT_TOKEN_CHANNEL;\r
+            // XPath.g:38:7: ( '/' )\r
+            // XPath.g:38:9: '/'\r
+            {\r
+            match('/'); \r
+\r
+            }\r
+\r
+            state.type = _type;\r
+            state.channel = _channel;\r
+        }\r
+        finally {\r
+        }\r
+    }\r
+    // $ANTLR end "T__34"\r
+\r
+    // $ANTLR start "T__35"\r
+    public final void mT__35() throws RecognitionException {\r
+        try {\r
+            int _type = T__35;\r
+            int _channel = DEFAULT_TOKEN_CHANNEL;\r
+            // XPath.g:39:7: ( '//' )\r
+            // XPath.g:39:9: '//'\r
+            {\r
+            match("//"); \r
+\r
+\r
+            }\r
+\r
+            state.type = _type;\r
+            state.channel = _channel;\r
+        }\r
+        finally {\r
+        }\r
+    }\r
+    // $ANTLR end "T__35"\r
+\r
+    // $ANTLR start "T__36"\r
+    public final void mT__36() throws RecognitionException {\r
+        try {\r
+            int _type = T__36;\r
+            int _channel = DEFAULT_TOKEN_CHANNEL;\r
+            // XPath.g:40:7: ( '@' )\r
+            // XPath.g:40:9: '@'\r
+            {\r
+            match('@'); \r
+\r
+            }\r
+\r
+            state.type = _type;\r
+            state.channel = _channel;\r
+        }\r
+        finally {\r
+        }\r
+    }\r
+    // $ANTLR end "T__36"\r
+\r
+    // $ANTLR start "T__37"\r
+    public final void mT__37() throws RecognitionException {\r
+        try {\r
+            int _type = T__37;\r
+            int _channel = DEFAULT_TOKEN_CHANNEL;\r
+            // XPath.g:41:7: ( '[' )\r
+            // XPath.g:41:9: '['\r
+            {\r
+            match('['); \r
+\r
+            }\r
+\r
+            state.type = _type;\r
+            state.channel = _channel;\r
+        }\r
+        finally {\r
+        }\r
+    }\r
+    // $ANTLR end "T__37"\r
+\r
+    // $ANTLR start "T__38"\r
+    public final void mT__38() throws RecognitionException {\r
+        try {\r
+            int _type = T__38;\r
+            int _channel = DEFAULT_TOKEN_CHANNEL;\r
+            // XPath.g:42:7: ( ']' )\r
+            // XPath.g:42:9: ']'\r
+            {\r
+            match(']'); \r
+\r
+            }\r
+\r
+            state.type = _type;\r
+            state.channel = _channel;\r
+        }\r
+        finally {\r
+        }\r
+    }\r
+    // $ANTLR end "T__38"\r
+\r
+    // $ANTLR start "T__39"\r
+    public final void mT__39() throws RecognitionException {\r
+        try {\r
+            int _type = T__39;\r
+            int _channel = DEFAULT_TOKEN_CHANNEL;\r
+            // XPath.g:43:7: ( '=' )\r
+            // XPath.g:43:9: '='\r
+            {\r
+            match('='); \r
+\r
+            }\r
+\r
+            state.type = _type;\r
+            state.channel = _channel;\r
+        }\r
+        finally {\r
+        }\r
+    }\r
+    // $ANTLR end "T__39"\r
+\r
+    // $ANTLR start "T__40"\r
+    public final void mT__40() throws RecognitionException {\r
+        try {\r
+            int _type = T__40;\r
+            int _channel = DEFAULT_TOKEN_CHANNEL;\r
+            // XPath.g:44:7: ( '!=' )\r
+            // XPath.g:44:9: '!='\r
+            {\r
+            match("!="); \r
+\r
+\r
+            }\r
+\r
+            state.type = _type;\r
+            state.channel = _channel;\r
+        }\r
+        finally {\r
+        }\r
+    }\r
+    // $ANTLR end "T__40"\r
+\r
+    // $ANTLR start "T__41"\r
+    public final void mT__41() throws RecognitionException {\r
+        try {\r
+            int _type = T__41;\r
+            int _channel = DEFAULT_TOKEN_CHANNEL;\r
+            // XPath.g:45:7: ( '>' )\r
+            // XPath.g:45:9: '>'\r
+            {\r
+            match('>'); \r
+\r
+            }\r
+\r
+            state.type = _type;\r
+            state.channel = _channel;\r
+        }\r
+        finally {\r
+        }\r
+    }\r
+    // $ANTLR end "T__41"\r
+\r
+    // $ANTLR start "T__42"\r
+    public final void mT__42() throws RecognitionException {\r
+        try {\r
+            int _type = T__42;\r
+            int _channel = DEFAULT_TOKEN_CHANNEL;\r
+            // XPath.g:46:7: ( '>=' )\r
+            // XPath.g:46:9: '>='\r
+            {\r
+            match(">="); \r
+\r
+\r
+            }\r
+\r
+            state.type = _type;\r
+            state.channel = _channel;\r
+        }\r
+        finally {\r
+        }\r
+    }\r
+    // $ANTLR end "T__42"\r
+\r
+    // $ANTLR start "T__43"\r
+    public final void mT__43() throws RecognitionException {\r
+        try {\r
+            int _type = T__43;\r
+            int _channel = DEFAULT_TOKEN_CHANNEL;\r
+            // XPath.g:47:7: ( '<' )\r
+            // XPath.g:47:9: '<'\r
+            {\r
+            match('<'); \r
+\r
+            }\r
+\r
+            state.type = _type;\r
+            state.channel = _channel;\r
+        }\r
+        finally {\r
+        }\r
+    }\r
+    // $ANTLR end "T__43"\r
+\r
+    // $ANTLR start "T__44"\r
+    public final void mT__44() throws RecognitionException {\r
+        try {\r
+            int _type = T__44;\r
+            int _channel = DEFAULT_TOKEN_CHANNEL;\r
+            // XPath.g:48:7: ( '<=' )\r
+            // XPath.g:48:9: '<='\r
+            {\r
+            match("<="); \r
+\r
+\r
+            }\r
+\r
+            state.type = _type;\r
+            state.channel = _channel;\r
+        }\r
+        finally {\r
+        }\r
+    }\r
+    // $ANTLR end "T__44"\r
+\r
+    // $ANTLR start "T__45"\r
+    public final void mT__45() throws RecognitionException {\r
+        try {\r
+            int _type = T__45;\r
+            int _channel = DEFAULT_TOKEN_CHANNEL;\r
+            // XPath.g:49:7: ( '~=' )\r
+            // XPath.g:49:9: '~='\r
+            {\r
+            match("~="); \r
+\r
+\r
+            }\r
+\r
+            state.type = _type;\r
+            state.channel = _channel;\r
+        }\r
+        finally {\r
+        }\r
+    }\r
+    // $ANTLR end "T__45"\r
+\r
+    // $ANTLR start "T__46"\r
+    public final void mT__46() throws RecognitionException {\r
+        try {\r
+            int _type = T__46;\r
+            int _channel = DEFAULT_TOKEN_CHANNEL;\r
+            // XPath.g:50:7: ( '(' )\r
+            // XPath.g:50:9: '('\r
+            {\r
+            match('('); \r
+\r
+            }\r
+\r
+            state.type = _type;\r
+            state.channel = _channel;\r
+        }\r
+        finally {\r
+        }\r
+    }\r
+    // $ANTLR end "T__46"\r
+\r
+    // $ANTLR start "T__47"\r
+    public final void mT__47() throws RecognitionException {\r
+        try {\r
+            int _type = T__47;\r
+            int _channel = DEFAULT_TOKEN_CHANNEL;\r
+            // XPath.g:51:7: ( ')' )\r
+            // XPath.g:51:9: ')'\r
+            {\r
+            match(')'); \r
+\r
+            }\r
+\r
+            state.type = _type;\r
+            state.channel = _channel;\r
+        }\r
+        finally {\r
+        }\r
+    }\r
+    // $ANTLR end "T__47"\r
+\r
+    // $ANTLR start "LineBreakChar"\r
+    public final void mLineBreakChar() throws RecognitionException {\r
+        try {\r
+            // XPath.g:111:23: ( '\\n' | '\\r' )\r
+            // XPath.g:\r
+            {\r
+            if ( input.LA(1)=='\n'||input.LA(1)=='\r' ) {\r
+                input.consume();\r
+\r
+            }\r
+            else {\r
+                MismatchedSetException mse = new MismatchedSetException(null,input);\r
+                recover(mse);\r
+                throw mse;}\r
+\r
+\r
+            }\r
+\r
+        }\r
+        finally {\r
+        }\r
+    }\r
+    // $ANTLR end "LineBreakChar"\r
+\r
+    // $ANTLR start "LineComment"\r
+    public final void mLineComment() throws RecognitionException {\r
+        try {\r
+            int _type = LineComment;\r
+            int _channel = DEFAULT_TOKEN_CHANNEL;\r
+            // XPath.g:112:12: ( '#' (~ ( LineBreakChar ) )* )\r
+            // XPath.g:112:14: '#' (~ ( LineBreakChar ) )*\r
+            {\r
+            match('#'); \r
+            // XPath.g:112:18: (~ ( LineBreakChar ) )*\r
+            loop1:\r
+            do {\r
+                int alt1=2;\r
+                int LA1_0 = input.LA(1);\r
+\r
+                if ( ((LA1_0>='\u0000' && LA1_0<='\t')||(LA1_0>='\u000B' && LA1_0<='\f')||(LA1_0>='\u000E' && LA1_0<='\uFFFF')) ) {\r
+                    alt1=1;\r
+                }\r
+\r
+\r
+                switch (alt1) {\r
+               case 1 :\r
+                   // XPath.g:112:18: ~ ( LineBreakChar )\r
+                   {\r
+                   if ( (input.LA(1)>='\u0000' && input.LA(1)<='\t')||(input.LA(1)>='\u000B' && input.LA(1)<='\f')||(input.LA(1)>='\u000E' && input.LA(1)<='\uFFFF') ) {\r
+                       input.consume();\r
+\r
+                   }\r
+                   else {\r
+                       MismatchedSetException mse = new MismatchedSetException(null,input);\r
+                       recover(mse);\r
+                       throw mse;}\r
+\r
+\r
+                   }\r
+                   break;\r
+\r
+               default :\r
+                   break loop1;\r
+                }\r
+            } while (true);\r
+\r
+             _channel = HIDDEN; \r
+\r
+            }\r
+\r
+            state.type = _type;\r
+            state.channel = _channel;\r
+        }\r
+        finally {\r
+        }\r
+    }\r
+    // $ANTLR end "LineComment"\r
+\r
+    // $ANTLR start "LineBreak"\r
+    public final void mLineBreak() throws RecognitionException {\r
+        try {\r
+            int _type = LineBreak;\r
+            int _channel = DEFAULT_TOKEN_CHANNEL;\r
+            // XPath.g:114:10: ( ( '\\r' '\\n' | '\\r' | '\\n' ) )\r
+            // XPath.g:114:12: ( '\\r' '\\n' | '\\r' | '\\n' )\r
+            {\r
+            // XPath.g:114:12: ( '\\r' '\\n' | '\\r' | '\\n' )\r
+            int alt2=3;\r
+            int LA2_0 = input.LA(1);\r
+\r
+            if ( (LA2_0=='\r') ) {\r
+                int LA2_1 = input.LA(2);\r
+\r
+                if ( (LA2_1=='\n') ) {\r
+                    alt2=1;\r
+                }\r
+                else {\r
+                    alt2=2;}\r
+            }\r
+            else if ( (LA2_0=='\n') ) {\r
+                alt2=3;\r
+            }\r
+            else {\r
+                NoViableAltException nvae =\r
+                    new NoViableAltException("", 2, 0, input);\r
+\r
+                throw nvae;\r
+            }\r
+            switch (alt2) {\r
+                case 1 :\r
+                    // XPath.g:114:13: '\\r' '\\n'\r
+                    {\r
+                    match('\r'); \r
+                    match('\n'); \r
+\r
+                    }\r
+                    break;\r
+                case 2 :\r
+                    // XPath.g:114:25: '\\r'\r
+                    {\r
+                    match('\r'); \r
+\r
+                    }\r
+                    break;\r
+                case 3 :\r
+                    // XPath.g:114:32: '\\n'\r
+                    {\r
+                    match('\n'); \r
+\r
+                    }\r
+                    break;\r
+\r
+            }\r
+\r
+             _channel = HIDDEN; \r
+\r
+            }\r
+\r
+            state.type = _type;\r
+            state.channel = _channel;\r
+        }\r
+        finally {\r
+        }\r
+    }\r
+    // $ANTLR end "LineBreak"\r
+\r
+    // $ANTLR start "Digit"\r
+    public final void mDigit() throws RecognitionException {\r
+        try {\r
+            // XPath.g:116:15: ( '0' .. '9' )\r
+            // XPath.g:116:17: '0' .. '9'\r
+            {\r
+            matchRange('0','9'); \r
+\r
+            }\r
+\r
+        }\r
+        finally {\r
+        }\r
+    }\r
+    // $ANTLR end "Digit"\r
+\r
+    // $ANTLR start "Letter"\r
+    public final void mLetter() throws RecognitionException {\r
+        try {\r
+            // XPath.g:117:16: ( 'A' .. 'F' | 'a' .. 'f' )\r
+            // XPath.g:\r
+            {\r
+            if ( (input.LA(1)>='A' && input.LA(1)<='F')||(input.LA(1)>='a' && input.LA(1)<='f') ) {\r
+                input.consume();\r
+\r
+            }\r
+            else {\r
+                MismatchedSetException mse = new MismatchedSetException(null,input);\r
+                recover(mse);\r
+                throw mse;}\r
+\r
+\r
+            }\r
+\r
+        }\r
+        finally {\r
+        }\r
+    }\r
+    // $ANTLR end "Letter"\r
+\r
+    // $ANTLR start "HexDigit"\r
+    public final void mHexDigit() throws RecognitionException {\r
+        try {\r
+            // XPath.g:118:18: ( Digit | Letter )\r
+            // XPath.g:\r
+            {\r
+            if ( (input.LA(1)>='0' && input.LA(1)<='9')||(input.LA(1)>='A' && input.LA(1)<='F')||(input.LA(1)>='a' && input.LA(1)<='f') ) {\r
+                input.consume();\r
+\r
+            }\r
+            else {\r
+                MismatchedSetException mse = new MismatchedSetException(null,input);\r
+                recover(mse);\r
+                throw mse;}\r
+\r
+\r
+            }\r
+\r
+        }\r
+        finally {\r
+        }\r
+    }\r
+    // $ANTLR end "HexDigit"\r
+\r
+    // $ANTLR start "UnicodeChar"\r
+    public final void mUnicodeChar() throws RecognitionException {\r
+        try {\r
+            // XPath.g:119:21: (~ ( '\"' | '\\\\' ) )\r
+            // XPath.g:119:23: ~ ( '\"' | '\\\\' )\r
+            {\r
+            if ( (input.LA(1)>='\u0000' && input.LA(1)<='!')||(input.LA(1)>='#' && input.LA(1)<='[')||(input.LA(1)>=']' && input.LA(1)<='\uFFFF') ) {\r
+                input.consume();\r
+\r
+            }\r
+            else {\r
+                MismatchedSetException mse = new MismatchedSetException(null,input);\r
+                recover(mse);\r
+                throw mse;}\r
+\r
+\r
+            }\r
+\r
+        }\r
+        finally {\r
+        }\r
+    }\r
+    // $ANTLR end "UnicodeChar"\r
+\r
+    // $ANTLR start "EscapeSequence"\r
+    public final void mEscapeSequence() throws RecognitionException {\r
+        try {\r
+            // XPath.g:121:3: ( '\\\\' ( '\\\"' | '\\\\' | '/' | 'b' | 'f' | 'n' | 'r' | 't' | 'u' HexDigit HexDigit HexDigit HexDigit ) )\r
+            // XPath.g:121:5: '\\\\' ( '\\\"' | '\\\\' | '/' | 'b' | 'f' | 'n' | 'r' | 't' | 'u' HexDigit HexDigit HexDigit HexDigit )\r
+            {\r
+            match('\\'); \r
+            // XPath.g:121:10: ( '\\\"' | '\\\\' | '/' | 'b' | 'f' | 'n' | 'r' | 't' | 'u' HexDigit HexDigit HexDigit HexDigit )\r
+            int alt3=9;\r
+            switch ( input.LA(1) ) {\r
+            case '\"':\r
+                {\r
+                alt3=1;\r
+                }\r
+                break;\r
+            case '\\':\r
+                {\r
+                alt3=2;\r
+                }\r
+                break;\r
+            case '/':\r
+                {\r
+                alt3=3;\r
+                }\r
+                break;\r
+            case 'b':\r
+                {\r
+                alt3=4;\r
+                }\r
+                break;\r
+            case 'f':\r
+                {\r
+                alt3=5;\r
+                }\r
+                break;\r
+            case 'n':\r
+                {\r
+                alt3=6;\r
+                }\r
+                break;\r
+            case 'r':\r
+                {\r
+                alt3=7;\r
+                }\r
+                break;\r
+            case 't':\r
+                {\r
+                alt3=8;\r
+                }\r
+                break;\r
+            case 'u':\r
+                {\r
+                alt3=9;\r
+                }\r
+                break;\r
+            default:\r
+                NoViableAltException nvae =\r
+                    new NoViableAltException("", 3, 0, input);\r
+\r
+                throw nvae;\r
+            }\r
+\r
+            switch (alt3) {\r
+                case 1 :\r
+                    // XPath.g:121:11: '\\\"'\r
+                    {\r
+                    match('\"'); \r
+\r
+                    }\r
+                    break;\r
+                case 2 :\r
+                    // XPath.g:121:18: '\\\\'\r
+                    {\r
+                    match('\\'); \r
+\r
+                    }\r
+                    break;\r
+                case 3 :\r
+                    // XPath.g:121:25: '/'\r
+                    {\r
+                    match('/'); \r
+\r
+                    }\r
+                    break;\r
+                case 4 :\r
+                    // XPath.g:121:31: 'b'\r
+                    {\r
+                    match('b'); \r
+\r
+                    }\r
+                    break;\r
+                case 5 :\r
+                    // XPath.g:121:37: 'f'\r
+                    {\r
+                    match('f'); \r
+\r
+                    }\r
+                    break;\r
+                case 6 :\r
+                    // XPath.g:121:43: 'n'\r
+                    {\r
+                    match('n'); \r
+\r
+                    }\r
+                    break;\r
+                case 7 :\r
+                    // XPath.g:121:49: 'r'\r
+                    {\r
+                    match('r'); \r
+\r
+                    }\r
+                    break;\r
+                case 8 :\r
+                    // XPath.g:121:55: 't'\r
+                    {\r
+                    match('t'); \r
+\r
+                    }\r
+                    break;\r
+                case 9 :\r
+                    // XPath.g:121:61: 'u' HexDigit HexDigit HexDigit HexDigit\r
+                    {\r
+                    match('u'); \r
+                    mHexDigit(); \r
+                    mHexDigit(); \r
+                    mHexDigit(); \r
+                    mHexDigit(); \r
+\r
+                    }\r
+                    break;\r
+\r
+            }\r
+\r
+\r
+            }\r
+\r
+        }\r
+        finally {\r
+        }\r
+    }\r
+    // $ANTLR end "EscapeSequence"\r
+\r
+    // $ANTLR start "StringChar"\r
+    public final void mStringChar() throws RecognitionException {\r
+        try {\r
+            // XPath.g:124:21: ( UnicodeChar | EscapeSequence )\r
+            int alt4=2;\r
+            int LA4_0 = input.LA(1);\r
+\r
+            if ( ((LA4_0>='\u0000' && LA4_0<='!')||(LA4_0>='#' && LA4_0<='[')||(LA4_0>=']' && LA4_0<='\uFFFF')) ) {\r
+                alt4=1;\r
+            }\r
+            else if ( (LA4_0=='\\') ) {\r
+                alt4=2;\r
+            }\r
+            else {\r
+                NoViableAltException nvae =\r
+                    new NoViableAltException("", 4, 0, input);\r
+\r
+                throw nvae;\r
+            }\r
+            switch (alt4) {\r
+                case 1 :\r
+                    // XPath.g:124:24: UnicodeChar\r
+                    {\r
+                    mUnicodeChar(); \r
+\r
+                    }\r
+                    break;\r
+                case 2 :\r
+                    // XPath.g:124:38: EscapeSequence\r
+                    {\r
+                    mEscapeSequence(); \r
+\r
+                    }\r
+                    break;\r
+\r
+            }\r
+        }\r
+        finally {\r
+        }\r
+    }\r
+    // $ANTLR end "StringChar"\r
+\r
+    // $ANTLR start "StringChar_s"\r
+    public final void mStringChar_s() throws RecognitionException {\r
+        try {\r
+            // XPath.g:125:22: ( ( StringChar )* )\r
+            // XPath.g:125:24: ( StringChar )*\r
+            {\r
+            // XPath.g:125:24: ( StringChar )*\r
+            loop5:\r
+            do {\r
+                int alt5=2;\r
+                int LA5_0 = input.LA(1);\r
+\r
+                if ( ((LA5_0>='\u0000' && LA5_0<='!')||(LA5_0>='#' && LA5_0<='\uFFFF')) ) {\r
+                    alt5=1;\r
+                }\r
+\r
+\r
+                switch (alt5) {\r
+               case 1 :\r
+                   // XPath.g:125:24: StringChar\r
+                   {\r
+                   mStringChar(); \r
+\r
+                   }\r
+                   break;\r
+\r
+               default :\r
+                   break loop5;\r
+                }\r
+            } while (true);\r
+\r
+\r
+            }\r
+\r
+        }\r
+        finally {\r
+        }\r
+    }\r
+    // $ANTLR end "StringChar_s"\r
+\r
+    // $ANTLR start "String"\r
+    public final void mString() throws RecognitionException {\r
+        try {\r
+            int _type = String;\r
+            int _channel = DEFAULT_TOKEN_CHANNEL;\r
+            Token s=null;\r
+\r
+            // XPath.g:127:7: ( '\"' s= StringChar_s '\"' )\r
+            // XPath.g:127:9: '\"' s= StringChar_s '\"'\r
+            {\r
+            match('\"'); \r
+            int sStart355 = getCharIndex();\r
+            mStringChar_s(); \r
+            s = new CommonToken(input, Token.INVALID_TOKEN_TYPE, Token.DEFAULT_CHANNEL, sStart355, getCharIndex()-1);\r
+            match('\"'); \r
+             setText((s!=null?s.getText():null)); \r
+\r
+            }\r
+\r
+            state.type = _type;\r
+            state.channel = _channel;\r
+        }\r
+        finally {\r
+        }\r
+    }\r
+    // $ANTLR end "String"\r
+\r
+    // $ANTLR start "Integer"\r
+    public final void mInteger() throws RecognitionException {\r
+        try {\r
+            int _type = Integer;\r
+            int _channel = DEFAULT_TOKEN_CHANNEL;\r
+            // XPath.g:129:8: ( ( '-' )? ( '0' | '1' .. '9' ( Digit )* ) )\r
+            // XPath.g:129:10: ( '-' )? ( '0' | '1' .. '9' ( Digit )* )\r
+            {\r
+            // XPath.g:129:10: ( '-' )?\r
+            int alt6=2;\r
+            int LA6_0 = input.LA(1);\r
+\r
+            if ( (LA6_0=='-') ) {\r
+                alt6=1;\r
+            }\r
+            switch (alt6) {\r
+                case 1 :\r
+                    // XPath.g:129:10: '-'\r
+                    {\r
+                    match('-'); \r
+\r
+                    }\r
+                    break;\r
+\r
+            }\r
+\r
+            // XPath.g:129:15: ( '0' | '1' .. '9' ( Digit )* )\r
+            int alt8=2;\r
+            int LA8_0 = input.LA(1);\r
+\r
+            if ( (LA8_0=='0') ) {\r
+                alt8=1;\r
+            }\r
+            else if ( ((LA8_0>='1' && LA8_0<='9')) ) {\r
+                alt8=2;\r
+            }\r
+            else {\r
+                NoViableAltException nvae =\r
+                    new NoViableAltException("", 8, 0, input);\r
+\r
+                throw nvae;\r
+            }\r
+            switch (alt8) {\r
+                case 1 :\r
+                    // XPath.g:129:16: '0'\r
+                    {\r
+                    match('0'); \r
+\r
+                    }\r
+                    break;\r
+                case 2 :\r
+                    // XPath.g:129:22: '1' .. '9' ( Digit )*\r
+                    {\r
+                    matchRange('1','9'); \r
+                    // XPath.g:129:31: ( Digit )*\r
+                    loop7:\r
+                    do {\r
+                        int alt7=2;\r
+                        int LA7_0 = input.LA(1);\r
+\r
+                        if ( ((LA7_0>='0' && LA7_0<='9')) ) {\r
+                            alt7=1;\r
+                        }\r
+\r
+\r
+                        switch (alt7) {\r
+                       case 1 :\r
+                           // XPath.g:129:31: Digit\r
+                           {\r
+                           mDigit(); \r
+\r
+                           }\r
+                           break;\r
+\r
+                       default :\r
+                           break loop7;\r
+                        }\r
+                    } while (true);\r
+\r
+\r
+                    }\r
+                    break;\r
+\r
+            }\r
+\r
+\r
+            }\r
+\r
+            state.type = _type;\r
+            state.channel = _channel;\r
+        }\r
+        finally {\r
+        }\r
+    }\r
+    // $ANTLR end "Integer"\r
+\r
+    // $ANTLR start "Frac"\r
+    public final void mFrac() throws RecognitionException {\r
+        try {\r
+            // XPath.g:130:14: ( '.' ( Digit )+ )\r
+            // XPath.g:130:16: '.' ( Digit )+\r
+            {\r
+            match('.'); \r
+            // XPath.g:130:20: ( Digit )+\r
+            int cnt9=0;\r
+            loop9:\r
+            do {\r
+                int alt9=2;\r
+                int LA9_0 = input.LA(1);\r
+\r
+                if ( ((LA9_0>='0' && LA9_0<='9')) ) {\r
+                    alt9=1;\r
+                }\r
+\r
+\r
+                switch (alt9) {\r
+               case 1 :\r
+                   // XPath.g:130:20: Digit\r
+                   {\r
+                   mDigit(); \r
+\r
+                   }\r
+                   break;\r
+\r
+               default :\r
+                   if ( cnt9 >= 1 ) break loop9;\r
+                        EarlyExitException eee =\r
+                            new EarlyExitException(9, input);\r
+                        throw eee;\r
+                }\r
+                cnt9++;\r
+            } while (true);\r
+\r
+\r
+            }\r
+\r
+        }\r
+        finally {\r
+        }\r
+    }\r
+    // $ANTLR end "Frac"\r
+\r
+    // $ANTLR start "Exp"\r
+    public final void mExp() throws RecognitionException {\r
+        try {\r
+            // XPath.g:131:13: ( ( 'e' | 'E' ) ( '+' | '-' )? ( Digit )+ )\r
+            // XPath.g:131:15: ( 'e' | 'E' ) ( '+' | '-' )? ( Digit )+\r
+            {\r
+            if ( input.LA(1)=='E'||input.LA(1)=='e' ) {\r
+                input.consume();\r
+\r
+            }\r
+            else {\r
+                MismatchedSetException mse = new MismatchedSetException(null,input);\r
+                recover(mse);\r
+                throw mse;}\r
+\r
+            // XPath.g:131:27: ( '+' | '-' )?\r
+            int alt10=2;\r
+            int LA10_0 = input.LA(1);\r
+\r
+            if ( (LA10_0=='+'||LA10_0=='-') ) {\r
+                alt10=1;\r
+            }\r
+            switch (alt10) {\r
+                case 1 :\r
+                    // XPath.g:\r
+                    {\r
+                    if ( input.LA(1)=='+'||input.LA(1)=='-' ) {\r
+                        input.consume();\r
+\r
+                    }\r
+                    else {\r
+                        MismatchedSetException mse = new MismatchedSetException(null,input);\r
+                        recover(mse);\r
+                        throw mse;}\r
+\r
+\r
+                    }\r
+                    break;\r
+\r
+            }\r
+\r
+            // XPath.g:131:40: ( Digit )+\r
+            int cnt11=0;\r
+            loop11:\r
+            do {\r
+                int alt11=2;\r
+                int LA11_0 = input.LA(1);\r
+\r
+                if ( ((LA11_0>='0' && LA11_0<='9')) ) {\r
+                    alt11=1;\r
+                }\r
+\r
+\r
+                switch (alt11) {\r
+               case 1 :\r
+                   // XPath.g:131:40: Digit\r
+                   {\r
+                   mDigit(); \r
+\r
+                   }\r
+                   break;\r
+\r
+               default :\r
+                   if ( cnt11 >= 1 ) break loop11;\r
+                        EarlyExitException eee =\r
+                            new EarlyExitException(11, input);\r
+                        throw eee;\r
+                }\r
+                cnt11++;\r
+            } while (true);\r
+\r
+\r
+            }\r
+\r
+        }\r
+        finally {\r
+        }\r
+    }\r
+    // $ANTLR end "Exp"\r
+\r
+    // $ANTLR start "Double"\r
+    public final void mDouble() throws RecognitionException {\r
+        try {\r
+            int _type = Double;\r
+            int _channel = DEFAULT_TOKEN_CHANNEL;\r
+            // XPath.g:132:7: ( Integer ( Frac ( Exp )? | Exp ) )\r
+            // XPath.g:132:9: Integer ( Frac ( Exp )? | Exp )\r
+            {\r
+            mInteger(); \r
+            // XPath.g:132:17: ( Frac ( Exp )? | Exp )\r
+            int alt13=2;\r
+            int LA13_0 = input.LA(1);\r
+\r
+            if ( (LA13_0=='.') ) {\r
+                alt13=1;\r
+            }\r
+            else if ( (LA13_0=='E'||LA13_0=='e') ) {\r
+                alt13=2;\r
+            }\r
+            else {\r
+                NoViableAltException nvae =\r
+                    new NoViableAltException("", 13, 0, input);\r
+\r
+                throw nvae;\r
+            }\r
+            switch (alt13) {\r
+                case 1 :\r
+                    // XPath.g:132:18: Frac ( Exp )?\r
+                    {\r
+                    mFrac(); \r
+                    // XPath.g:132:23: ( Exp )?\r
+                    int alt12=2;\r
+                    int LA12_0 = input.LA(1);\r
+\r
+                    if ( (LA12_0=='E'||LA12_0=='e') ) {\r
+                        alt12=1;\r
+                    }\r
+                    switch (alt12) {\r
+                        case 1 :\r
+                            // XPath.g:132:23: Exp\r
+                            {\r
+                            mExp(); \r
+\r
+                            }\r
+                            break;\r
+\r
+                    }\r
+\r
+\r
+                    }\r
+                    break;\r
+                case 2 :\r
+                    // XPath.g:132:30: Exp\r
+                    {\r
+                    mExp(); \r
+\r
+                    }\r
+                    break;\r
+\r
+            }\r
+\r
+\r
+            }\r
+\r
+            state.type = _type;\r
+            state.channel = _channel;\r
+        }\r
+        finally {\r
+        }\r
+    }\r
+    // $ANTLR end "Double"\r
+\r
+    // $ANTLR start "Comma"\r
+    public final void mComma() throws RecognitionException {\r
+        try {\r
+            int _type = Comma;\r
+            int _channel = DEFAULT_TOKEN_CHANNEL;\r
+            // XPath.g:136:6: ( ',' )\r
+            // XPath.g:136:8: ','\r
+            {\r
+            match(','); \r
+\r
+            }\r
+\r
+            state.type = _type;\r
+            state.channel = _channel;\r
+        }\r
+        finally {\r
+        }\r
+    }\r
+    // $ANTLR end "Comma"\r
+\r
+    // $ANTLR start "Colon"\r
+    public final void mColon() throws RecognitionException {\r
+        try {\r
+            int _type = Colon;\r
+            int _channel = DEFAULT_TOKEN_CHANNEL;\r
+            // XPath.g:137:6: ( ':' )\r
+            // XPath.g:137:8: ':'\r
+            {\r
+            match(':'); \r
+\r
+            }\r
+\r
+            state.type = _type;\r
+            state.channel = _channel;\r
+        }\r
+        finally {\r
+        }\r
+    }\r
+    // $ANTLR end "Colon"\r
+\r
+    // $ANTLR start "UnsafeUnicodeChar"\r
+    public final void mUnsafeUnicodeChar() throws RecognitionException {\r
+        try {\r
+            // XPath.g:142:18: ( '(' | ')' | '[' | ']' | '{' | '}' | ',' | ':' | '#' | '<' | '>' | '|' | '*' | '\\'' | '\"' | '@' | '%' | '\\\\' | '.' | '-' )\r
+            // XPath.g:\r
+            {\r
+            if ( (input.LA(1)>='\"' && input.LA(1)<='#')||input.LA(1)=='%'||(input.LA(1)>='\'' && input.LA(1)<='*')||(input.LA(1)>=',' && input.LA(1)<='.')||input.LA(1)==':'||input.LA(1)=='<'||input.LA(1)=='>'||input.LA(1)=='@'||(input.LA(1)>='[' && input.LA(1)<=']')||(input.LA(1)>='{' && input.LA(1)<='}') ) {\r
+                input.consume();\r
+\r
+            }\r
+            else {\r
+                MismatchedSetException mse = new MismatchedSetException(null,input);\r
+                recover(mse);\r
+                throw mse;}\r
+\r
+\r
+            }\r
+\r
+        }\r
+        finally {\r
+        }\r
+    }\r
+    // $ANTLR end "UnsafeUnicodeChar"\r
+\r
+    // $ANTLR start "SafeFirstLetter"\r
+    public final void mSafeFirstLetter() throws RecognitionException {\r
+        try {\r
+            // XPath.g:144:25: ( 'A' .. 'Z' | 'a' .. 'z' )\r
+            // XPath.g:\r
+            {\r
+            if ( (input.LA(1)>='A' && input.LA(1)<='Z')||(input.LA(1)>='a' && input.LA(1)<='z') ) {\r
+                input.consume();\r
+\r
+            }\r
+            else {\r
+                MismatchedSetException mse = new MismatchedSetException(null,input);\r
+                recover(mse);\r
+                throw mse;}\r
+\r
+\r
+            }\r
+\r
+        }\r
+        finally {\r
+        }\r
+    }\r
+    // $ANTLR end "SafeFirstLetter"\r
+\r
+    // $ANTLR start "SafeLetter"\r
+    public final void mSafeLetter() throws RecognitionException {\r
+        try {\r
+            // XPath.g:145:20: ( SafeFirstLetter | '0' .. '9' | '-' | '_' )\r
+            // XPath.g:\r
+            {\r
+            if ( input.LA(1)=='-'||(input.LA(1)>='0' && input.LA(1)<='9')||(input.LA(1)>='A' && input.LA(1)<='Z')||input.LA(1)=='_'||(input.LA(1)>='a' && input.LA(1)<='z') ) {\r
+                input.consume();\r
+\r
+            }\r
+            else {\r
+                MismatchedSetException mse = new MismatchedSetException(null,input);\r
+                recover(mse);\r
+                throw mse;}\r
+\r
+\r
+            }\r
+\r
+        }\r
+        finally {\r
+        }\r
+    }\r
+    // $ANTLR end "SafeLetter"\r
+\r
+    // $ANTLR start "QNameChar"\r
+    public final void mQNameChar() throws RecognitionException {\r
+        try {\r
+            // XPath.g:147:19: (~ ( LineBreakChar | UnsafeUnicodeChar | WhiteSpace | '/' | '//' ) )\r
+            // XPath.g:147:21: ~ ( LineBreakChar | UnsafeUnicodeChar | WhiteSpace | '/' | '//' )\r
+            {\r
+            if ( (input.LA(1)>='\u0000' && input.LA(1)<='\b')||(input.LA(1)>='\u000B' && input.LA(1)<='\f')||(input.LA(1)>='\u000E' && input.LA(1)<='\u001F')||input.LA(1)=='!'||input.LA(1)=='$'||input.LA(1)=='&'||input.LA(1)=='+'||(input.LA(1)>='0' && input.LA(1)<='9')||input.LA(1)==';'||input.LA(1)=='='||input.LA(1)=='?'||(input.LA(1)>='A' && input.LA(1)<='Z')||(input.LA(1)>='^' && input.LA(1)<='z')||(input.LA(1)>='~' && input.LA(1)<='\uFFFF') ) {\r
+                input.consume();\r
+\r
+            }\r
+            else {\r
+                MismatchedSetException mse = new MismatchedSetException(null,input);\r
+                recover(mse);\r
+                throw mse;}\r
+\r
+\r
+            }\r
+\r
+        }\r
+        finally {\r
+        }\r
+    }\r
+    // $ANTLR end "QNameChar"\r
+\r
+    // $ANTLR start "QName"\r
+    public final void mQName() throws RecognitionException {\r
+        try {\r
+            int _type = QName;\r
+            int _channel = DEFAULT_TOKEN_CHANNEL;\r
+            // XPath.g:148:6: ( ( QNameChar )+ ( '.' ( QNameChar )+ )* )\r
+            // XPath.g:148:8: ( QNameChar )+ ( '.' ( QNameChar )+ )*\r
+            {\r
+            // XPath.g:148:8: ( QNameChar )+\r
+            int cnt14=0;\r
+            loop14:\r
+            do {\r
+                int alt14=2;\r
+                int LA14_0 = input.LA(1);\r
+\r
+                if ( ((LA14_0>='\u0000' && LA14_0<='\b')||(LA14_0>='\u000B' && LA14_0<='\f')||(LA14_0>='\u000E' && LA14_0<='\u001F')||LA14_0=='!'||LA14_0=='$'||LA14_0=='&'||LA14_0=='+'||(LA14_0>='0' && LA14_0<='9')||LA14_0==';'||LA14_0=='='||LA14_0=='?'||(LA14_0>='A' && LA14_0<='Z')||(LA14_0>='^' && LA14_0<='z')||(LA14_0>='~' && LA14_0<='\uFFFF')) ) {\r
+                    alt14=1;\r
+                }\r
+\r
+\r
+                switch (alt14) {\r
+               case 1 :\r
+                   // XPath.g:148:8: QNameChar\r
+                   {\r
+                   mQNameChar(); \r
+\r
+                   }\r
+                   break;\r
+\r
+               default :\r
+                   if ( cnt14 >= 1 ) break loop14;\r
+                        EarlyExitException eee =\r
+                            new EarlyExitException(14, input);\r
+                        throw eee;\r
+                }\r
+                cnt14++;\r
+            } while (true);\r
+\r
+            // XPath.g:148:19: ( '.' ( QNameChar )+ )*\r
+            loop16:\r
+            do {\r
+                int alt16=2;\r
+                int LA16_0 = input.LA(1);\r
+\r
+                if ( (LA16_0=='.') ) {\r
+                    alt16=1;\r
+                }\r
+\r
+\r
+                switch (alt16) {\r
+               case 1 :\r
+                   // XPath.g:148:20: '.' ( QNameChar )+\r
+                   {\r
+                   match('.'); \r
+                   // XPath.g:148:24: ( QNameChar )+\r
+                   int cnt15=0;\r
+                   loop15:\r
+                   do {\r
+                       int alt15=2;\r
+                       int LA15_0 = input.LA(1);\r
+\r
+                       if ( ((LA15_0>='\u0000' && LA15_0<='\b')||(LA15_0>='\u000B' && LA15_0<='\f')||(LA15_0>='\u000E' && LA15_0<='\u001F')||LA15_0=='!'||LA15_0=='$'||LA15_0=='&'||LA15_0=='+'||(LA15_0>='0' && LA15_0<='9')||LA15_0==';'||LA15_0=='='||LA15_0=='?'||(LA15_0>='A' && LA15_0<='Z')||(LA15_0>='^' && LA15_0<='z')||(LA15_0>='~' && LA15_0<='\uFFFF')) ) {\r
+                           alt15=1;\r
+                       }\r
+\r
+\r
+                       switch (alt15) {\r
+                       case 1 :\r
+                           // XPath.g:148:24: QNameChar\r
+                           {\r
+                           mQNameChar(); \r
+\r
+                           }\r
+                           break;\r
+\r
+                       default :\r
+                           if ( cnt15 >= 1 ) break loop15;\r
+                               EarlyExitException eee =\r
+                                   new EarlyExitException(15, input);\r
+                               throw eee;\r
+                       }\r
+                       cnt15++;\r
+                   } while (true);\r
+\r
+\r
+                   }\r
+                   break;\r
+\r
+               default :\r
+                   break loop16;\r
+                }\r
+            } while (true);\r
+\r
+\r
+            }\r
+\r
+            state.type = _type;\r
+            state.channel = _channel;\r
+        }\r
+        finally {\r
+        }\r
+    }\r
+    // $ANTLR end "QName"\r
+\r
+    // $ANTLR start "WhiteSpace"\r
+    public final void mWhiteSpace() throws RecognitionException {\r
+        try {\r
+            // XPath.g:152:11: ( ' ' | '\\t' )\r
+            // XPath.g:\r
+            {\r
+            if ( input.LA(1)=='\t'||input.LA(1)==' ' ) {\r
+                input.consume();\r
+\r
+            }\r
+            else {\r
+                MismatchedSetException mse = new MismatchedSetException(null,input);\r
+                recover(mse);\r
+                throw mse;}\r
+\r
+\r
+            }\r
+\r
+        }\r
+        finally {\r
+        }\r
+    }\r
+    // $ANTLR end "WhiteSpace"\r
+\r
+    // $ANTLR start "WhiteSpaces"\r
+    public final void mWhiteSpaces() throws RecognitionException {\r
+        try {\r
+            int _type = WhiteSpaces;\r
+            int _channel = DEFAULT_TOKEN_CHANNEL;\r
+            // XPath.g:154:12: ( ( WhiteSpace )+ )\r
+            // XPath.g:154:14: ( WhiteSpace )+\r
+            {\r
+            // XPath.g:154:14: ( WhiteSpace )+\r
+            int cnt17=0;\r
+            loop17:\r
+            do {\r
+                int alt17=2;\r
+                int LA17_0 = input.LA(1);\r
+\r
+                if ( (LA17_0=='\t'||LA17_0==' ') ) {\r
+                    alt17=1;\r
+                }\r
+\r
+\r
+                switch (alt17) {\r
+               case 1 :\r
+                   // XPath.g:154:14: WhiteSpace\r
+                   {\r
+                   mWhiteSpace(); \r
+\r
+                   }\r
+                   break;\r
+\r
+               default :\r
+                   if ( cnt17 >= 1 ) break loop17;\r
+                        EarlyExitException eee =\r
+                            new EarlyExitException(17, input);\r
+                        throw eee;\r
+                }\r
+                cnt17++;\r
+            } while (true);\r
+\r
+             _channel = HIDDEN; \r
+\r
+            }\r
+\r
+            state.type = _type;\r
+            state.channel = _channel;\r
+        }\r
+        finally {\r
+        }\r
+    }\r
+    // $ANTLR end "WhiteSpaces"\r
+\r
+    public void mTokens() throws RecognitionException {\r
+        // XPath.g:1:8: ( T__34 | T__35 | T__36 | T__37 | T__38 | T__39 | T__40 | T__41 | T__42 | T__43 | T__44 | T__45 | T__46 | T__47 | LineComment | LineBreak | String | Integer | Double | Comma | Colon | QName | WhiteSpaces )\r
+        int alt18=23;\r
+        alt18 = dfa18.predict(input);\r
+        switch (alt18) {\r
+            case 1 :\r
+                // XPath.g:1:10: T__34\r
+                {\r
+                mT__34(); \r
+\r
+                }\r
+                break;\r
+            case 2 :\r
+                // XPath.g:1:16: T__35\r
+                {\r
+                mT__35(); \r
+\r
+                }\r
+                break;\r
+            case 3 :\r
+                // XPath.g:1:22: T__36\r
+                {\r
+                mT__36(); \r
+\r
+                }\r
+                break;\r
+            case 4 :\r
+                // XPath.g:1:28: T__37\r
+                {\r
+                mT__37(); \r
+\r
+                }\r
+                break;\r
+            case 5 :\r
+                // XPath.g:1:34: T__38\r
+                {\r
+                mT__38(); \r
+\r
+                }\r
+                break;\r
+            case 6 :\r
+                // XPath.g:1:40: T__39\r
+                {\r
+                mT__39(); \r
+\r
+                }\r
+                break;\r
+            case 7 :\r
+                // XPath.g:1:46: T__40\r
+                {\r
+                mT__40(); \r
+\r
+                }\r
+                break;\r
+            case 8 :\r
+                // XPath.g:1:52: T__41\r
+                {\r
+                mT__41(); \r
+\r
+                }\r
+                break;\r
+            case 9 :\r
+                // XPath.g:1:58: T__42\r
+                {\r
+                mT__42(); \r
+\r
+                }\r
+                break;\r
+            case 10 :\r
+                // XPath.g:1:64: T__43\r
+                {\r
+                mT__43(); \r
+\r
+                }\r
+                break;\r
+            case 11 :\r
+                // XPath.g:1:70: T__44\r
+                {\r
+                mT__44(); \r
+\r
+                }\r
+                break;\r
+            case 12 :\r
+                // XPath.g:1:76: T__45\r
+                {\r
+                mT__45(); \r
+\r
+                }\r
+                break;\r
+            case 13 :\r
+                // XPath.g:1:82: T__46\r
+                {\r
+                mT__46(); \r
+\r
+                }\r
+                break;\r
+            case 14 :\r
+                // XPath.g:1:88: T__47\r
+                {\r
+                mT__47(); \r
+\r
+                }\r
+                break;\r
+            case 15 :\r
+                // XPath.g:1:94: LineComment\r
+                {\r
+                mLineComment(); \r
+\r
+                }\r
+                break;\r
+            case 16 :\r
+                // XPath.g:1:106: LineBreak\r
+                {\r
+                mLineBreak(); \r
+\r
+                }\r
+                break;\r
+            case 17 :\r
+                // XPath.g:1:116: String\r
+                {\r
+                mString(); \r
+\r
+                }\r
+                break;\r
+            case 18 :\r
+                // XPath.g:1:123: Integer\r
+                {\r
+                mInteger(); \r
+\r
+                }\r
+                break;\r
+            case 19 :\r
+                // XPath.g:1:131: Double\r
+                {\r
+                mDouble(); \r
+\r
+                }\r
+                break;\r
+            case 20 :\r
+                // XPath.g:1:138: Comma\r
+                {\r
+                mComma(); \r
+\r
+                }\r
+                break;\r
+            case 21 :\r
+                // XPath.g:1:144: Colon\r
+                {\r
+                mColon(); \r
+\r
+                }\r
+                break;\r
+            case 22 :\r
+                // XPath.g:1:150: QName\r
+                {\r
+                mQName(); \r
+\r
+                }\r
+                break;\r
+            case 23 :\r
+                // XPath.g:1:156: WhiteSpaces\r
+                {\r
+                mWhiteSpaces(); \r
+\r
+                }\r
+                break;\r
+\r
+        }\r
+\r
+    }\r
+\r
+\r
+    protected DFA18 dfa18 = new DFA18(this);\r
+    static final String DFA18_eotS =\r
+        "\1\uffff\1\27\3\uffff\1\30\1\24\1\33\1\35\1\24\6\uffff\2\41\7\uffff"+\r
+        "\1\45\4\uffff\1\46\2\41\2\uffff\1\24\1\41\3\uffff\1\41\1\47\1\24"+\r
+        "\1\47\2\24\1\47";\r
+    static final String DFA18_eofS =\r
+        "\57\uffff";\r
+    static final String DFA18_minS =\r
+        "\1\0\1\57\3\uffff\1\0\4\75\5\uffff\1\60\2\0\7\uffff\1\0\4\uffff"+\r
+        "\1\0\2\56\1\uffff\1\0\1\53\1\0\3\uffff\1\56\1\0\1\60\1\0\1\53\1"+\r
+        "\60\1\0";\r
+    static final String DFA18_maxS =\r
+        "\1\uffff\1\57\3\uffff\1\uffff\4\75\5\uffff\1\71\2\uffff\7\uffff"+\r
+        "\1\uffff\4\uffff\1\uffff\2\145\1\uffff\1\uffff\1\71\1\uffff\3\uffff"+\r
+        "\1\145\1\uffff\1\71\1\uffff\2\71\1\uffff";\r
+    static final String DFA18_acceptS =\r
+        "\2\uffff\1\3\1\4\1\5\5\uffff\1\15\1\16\1\17\1\20\1\21\3\uffff\1"+\r
+        "\24\1\25\1\26\1\27\1\2\1\1\1\6\1\uffff\1\11\1\10\1\13\1\12\3\uffff"+\r
+        "\1\22\3\uffff\1\7\1\14\1\23\7\uffff";\r
+    static final String DFA18_specialS =\r
+        "\1\3\4\uffff\1\10\12\uffff\1\7\1\2\7\uffff\1\0\4\uffff\1\12\3\uffff"+\r
+        "\1\5\1\uffff\1\1\4\uffff\1\11\1\uffff\1\4\2\uffff\1\6}>";\r
+    static final String[] DFA18_transitionS = {\r
+            "\11\24\1\25\1\15\2\24\1\15\22\24\1\25\1\6\1\16\1\14\1\24\1"+\r
+            "\uffff\1\24\1\uffff\1\12\1\13\1\uffff\1\24\1\22\1\17\1\uffff"+\r
+            "\1\1\1\20\11\21\1\23\1\24\1\10\1\5\1\7\1\24\1\2\32\24\1\3\1"+\r
+            "\uffff\1\4\35\24\3\uffff\1\11\uff81\24",\r
+            "\1\26",\r
+            "",\r
+            "",\r
+            "",\r
+            "\11\24\2\uffff\2\24\1\uffff\22\24\1\uffff\1\24\2\uffff\1\24"+\r
+            "\1\uffff\1\24\4\uffff\1\24\2\uffff\1\24\1\uffff\12\24\1\uffff"+\r
+            "\1\24\1\uffff\1\24\1\uffff\1\24\1\uffff\32\24\3\uffff\35\24"+\r
+            "\3\uffff\uff82\24",\r
+            "\1\31",\r
+            "\1\32",\r
+            "\1\34",\r
+            "\1\36",\r
+            "",\r
+            "",\r
+            "",\r
+            "",\r
+            "",\r
+            "\1\37\11\40",\r
+            "\11\24\2\uffff\2\24\1\uffff\22\24\1\uffff\1\24\2\uffff\1\24"+\r
+            "\1\uffff\1\24\4\uffff\1\24\2\uffff\1\42\1\uffff\12\24\1\uffff"+\r
+            "\1\24\1\uffff\1\24\1\uffff\1\24\1\uffff\4\24\1\43\25\24\3\uffff"+\r
+            "\7\24\1\43\25\24\3\uffff\uff82\24",\r
+            "\11\24\2\uffff\2\24\1\uffff\22\24\1\uffff\1\24\2\uffff\1\24"+\r
+            "\1\uffff\1\24\4\uffff\1\24\2\uffff\1\42\1\uffff\12\44\1\uffff"+\r
+            "\1\24\1\uffff\1\24\1\uffff\1\24\1\uffff\4\24\1\43\25\24\3\uffff"+\r
+            "\7\24\1\43\25\24\3\uffff\uff82\24",\r
+            "",\r
+            "",\r
+            "",\r
+            "",\r
+            "",\r
+            "",\r
+            "",\r
+            "\11\24\2\uffff\2\24\1\uffff\22\24\1\uffff\1\24\2\uffff\1\24"+\r
+            "\1\uffff\1\24\4\uffff\1\24\2\uffff\1\24\1\uffff\12\24\1\uffff"+\r
+            "\1\24\1\uffff\1\24\1\uffff\1\24\1\uffff\32\24\3\uffff\35\24"+\r
+            "\3\uffff\uff82\24",\r
+            "",\r
+            "",\r
+            "",\r
+            "",\r
+            "\11\24\2\uffff\2\24\1\uffff\22\24\1\uffff\1\24\2\uffff\1\24"+\r
+            "\1\uffff\1\24\4\uffff\1\24\2\uffff\1\24\1\uffff\12\24\1\uffff"+\r
+            "\1\24\1\uffff\1\24\1\uffff\1\24\1\uffff\32\24\3\uffff\35\24"+\r
+            "\3\uffff\uff82\24",\r
+            "\1\47\26\uffff\1\47\37\uffff\1\47",\r
+            "\1\47\1\uffff\12\50\13\uffff\1\47\37\uffff\1\47",\r
+            "",\r
+            "\11\24\2\uffff\2\24\1\uffff\22\24\1\uffff\1\24\2\uffff\1\24"+\r
+            "\1\uffff\1\24\4\uffff\1\24\4\uffff\12\51\1\uffff\1\24\1\uffff"+\r
+            "\1\24\1\uffff\1\24\1\uffff\32\24\3\uffff\35\24\3\uffff\uff82"+\r
+            "\24",\r
+            "\1\52\1\uffff\1\47\2\uffff\12\53",\r
+            "\11\24\2\uffff\2\24\1\uffff\22\24\1\uffff\1\24\2\uffff\1\24"+\r
+            "\1\uffff\1\24\4\uffff\1\24\2\uffff\1\42\1\uffff\12\44\1\uffff"+\r
+            "\1\24\1\uffff\1\24\1\uffff\1\24\1\uffff\4\24\1\43\25\24\3\uffff"+\r
+            "\7\24\1\43\25\24\3\uffff\uff82\24",\r
+            "",\r
+            "",\r
+            "",\r
+            "\1\47\1\uffff\12\50\13\uffff\1\47\37\uffff\1\47",\r
+            "\11\24\2\uffff\2\24\1\uffff\22\24\1\uffff\1\24\2\uffff\1\24"+\r
+            "\1\uffff\1\24\4\uffff\1\24\2\uffff\1\24\1\uffff\12\51\1\uffff"+\r
+            "\1\24\1\uffff\1\24\1\uffff\1\24\1\uffff\4\24\1\54\25\24\3\uffff"+\r
+            "\7\24\1\54\25\24\3\uffff\uff82\24",\r
+            "\12\53",\r
+            "\11\24\2\uffff\2\24\1\uffff\22\24\1\uffff\1\24\2\uffff\1\24"+\r
+            "\1\uffff\1\24\4\uffff\1\24\2\uffff\1\24\1\uffff\12\53\1\uffff"+\r
+            "\1\24\1\uffff\1\24\1\uffff\1\24\1\uffff\32\24\3\uffff\35\24"+\r
+            "\3\uffff\uff82\24",\r
+            "\1\55\1\uffff\1\47\2\uffff\12\56",\r
+            "\12\56",\r
+            "\11\24\2\uffff\2\24\1\uffff\22\24\1\uffff\1\24\2\uffff\1\24"+\r
+            "\1\uffff\1\24\4\uffff\1\24\2\uffff\1\24\1\uffff\12\56\1\uffff"+\r
+            "\1\24\1\uffff\1\24\1\uffff\1\24\1\uffff\32\24\3\uffff\35\24"+\r
+            "\3\uffff\uff82\24"\r
+    };\r
+\r
+    static final short[] DFA18_eot = DFA.unpackEncodedString(DFA18_eotS);\r
+    static final short[] DFA18_eof = DFA.unpackEncodedString(DFA18_eofS);\r
+    static final char[] DFA18_min = DFA.unpackEncodedStringToUnsignedChars(DFA18_minS);\r
+    static final char[] DFA18_max = DFA.unpackEncodedStringToUnsignedChars(DFA18_maxS);\r
+    static final short[] DFA18_accept = DFA.unpackEncodedString(DFA18_acceptS);\r
+    static final short[] DFA18_special = DFA.unpackEncodedString(DFA18_specialS);\r
+    static final short[][] DFA18_transition;\r
+\r
+    static {\r
+        int numStates = DFA18_transitionS.length;\r
+        DFA18_transition = new short[numStates][];\r
+        for (int i=0; i<numStates; i++) {\r
+            DFA18_transition[i] = DFA.unpackEncodedString(DFA18_transitionS[i]);\r
+        }\r
+    }\r
+\r
+    class DFA18 extends DFA {\r
+\r
+        public DFA18(BaseRecognizer recognizer) {\r
+            this.recognizer = recognizer;\r
+            this.decisionNumber = 18;\r
+            this.eot = DFA18_eot;\r
+            this.eof = DFA18_eof;\r
+            this.min = DFA18_min;\r
+            this.max = DFA18_max;\r
+            this.accept = DFA18_accept;\r
+            this.special = DFA18_special;\r
+            this.transition = DFA18_transition;\r
+        }\r
+        public String getDescription() {\r
+            return "1:1: Tokens : ( T__34 | T__35 | T__36 | T__37 | T__38 | T__39 | T__40 | T__41 | T__42 | T__43 | T__44 | T__45 | T__46 | T__47 | LineComment | LineBreak | String | Integer | Double | Comma | Colon | QName | WhiteSpaces );";\r
+        }\r
+        public int specialStateTransition(int s, IntStream _input) throws NoViableAltException {\r
+            IntStream input = _input;\r
+               int _s = s;\r
+            switch ( s ) {\r
+                    case 0 : \r
+                        int LA18_25 = input.LA(1);\r
+\r
+                        s = -1;\r
+                        if ( ((LA18_25>='\u0000' && LA18_25<='\b')||(LA18_25>='\u000B' && LA18_25<='\f')||(LA18_25>='\u000E' && LA18_25<='\u001F')||LA18_25=='!'||LA18_25=='$'||LA18_25=='&'||LA18_25=='+'||LA18_25=='.'||(LA18_25>='0' && LA18_25<='9')||LA18_25==';'||LA18_25=='='||LA18_25=='?'||(LA18_25>='A' && LA18_25<='Z')||(LA18_25>='^' && LA18_25<='z')||(LA18_25>='~' && LA18_25<='\uFFFF')) ) {s = 20;}\r
+\r
+                        else s = 37;\r
+\r
+                        if ( s>=0 ) return s;\r
+                        break;\r
+                    case 1 : \r
+                        int LA18_36 = input.LA(1);\r
+\r
+                        s = -1;\r
+                        if ( ((LA18_36>='0' && LA18_36<='9')) ) {s = 36;}\r
+\r
+                        else if ( (LA18_36=='.') ) {s = 34;}\r
+\r
+                        else if ( (LA18_36=='E'||LA18_36=='e') ) {s = 35;}\r
+\r
+                        else if ( ((LA18_36>='\u0000' && LA18_36<='\b')||(LA18_36>='\u000B' && LA18_36<='\f')||(LA18_36>='\u000E' && LA18_36<='\u001F')||LA18_36=='!'||LA18_36=='$'||LA18_36=='&'||LA18_36=='+'||LA18_36==';'||LA18_36=='='||LA18_36=='?'||(LA18_36>='A' && LA18_36<='D')||(LA18_36>='F' && LA18_36<='Z')||(LA18_36>='^' && LA18_36<='d')||(LA18_36>='f' && LA18_36<='z')||(LA18_36>='~' && LA18_36<='\uFFFF')) ) {s = 20;}\r
+\r
+                        else s = 33;\r
+\r
+                        if ( s>=0 ) return s;\r
+                        break;\r
+                    case 2 : \r
+                        int LA18_17 = input.LA(1);\r
+\r
+                        s = -1;\r
+                        if ( (LA18_17=='.') ) {s = 34;}\r
+\r
+                        else if ( ((LA18_17>='0' && LA18_17<='9')) ) {s = 36;}\r
+\r
+                        else if ( (LA18_17=='E'||LA18_17=='e') ) {s = 35;}\r
+\r
+                        else if ( ((LA18_17>='\u0000' && LA18_17<='\b')||(LA18_17>='\u000B' && LA18_17<='\f')||(LA18_17>='\u000E' && LA18_17<='\u001F')||LA18_17=='!'||LA18_17=='$'||LA18_17=='&'||LA18_17=='+'||LA18_17==';'||LA18_17=='='||LA18_17=='?'||(LA18_17>='A' && LA18_17<='D')||(LA18_17>='F' && LA18_17<='Z')||(LA18_17>='^' && LA18_17<='d')||(LA18_17>='f' && LA18_17<='z')||(LA18_17>='~' && LA18_17<='\uFFFF')) ) {s = 20;}\r
+\r
+                        else s = 33;\r
+\r
+                        if ( s>=0 ) return s;\r
+                        break;\r
+                    case 3 : \r
+                        int LA18_0 = input.LA(1);\r
+\r
+                        s = -1;\r
+                        if ( (LA18_0=='/') ) {s = 1;}\r
+\r
+                        else if ( (LA18_0=='@') ) {s = 2;}\r
+\r
+                        else if ( (LA18_0=='[') ) {s = 3;}\r
+\r
+                        else if ( (LA18_0==']') ) {s = 4;}\r
+\r
+                        else if ( (LA18_0=='=') ) {s = 5;}\r
+\r
+                        else if ( (LA18_0=='!') ) {s = 6;}\r
+\r
+                        else if ( (LA18_0=='>') ) {s = 7;}\r
+\r
+                        else if ( (LA18_0=='<') ) {s = 8;}\r
+\r
+                        else if ( (LA18_0=='~') ) {s = 9;}\r
+\r
+                        else if ( (LA18_0=='(') ) {s = 10;}\r
+\r
+                        else if ( (LA18_0==')') ) {s = 11;}\r
+\r
+                        else if ( (LA18_0=='#') ) {s = 12;}\r
+\r
+                        else if ( (LA18_0=='\n'||LA18_0=='\r') ) {s = 13;}\r
+\r
+                        else if ( (LA18_0=='\"') ) {s = 14;}\r
+\r
+                        else if ( (LA18_0=='-') ) {s = 15;}\r
+\r
+                        else if ( (LA18_0=='0') ) {s = 16;}\r
+\r
+                        else if ( ((LA18_0>='1' && LA18_0<='9')) ) {s = 17;}\r
+\r
+                        else if ( (LA18_0==',') ) {s = 18;}\r
+\r
+                        else if ( (LA18_0==':') ) {s = 19;}\r
+\r
+                        else if ( ((LA18_0>='\u0000' && LA18_0<='\b')||(LA18_0>='\u000B' && LA18_0<='\f')||(LA18_0>='\u000E' && LA18_0<='\u001F')||LA18_0=='$'||LA18_0=='&'||LA18_0=='+'||LA18_0==';'||LA18_0=='?'||(LA18_0>='A' && LA18_0<='Z')||(LA18_0>='^' && LA18_0<='z')||(LA18_0>='\u007F' && LA18_0<='\uFFFF')) ) {s = 20;}\r
+\r
+                        else if ( (LA18_0=='\t'||LA18_0==' ') ) {s = 21;}\r
+\r
+                        if ( s>=0 ) return s;\r
+                        break;\r
+                    case 4 : \r
+                        int LA18_43 = input.LA(1);\r
+\r
+                        s = -1;\r
+                        if ( ((LA18_43>='\u0000' && LA18_43<='\b')||(LA18_43>='\u000B' && LA18_43<='\f')||(LA18_43>='\u000E' && LA18_43<='\u001F')||LA18_43=='!'||LA18_43=='$'||LA18_43=='&'||LA18_43=='+'||LA18_43=='.'||LA18_43==';'||LA18_43=='='||LA18_43=='?'||(LA18_43>='A' && LA18_43<='Z')||(LA18_43>='^' && LA18_43<='z')||(LA18_43>='~' && LA18_43<='\uFFFF')) ) {s = 20;}\r
+\r
+                        else if ( ((LA18_43>='0' && LA18_43<='9')) ) {s = 43;}\r
+\r
+                        else s = 39;\r
+\r
+                        if ( s>=0 ) return s;\r
+                        break;\r
+                    case 5 : \r
+                        int LA18_34 = input.LA(1);\r
+\r
+                        s = -1;\r
+                        if ( ((LA18_34>='0' && LA18_34<='9')) ) {s = 41;}\r
+\r
+                        else if ( ((LA18_34>='\u0000' && LA18_34<='\b')||(LA18_34>='\u000B' && LA18_34<='\f')||(LA18_34>='\u000E' && LA18_34<='\u001F')||LA18_34=='!'||LA18_34=='$'||LA18_34=='&'||LA18_34=='+'||LA18_34==';'||LA18_34=='='||LA18_34=='?'||(LA18_34>='A' && LA18_34<='Z')||(LA18_34>='^' && LA18_34<='z')||(LA18_34>='~' && LA18_34<='\uFFFF')) ) {s = 20;}\r
+\r
+                        if ( s>=0 ) return s;\r
+                        break;\r
+                    case 6 : \r
+                        int LA18_46 = input.LA(1);\r
+\r
+                        s = -1;\r
+                        if ( ((LA18_46>='\u0000' && LA18_46<='\b')||(LA18_46>='\u000B' && LA18_46<='\f')||(LA18_46>='\u000E' && LA18_46<='\u001F')||LA18_46=='!'||LA18_46=='$'||LA18_46=='&'||LA18_46=='+'||LA18_46=='.'||LA18_46==';'||LA18_46=='='||LA18_46=='?'||(LA18_46>='A' && LA18_46<='Z')||(LA18_46>='^' && LA18_46<='z')||(LA18_46>='~' && LA18_46<='\uFFFF')) ) {s = 20;}\r
+\r
+                        else if ( ((LA18_46>='0' && LA18_46<='9')) ) {s = 46;}\r
+\r
+                        else s = 39;\r
+\r
+                        if ( s>=0 ) return s;\r
+                        break;\r
+                    case 7 : \r
+                        int LA18_16 = input.LA(1);\r
+\r
+                        s = -1;\r
+                        if ( (LA18_16=='.') ) {s = 34;}\r
+\r
+                        else if ( (LA18_16=='E'||LA18_16=='e') ) {s = 35;}\r
+\r
+                        else if ( ((LA18_16>='\u0000' && LA18_16<='\b')||(LA18_16>='\u000B' && LA18_16<='\f')||(LA18_16>='\u000E' && LA18_16<='\u001F')||LA18_16=='!'||LA18_16=='$'||LA18_16=='&'||LA18_16=='+'||(LA18_16>='0' && LA18_16<='9')||LA18_16==';'||LA18_16=='='||LA18_16=='?'||(LA18_16>='A' && LA18_16<='D')||(LA18_16>='F' && LA18_16<='Z')||(LA18_16>='^' && LA18_16<='d')||(LA18_16>='f' && LA18_16<='z')||(LA18_16>='~' && LA18_16<='\uFFFF')) ) {s = 20;}\r
+\r
+                        else s = 33;\r
+\r
+                        if ( s>=0 ) return s;\r
+                        break;\r
+                    case 8 : \r
+                        int LA18_5 = input.LA(1);\r
+\r
+                        s = -1;\r
+                        if ( ((LA18_5>='\u0000' && LA18_5<='\b')||(LA18_5>='\u000B' && LA18_5<='\f')||(LA18_5>='\u000E' && LA18_5<='\u001F')||LA18_5=='!'||LA18_5=='$'||LA18_5=='&'||LA18_5=='+'||LA18_5=='.'||(LA18_5>='0' && LA18_5<='9')||LA18_5==';'||LA18_5=='='||LA18_5=='?'||(LA18_5>='A' && LA18_5<='Z')||(LA18_5>='^' && LA18_5<='z')||(LA18_5>='~' && LA18_5<='\uFFFF')) ) {s = 20;}\r
+\r
+                        else s = 24;\r
+\r
+                        if ( s>=0 ) return s;\r
+                        break;\r
+                    case 9 : \r
+                        int LA18_41 = input.LA(1);\r
+\r
+                        s = -1;\r
+                        if ( ((LA18_41>='\u0000' && LA18_41<='\b')||(LA18_41>='\u000B' && LA18_41<='\f')||(LA18_41>='\u000E' && LA18_41<='\u001F')||LA18_41=='!'||LA18_41=='$'||LA18_41=='&'||LA18_41=='+'||LA18_41=='.'||LA18_41==';'||LA18_41=='='||LA18_41=='?'||(LA18_41>='A' && LA18_41<='D')||(LA18_41>='F' && LA18_41<='Z')||(LA18_41>='^' && LA18_41<='d')||(LA18_41>='f' && LA18_41<='z')||(LA18_41>='~' && LA18_41<='\uFFFF')) ) {s = 20;}\r
+\r
+                        else if ( (LA18_41=='E'||LA18_41=='e') ) {s = 44;}\r
+\r
+                        else if ( ((LA18_41>='0' && LA18_41<='9')) ) {s = 41;}\r
+\r
+                        else s = 39;\r
+\r
+                        if ( s>=0 ) return s;\r
+                        break;\r
+                    case 10 : \r
+                        int LA18_30 = input.LA(1);\r
+\r
+                        s = -1;\r
+                        if ( ((LA18_30>='\u0000' && LA18_30<='\b')||(LA18_30>='\u000B' && LA18_30<='\f')||(LA18_30>='\u000E' && LA18_30<='\u001F')||LA18_30=='!'||LA18_30=='$'||LA18_30=='&'||LA18_30=='+'||LA18_30=='.'||(LA18_30>='0' && LA18_30<='9')||LA18_30==';'||LA18_30=='='||LA18_30=='?'||(LA18_30>='A' && LA18_30<='Z')||(LA18_30>='^' && LA18_30<='z')||(LA18_30>='~' && LA18_30<='\uFFFF')) ) {s = 20;}\r
+\r
+                        else s = 38;\r
+\r
+                        if ( s>=0 ) return s;\r
+                        break;\r
+            }\r
+            NoViableAltException nvae =\r
+                new NoViableAltException(getDescription(), 18, _s, input);\r
+            error(nvae);\r
+            throw nvae;\r
+        }\r
+    }\r
\r
+\r
+}
\ No newline at end of file
diff --git a/src/main/java/org/xerial/lens/relation/query/impl/XPathParser.java b/src/main/java/org/xerial/lens/relation/query/impl/XPathParser.java
new file mode 100644 (file)
index 0000000..54a3c91
--- /dev/null
@@ -0,0 +1,2216 @@
+// $ANTLR 3.1.3 Mar 17, 2009 19:23:44 XPath.g 2009-09-29 14:52:03\r
+\r
+/*--------------------------------------------------------------------------\r
+ *  Copyright 2009 Taro L. Saito\r
+ *\r
+ *  Licensed under the Apache License, Version 2.0 (the "License");\r
+ *  you may not use this file except in compliance with the License.\r
+ *  You may obtain a copy of the License at\r
+ *\r
+ *     http://www.apache.org/licenses/LICENSE-2.0\r
+ *\r
+ *  Unless required by applicable law or agreed to in writing, software\r
+ *  distributed under the License is distributed on an "AS IS" BASIS,\r
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r
+ *  See the License for the specific language governing permissions and\r
+ *  limitations under the License.\r
+ *--------------------------------------------------------------------------*/\r
+//--------------------------------------\r
+// XerialJ\r
+//\r
+// XPathParser.g\r
+// Since: Aug 6, 2009 08:30:02 AM\r
+//\r
+//--------------------------------------\r
+package org.xerial.lens.relation.query.impl;\r
+\r
+\r
+\r
+\r
+import org.antlr.runtime.*;\r
+import java.util.Stack;\r
+import java.util.List;\r
+import java.util.ArrayList;\r
+import java.util.Map;\r
+import java.util.HashMap;\r
+\r
+import org.antlr.runtime.tree.*;\r
+\r
+public class XPathParser extends Parser {\r
+    public static final String[] tokenNames = new String[] {\r
+        "<invalid>", "<EOR>", "<DOWN>", "<UP>", "XPATH", "NAME", "VALUE", "STEP", "AXIS", "PREDICATE", "LineBreakChar", "LineComment", "LineBreak", "Digit", "Letter", "HexDigit", "UnicodeChar", "EscapeSequence", "StringChar", "StringChar_s", "String", "Integer", "Frac", "Exp", "Double", "Comma", "Colon", "UnsafeUnicodeChar", "SafeFirstLetter", "SafeLetter", "WhiteSpace", "QNameChar", "QName", "WhiteSpaces", "'/'", "'//'", "'@'", "'['", "']'", "'='", "'!='", "'>'", "'>='", "'<'", "'<='", "'~='", "'('", "')'"\r
+    };\r
+    public static final int T__42=42;\r
+    public static final int Digit=13;\r
+    public static final int Frac=22;\r
+    public static final int HexDigit=15;\r
+    public static final int T__47=47;\r
+    public static final int STEP=7;\r
+    public static final int VALUE=6;\r
+    public static final int T__39=39;\r
+    public static final int PREDICATE=9;\r
+    public static final int Letter=14;\r
+    public static final int T__46=46;\r
+    public static final int Comma=25;\r
+    public static final int EscapeSequence=17;\r
+    public static final int XPATH=4;\r
+    public static final int Integer=21;\r
+    public static final int WhiteSpace=30;\r
+    public static final int T__34=34;\r
+    public static final int AXIS=8;\r
+    public static final int LineComment=11;\r
+    public static final int Colon=26;\r
+    public static final int T__35=35;\r
+    public static final int SafeFirstLetter=28;\r
+    public static final int T__36=36;\r
+    public static final int Exp=23;\r
+    public static final int QNameChar=31;\r
+    public static final int T__44=44;\r
+    public static final int UnicodeChar=16;\r
+    public static final int StringChar=18;\r
+    public static final int LineBreak=12;\r
+    public static final int T__45=45;\r
+    public static final int String=20;\r
+    public static final int SafeLetter=29;\r
+    public static final int LineBreakChar=10;\r
+    public static final int T__43=43;\r
+    public static final int QName=32;\r
+    public static final int T__40=40;\r
+    public static final int EOF=-1;\r
+    public static final int T__38=38;\r
+    public static final int T__37=37;\r
+    public static final int StringChar_s=19;\r
+    public static final int UnsafeUnicodeChar=27;\r
+    public static final int Double=24;\r
+    public static final int NAME=5;\r
+    public static final int T__41=41;\r
+    public static final int WhiteSpaces=33;\r
+\r
+    // delegates\r
+    // delegators\r
+\r
+\r
+        public XPathParser(TokenStream input) {\r
+            this(input, new RecognizerSharedState());\r
+        }\r
+        public XPathParser(TokenStream input, RecognizerSharedState state) {\r
+            super(input, state);\r
+             \r
+        }\r
+        \r
+    protected TreeAdaptor adaptor = new CommonTreeAdaptor();\r
+\r
+    public void setTreeAdaptor(TreeAdaptor adaptor) {\r
+        this.adaptor = adaptor;\r
+    }\r
+    public TreeAdaptor getTreeAdaptor() {\r
+        return adaptor;\r
+    }\r
+\r
+    public String[] getTokenNames() { return XPathParser.tokenNames; }\r
+    public String getGrammarFileName() { return "XPath.g"; }\r
+\r
+\r
+\r
+\r
+\r
+    public static class xpath_return extends ParserRuleReturnScope {\r
+        Object tree;\r
+        public Object getTree() { return tree; }\r
+    };\r
+\r
+    // $ANTLR start "xpath"\r
+    // XPath.g:162:1: xpath : locationExpr -> ^( XPATH locationExpr ) ;\r
+    public final XPathParser.xpath_return xpath() throws RecognitionException {\r
+        XPathParser.xpath_return retval = new XPathParser.xpath_return();\r
+        retval.start = input.LT(1);\r
+\r
+        Object root_0 = null;\r
+\r
+        XPathParser.locationExpr_return locationExpr1 = null;\r
+\r
+\r
+        RewriteRuleSubtreeStream stream_locationExpr=new RewriteRuleSubtreeStream(adaptor,"rule locationExpr");\r
+        try {\r
+            // XPath.g:163:3: ( locationExpr -> ^( XPATH locationExpr ) )\r
+            // XPath.g:163:5: locationExpr\r
+            {\r
+            pushFollow(FOLLOW_locationExpr_in_xpath620);\r
+            locationExpr1=locationExpr();\r
+\r
+            state._fsp--;\r
+            if (state.failed) return retval;\r
+            if ( state.backtracking==0 ) stream_locationExpr.add(locationExpr1.getTree());\r
+\r
+\r
+            // AST REWRITE\r
+            // elements: locationExpr\r
+            // token labels: \r
+            // rule labels: retval\r
+            // token list labels: \r
+            // rule list labels: \r
+            // wildcard labels: \r
+            if ( state.backtracking==0 ) {\r
+            retval.tree = root_0;\r
+            RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"rule retval",retval!=null?retval.tree:null);\r
+\r
+            root_0 = (Object)adaptor.nil();\r
+            // 164:3: -> ^( XPATH locationExpr )\r
+            {\r
+                // XPath.g:164:6: ^( XPATH locationExpr )\r
+                {\r
+                Object root_1 = (Object)adaptor.nil();\r
+                root_1 = (Object)adaptor.becomeRoot((Object)adaptor.create(XPATH, "XPATH"), root_1);\r
+\r
+                adaptor.addChild(root_1, stream_locationExpr.nextTree());\r
+\r
+                adaptor.addChild(root_0, root_1);\r
+                }\r
+\r
+            }\r
+\r
+            retval.tree = root_0;}\r
+            }\r
+\r
+            retval.stop = input.LT(-1);\r
+\r
+            if ( state.backtracking==0 ) {\r
+\r
+            retval.tree = (Object)adaptor.rulePostProcessing(root_0);\r
+            adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);\r
+            }\r
+        }\r
+        catch (RecognitionException re) {\r
+            reportError(re);\r
+            recover(input,re);\r
+       retval.tree = (Object)adaptor.errorNode(input, retval.start, input.LT(-1), re);\r
+\r
+        }\r
+        finally {\r
+        }\r
+        return retval;\r
+    }\r
+    // $ANTLR end "xpath"\r
+\r
+    public static class locationExpr_return extends ParserRuleReturnScope {\r
+        Object tree;\r
+        public Object getTree() { return tree; }\r
+    };\r
+\r
+    // $ANTLR start "locationExpr"\r
+    // XPath.g:167:1: fragment locationExpr : ( relativePath | absolutePath );\r
+    public final XPathParser.locationExpr_return locationExpr() throws RecognitionException {\r
+        XPathParser.locationExpr_return retval = new XPathParser.locationExpr_return();\r
+        retval.start = input.LT(1);\r
+\r
+        Object root_0 = null;\r
+\r
+        XPathParser.relativePath_return relativePath2 = null;\r
+\r
+        XPathParser.absolutePath_return absolutePath3 = null;\r
+\r
+\r
+\r
+        try {\r
+            // XPath.g:169:3: ( relativePath | absolutePath )\r
+            int alt1=2;\r
+            int LA1_0 = input.LA(1);\r
+\r
+            if ( (LA1_0==QName||LA1_0==36) ) {\r
+                alt1=1;\r
+            }\r
+            else if ( (LA1_0==34) ) {\r
+                alt1=2;\r
+            }\r
+            else {\r
+                if (state.backtracking>0) {state.failed=true; return retval;}\r
+                NoViableAltException nvae =\r
+                    new NoViableAltException("", 1, 0, input);\r
+\r
+                throw nvae;\r
+            }\r
+            switch (alt1) {\r
+                case 1 :\r
+                    // XPath.g:169:5: relativePath\r
+                    {\r
+                    root_0 = (Object)adaptor.nil();\r
+\r
+                    pushFollow(FOLLOW_relativePath_in_locationExpr646);\r
+                    relativePath2=relativePath();\r
+\r
+                    state._fsp--;\r
+                    if (state.failed) return retval;\r
+                    if ( state.backtracking==0 ) adaptor.addChild(root_0, relativePath2.getTree());\r
+\r
+                    }\r
+                    break;\r
+                case 2 :\r
+                    // XPath.g:170:5: absolutePath\r
+                    {\r
+                    root_0 = (Object)adaptor.nil();\r
+\r
+                    pushFollow(FOLLOW_absolutePath_in_locationExpr652);\r
+                    absolutePath3=absolutePath();\r
+\r
+                    state._fsp--;\r
+                    if (state.failed) return retval;\r
+                    if ( state.backtracking==0 ) adaptor.addChild(root_0, absolutePath3.getTree());\r
+\r
+                    }\r
+                    break;\r
+\r
+            }\r
+            retval.stop = input.LT(-1);\r
+\r
+            if ( state.backtracking==0 ) {\r
+\r
+            retval.tree = (Object)adaptor.rulePostProcessing(root_0);\r
+            adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);\r
+            }\r
+        }\r
+        catch (RecognitionException re) {\r
+            reportError(re);\r
+            recover(input,re);\r
+       retval.tree = (Object)adaptor.errorNode(input, retval.start, input.LT(-1), re);\r
+\r
+        }\r
+        finally {\r
+        }\r
+        return retval;\r
+    }\r
+    // $ANTLR end "locationExpr"\r
+\r
+    public static class relativePath_return extends ParserRuleReturnScope {\r
+        Object tree;\r
+        public Object getTree() { return tree; }\r
+    };\r
+\r
+    // $ANTLR start "relativePath"\r
+    // XPath.g:173:1: fragment relativePath : ( step -> ^( STEP step ) | ( step '/' )=> step '/' relativePath -> ^( STEP AXIS[\"PC\"] step relativePath ) | ( step '//' )=> step '//' relativePath -> ^( STEP AXIS[\"AD\"] step relativePath ) );\r
+    public final XPathParser.relativePath_return relativePath() throws RecognitionException {\r
+        XPathParser.relativePath_return retval = new XPathParser.relativePath_return();\r
+        retval.start = input.LT(1);\r
+\r
+        Object root_0 = null;\r
+\r
+        Token char_literal6=null;\r
+        Token string_literal9=null;\r
+        XPathParser.step_return step4 = null;\r
+\r
+        XPathParser.step_return step5 = null;\r
+\r
+        XPathParser.relativePath_return relativePath7 = null;\r
+\r
+        XPathParser.step_return step8 = null;\r
+\r
+        XPathParser.relativePath_return relativePath10 = null;\r
+\r
+\r
+        Object char_literal6_tree=null;\r
+        Object string_literal9_tree=null;\r
+        RewriteRuleTokenStream stream_35=new RewriteRuleTokenStream(adaptor,"token 35");\r
+        RewriteRuleTokenStream stream_34=new RewriteRuleTokenStream(adaptor,"token 34");\r
+        RewriteRuleSubtreeStream stream_relativePath=new RewriteRuleSubtreeStream(adaptor,"rule relativePath");\r
+        RewriteRuleSubtreeStream stream_step=new RewriteRuleSubtreeStream(adaptor,"rule step");\r
+        try {\r
+            // XPath.g:175:3: ( step -> ^( STEP step ) | ( step '/' )=> step '/' relativePath -> ^( STEP AXIS[\"PC\"] step relativePath ) | ( step '//' )=> step '//' relativePath -> ^( STEP AXIS[\"AD\"] step relativePath ) )\r
+            int alt2=3;\r
+            int LA2_0 = input.LA(1);\r
+\r
+            if ( (LA2_0==36) ) {\r
+                int LA2_1 = input.LA(2);\r
+\r
+                if ( (true) ) {\r
+                    alt2=1;\r
+                }\r
+                else if ( (synpred1_XPath()) ) {\r
+                    alt2=2;\r
+                }\r
+                else if ( (synpred2_XPath()) ) {\r
+                    alt2=3;\r
+                }\r
+                else {\r
+                    if (state.backtracking>0) {state.failed=true; return retval;}\r
+                    NoViableAltException nvae =\r
+                        new NoViableAltException("", 2, 1, input);\r
+\r
+                    throw nvae;\r
+                }\r
+            }\r
+            else if ( (LA2_0==QName) ) {\r
+                int LA2_2 = input.LA(2);\r
+\r
+                if ( (true) ) {\r
+                    alt2=1;\r
+                }\r
+                else if ( (synpred1_XPath()) ) {\r
+                    alt2=2;\r
+                }\r
+                else if ( (synpred2_XPath()) ) {\r
+                    alt2=3;\r
+                }\r
+                else {\r
+                    if (state.backtracking>0) {state.failed=true; return retval;}\r
+                    NoViableAltException nvae =\r
+                        new NoViableAltException("", 2, 2, input);\r
+\r
+                    throw nvae;\r
+                }\r
+            }\r
+            else {\r
+                if (state.backtracking>0) {state.failed=true; return retval;}\r
+                NoViableAltException nvae =\r
+                    new NoViableAltException("", 2, 0, input);\r
+\r
+                throw nvae;\r
+            }\r
+            switch (alt2) {\r
+                case 1 :\r
+                    // XPath.g:175:5: step\r
+                    {\r
+                    pushFollow(FOLLOW_step_in_relativePath669);\r
+                    step4=step();\r
+\r
+                    state._fsp--;\r
+                    if (state.failed) return retval;\r
+                    if ( state.backtracking==0 ) stream_step.add(step4.getTree());\r
+\r
+\r
+                    // AST REWRITE\r
+                    // elements: step\r
+                    // token labels: \r
+                    // rule labels: retval\r
+                    // token list labels: \r
+                    // rule list labels: \r
+                    // wildcard labels: \r
+                    if ( state.backtracking==0 ) {\r
+                    retval.tree = root_0;\r
+                    RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"rule retval",retval!=null?retval.tree:null);\r
+\r
+                    root_0 = (Object)adaptor.nil();\r
+                    // 176:3: -> ^( STEP step )\r
+                    {\r
+                        // XPath.g:176:6: ^( STEP step )\r
+                        {\r
+                        Object root_1 = (Object)adaptor.nil();\r
+                        root_1 = (Object)adaptor.becomeRoot((Object)adaptor.create(STEP, "STEP"), root_1);\r
+\r
+                        adaptor.addChild(root_1, stream_step.nextTree());\r
+\r
+                        adaptor.addChild(root_0, root_1);\r
+                        }\r
+\r
+                    }\r
+\r
+                    retval.tree = root_0;}\r
+                    }\r
+                    break;\r
+                case 2 :\r
+                    // XPath.g:177:5: ( step '/' )=> step '/' relativePath\r
+                    {\r
+                    pushFollow(FOLLOW_step_in_relativePath694);\r
+                    step5=step();\r
+\r
+                    state._fsp--;\r
+                    if (state.failed) return retval;\r
+                    if ( state.backtracking==0 ) stream_step.add(step5.getTree());\r
+                    char_literal6=(Token)match(input,34,FOLLOW_34_in_relativePath696); if (state.failed) return retval; \r
+                    if ( state.backtracking==0 ) stream_34.add(char_literal6);\r
+\r
+                    pushFollow(FOLLOW_relativePath_in_relativePath698);\r
+                    relativePath7=relativePath();\r
+\r
+                    state._fsp--;\r
+                    if (state.failed) return retval;\r
+                    if ( state.backtracking==0 ) stream_relativePath.add(relativePath7.getTree());\r
+\r
+\r
+                    // AST REWRITE\r
+                    // elements: step, relativePath\r
+                    // token labels: \r
+                    // rule labels: retval\r
+                    // token list labels: \r
+                    // rule list labels: \r
+                    // wildcard labels: \r
+                    if ( state.backtracking==0 ) {\r
+                    retval.tree = root_0;\r
+                    RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"rule retval",retval!=null?retval.tree:null);\r
+\r
+                    root_0 = (Object)adaptor.nil();\r
+                    // 178:3: -> ^( STEP AXIS[\"PC\"] step relativePath )\r
+                    {\r
+                        // XPath.g:178:6: ^( STEP AXIS[\"PC\"] step relativePath )\r
+                        {\r
+                        Object root_1 = (Object)adaptor.nil();\r
+                        root_1 = (Object)adaptor.becomeRoot((Object)adaptor.create(STEP, "STEP"), root_1);\r
+\r
+                        adaptor.addChild(root_1, (Object)adaptor.create(AXIS, "PC"));\r
+                        adaptor.addChild(root_1, stream_step.nextTree());\r
+                        adaptor.addChild(root_1, stream_relativePath.nextTree());\r
+\r
+                        adaptor.addChild(root_0, root_1);\r
+                        }\r
+\r
+                    }\r
+\r
+                    retval.tree = root_0;}\r
+                    }\r
+                    break;\r
+                case 3 :\r
+                    // XPath.g:179:5: ( step '//' )=> step '//' relativePath\r
+                    {\r
+                    pushFollow(FOLLOW_step_in_relativePath729);\r
+                    step8=step();\r
+\r
+                    state._fsp--;\r
+                    if (state.failed) return retval;\r
+                    if ( state.backtracking==0 ) stream_step.add(step8.getTree());\r
+                    string_literal9=(Token)match(input,35,FOLLOW_35_in_relativePath731); if (state.failed) return retval; \r
+                    if ( state.backtracking==0 ) stream_35.add(string_literal9);\r
+\r
+                    pushFollow(FOLLOW_relativePath_in_relativePath733);\r
+                    relativePath10=relativePath();\r
+\r
+                    state._fsp--;\r
+                    if (state.failed) return retval;\r
+                    if ( state.backtracking==0 ) stream_relativePath.add(relativePath10.getTree());\r
+\r
+\r
+                    // AST REWRITE\r
+                    // elements: relativePath, step\r
+                    // token labels: \r
+                    // rule labels: retval\r
+                    // token list labels: \r
+                    // rule list labels: \r
+                    // wildcard labels: \r
+                    if ( state.backtracking==0 ) {\r
+                    retval.tree = root_0;\r
+                    RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"rule retval",retval!=null?retval.tree:null);\r
+\r
+                    root_0 = (Object)adaptor.nil();\r
+                    // 180:3: -> ^( STEP AXIS[\"AD\"] step relativePath )\r
+                    {\r
+                        // XPath.g:180:6: ^( STEP AXIS[\"AD\"] step relativePath )\r
+                        {\r
+                        Object root_1 = (Object)adaptor.nil();\r
+                        root_1 = (Object)adaptor.becomeRoot((Object)adaptor.create(STEP, "STEP"), root_1);\r
+\r
+                        adaptor.addChild(root_1, (Object)adaptor.create(AXIS, "AD"));\r
+                        adaptor.addChild(root_1, stream_step.nextTree());\r
+                        adaptor.addChild(root_1, stream_relativePath.nextTree());\r
+\r
+                        adaptor.addChild(root_0, root_1);\r
+                        }\r
+\r
+                    }\r
+\r
+                    retval.tree = root_0;}\r
+                    }\r
+                    break;\r
+\r
+            }\r
+            retval.stop = input.LT(-1);\r
+\r
+            if ( state.backtracking==0 ) {\r
+\r
+            retval.tree = (Object)adaptor.rulePostProcessing(root_0);\r
+            adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);\r
+            }\r
+        }\r
+        catch (RecognitionException re) {\r
+            reportError(re);\r
+            recover(input,re);\r
+       retval.tree = (Object)adaptor.errorNode(input, retval.start, input.LT(-1), re);\r
+\r
+        }\r
+        finally {\r
+        }\r
+        return retval;\r
+    }\r
+    // $ANTLR end "relativePath"\r
+\r
+    public static class absolutePath_return extends ParserRuleReturnScope {\r
+        Object tree;\r
+        public Object getTree() { return tree; }\r
+    };\r
+\r
+    // $ANTLR start "absolutePath"\r
+    // XPath.g:183:1: fragment absolutePath : '/' relativePath -> ^( STEP AXIS[\"PC\"] NAME[\"_root\"] relativePath ) ;\r
+    public final XPathParser.absolutePath_return absolutePath() throws RecognitionException {\r
+        XPathParser.absolutePath_return retval = new XPathParser.absolutePath_return();\r
+        retval.start = input.LT(1);\r
+\r
+        Object root_0 = null;\r
+\r
+        Token char_literal11=null;\r
+        XPathParser.relativePath_return relativePath12 = null;\r
+\r
+\r
+        Object char_literal11_tree=null;\r
+        RewriteRuleTokenStream stream_34=new RewriteRuleTokenStream(adaptor,"token 34");\r
+        RewriteRuleSubtreeStream stream_relativePath=new RewriteRuleSubtreeStream(adaptor,"rule relativePath");\r
+        try {\r
+            // XPath.g:185:3: ( '/' relativePath -> ^( STEP AXIS[\"PC\"] NAME[\"_root\"] relativePath ) )\r
+            // XPath.g:185:5: '/' relativePath\r
+            {\r
+            char_literal11=(Token)match(input,34,FOLLOW_34_in_absolutePath764); if (state.failed) return retval; \r
+            if ( state.backtracking==0 ) stream_34.add(char_literal11);\r
+\r
+            pushFollow(FOLLOW_relativePath_in_absolutePath766);\r
+            relativePath12=relativePath();\r
+\r
+            state._fsp--;\r
+            if (state.failed) return retval;\r
+            if ( state.backtracking==0 ) stream_relativePath.add(relativePath12.getTree());\r
+\r
+\r
+            // AST REWRITE\r
+            // elements: relativePath\r
+            // token labels: \r
+            // rule labels: retval\r
+            // token list labels: \r
+            // rule list labels: \r
+            // wildcard labels: \r
+            if ( state.backtracking==0 ) {\r
+            retval.tree = root_0;\r
+            RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"rule retval",retval!=null?retval.tree:null);\r
+\r
+            root_0 = (Object)adaptor.nil();\r
+            // 186:3: -> ^( STEP AXIS[\"PC\"] NAME[\"_root\"] relativePath )\r
+            {\r
+                // XPath.g:186:6: ^( STEP AXIS[\"PC\"] NAME[\"_root\"] relativePath )\r
+                {\r
+                Object root_1 = (Object)adaptor.nil();\r
+                root_1 = (Object)adaptor.becomeRoot((Object)adaptor.create(STEP, "STEP"), root_1);\r
+\r
+                adaptor.addChild(root_1, (Object)adaptor.create(AXIS, "PC"));\r
+                adaptor.addChild(root_1, (Object)adaptor.create(NAME, "_root"));\r
+                adaptor.addChild(root_1, stream_relativePath.nextTree());\r
+\r
+                adaptor.addChild(root_0, root_1);\r
+                }\r
+\r
+            }\r
+\r
+            retval.tree = root_0;}\r
+            }\r
+\r
+            retval.stop = input.LT(-1);\r
+\r
+            if ( state.backtracking==0 ) {\r
+\r
+            retval.tree = (Object)adaptor.rulePostProcessing(root_0);\r
+            adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);\r
+            }\r
+        }\r
+        catch (RecognitionException re) {\r
+            reportError(re);\r
+            recover(input,re);\r
+       retval.tree = (Object)adaptor.errorNode(input, retval.start, input.LT(-1), re);\r
+\r
+        }\r
+        finally {\r
+        }\r
+        return retval;\r
+    }\r
+    // $ANTLR end "absolutePath"\r
+\r
+    public static class step_return extends ParserRuleReturnScope {\r
+        Object tree;\r
+        public Object getTree() { return tree; }\r
+    };\r
+\r
+    // $ANTLR start "step"\r
+    // XPath.g:189:1: fragment step : nodeTest ( predicate )* -> NAME[$nodeTest.text] ( predicate )* ;\r
+    public final XPathParser.step_return step() throws RecognitionException {\r
+        XPathParser.step_return retval = new XPathParser.step_return();\r
+        retval.start = input.LT(1);\r
+\r
+        Object root_0 = null;\r
+\r
+        XPathParser.nodeTest_return nodeTest13 = null;\r
+\r
+        XPathParser.predicate_return predicate14 = null;\r
+\r
+\r
+        RewriteRuleSubtreeStream stream_nodeTest=new RewriteRuleSubtreeStream(adaptor,"rule nodeTest");\r
+        RewriteRuleSubtreeStream stream_predicate=new RewriteRuleSubtreeStream(adaptor,"rule predicate");\r
+        try {\r
+            // XPath.g:191:3: ( nodeTest ( predicate )* -> NAME[$nodeTest.text] ( predicate )* )\r
+            // XPath.g:191:5: nodeTest ( predicate )*\r
+            {\r
+            pushFollow(FOLLOW_nodeTest_in_step800);\r
+            nodeTest13=nodeTest();\r
+\r
+            state._fsp--;\r
+            if (state.failed) return retval;\r
+            if ( state.backtracking==0 ) stream_nodeTest.add(nodeTest13.getTree());\r
+            // XPath.g:191:14: ( predicate )*\r
+            loop3:\r
+            do {\r
+                int alt3=2;\r
+                int LA3_0 = input.LA(1);\r
+\r
+                if ( (LA3_0==37) ) {\r
+                    alt3=1;\r
+                }\r
+\r
+\r
+                switch (alt3) {\r
+               case 1 :\r
+                   // XPath.g:191:14: predicate\r
+                   {\r
+                   pushFollow(FOLLOW_predicate_in_step802);\r
+                   predicate14=predicate();\r
+\r
+                   state._fsp--;\r
+                   if (state.failed) return retval;\r
+                   if ( state.backtracking==0 ) stream_predicate.add(predicate14.getTree());\r
+\r
+                   }\r
+                   break;\r
+\r
+               default :\r
+                   break loop3;\r
+                }\r
+            } while (true);\r
+\r
+\r
+\r
+            // AST REWRITE\r
+            // elements: predicate\r
+            // token labels: \r
+            // rule labels: retval\r
+            // token list labels: \r
+            // rule list labels: \r
+            // wildcard labels: \r
+            if ( state.backtracking==0 ) {\r
+            retval.tree = root_0;\r
+            RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"rule retval",retval!=null?retval.tree:null);\r
+\r
+            root_0 = (Object)adaptor.nil();\r
+            // 191:25: -> NAME[$nodeTest.text] ( predicate )*\r
+            {\r
+                adaptor.addChild(root_0, (Object)adaptor.create(NAME, (nodeTest13!=null?input.toString(nodeTest13.start,nodeTest13.stop):null)));\r
+                // XPath.g:191:49: ( predicate )*\r
+                while ( stream_predicate.hasNext() ) {\r
+                    adaptor.addChild(root_0, stream_predicate.nextTree());\r
+\r
+                }\r
+                stream_predicate.reset();\r
+\r
+            }\r
+\r
+            retval.tree = root_0;}\r
+            }\r
+\r
+            retval.stop = input.LT(-1);\r
+\r
+            if ( state.backtracking==0 ) {\r
+\r
+            retval.tree = (Object)adaptor.rulePostProcessing(root_0);\r
+            adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);\r
+            }\r
+        }\r
+        catch (RecognitionException re) {\r
+            reportError(re);\r
+            recover(input,re);\r
+       retval.tree = (Object)adaptor.errorNode(input, retval.start, input.LT(-1), re);\r
+\r
+        }\r
+        finally {\r
+        }\r
+        return retval;\r
+    }\r
+    // $ANTLR end "step"\r
+\r
+    public static class nodeTest_return extends ParserRuleReturnScope {\r
+        Object tree;\r
+        public Object getTree() { return tree; }\r
+    };\r
+\r
+    // $ANTLR start "nodeTest"\r
+    // XPath.g:195:1: fragment nodeTest : ( '@' )? ( QName ':' )? QName ;\r
+    public final XPathParser.nodeTest_return nodeTest() throws RecognitionException {\r
+        XPathParser.nodeTest_return retval = new XPathParser.nodeTest_return();\r
+        retval.start = input.LT(1);\r
+\r
+        Object root_0 = null;\r
+\r
+        Token char_literal15=null;\r
+        Token QName16=null;\r
+        Token char_literal17=null;\r
+        Token QName18=null;\r
+\r
+        Object char_literal15_tree=null;\r
+        Object QName16_tree=null;\r
+        Object char_literal17_tree=null;\r
+        Object QName18_tree=null;\r
+\r
+        try {\r
+            // XPath.g:197:3: ( ( '@' )? ( QName ':' )? QName )\r
+            // XPath.g:197:5: ( '@' )? ( QName ':' )? QName\r
+            {\r
+            root_0 = (Object)adaptor.nil();\r
+\r
+            // XPath.g:197:5: ( '@' )?\r
+            int alt4=2;\r
+            int LA4_0 = input.LA(1);\r
+\r
+            if ( (LA4_0==36) ) {\r
+                alt4=1;\r
+            }\r
+            switch (alt4) {\r
+                case 1 :\r
+                    // XPath.g:197:5: '@'\r
+                    {\r
+                    char_literal15=(Token)match(input,36,FOLLOW_36_in_nodeTest830); if (state.failed) return retval;\r
+                    if ( state.backtracking==0 ) {\r
+                    char_literal15_tree = (Object)adaptor.create(char_literal15);\r
+                    adaptor.addChild(root_0, char_literal15_tree);\r
+                    }\r
+\r
+                    }\r
+                    break;\r
+\r
+            }\r
+\r
+            // XPath.g:197:10: ( QName ':' )?\r
+            int alt5=2;\r
+            int LA5_0 = input.LA(1);\r
+\r
+            if ( (LA5_0==QName) ) {\r
+                int LA5_1 = input.LA(2);\r
+\r
+                if ( (LA5_1==Colon) ) {\r
+                    alt5=1;\r
+                }\r
+            }\r
+            switch (alt5) {\r
+                case 1 :\r
+                    // XPath.g:197:11: QName ':'\r
+                    {\r
+                    QName16=(Token)match(input,QName,FOLLOW_QName_in_nodeTest834); if (state.failed) return retval;\r
+                    if ( state.backtracking==0 ) {\r
+                    QName16_tree = (Object)adaptor.create(QName16);\r
+                    adaptor.addChild(root_0, QName16_tree);\r
+                    }\r
+                    char_literal17=(Token)match(input,Colon,FOLLOW_Colon_in_nodeTest836); if (state.failed) return retval;\r
+                    if ( state.backtracking==0 ) {\r
+                    char_literal17_tree = (Object)adaptor.create(char_literal17);\r
+                    adaptor.addChild(root_0, char_literal17_tree);\r
+                    }\r
+\r
+                    }\r
+                    break;\r
+\r
+            }\r
+\r
+            QName18=(Token)match(input,QName,FOLLOW_QName_in_nodeTest840); if (state.failed) return retval;\r
+            if ( state.backtracking==0 ) {\r
+            QName18_tree = (Object)adaptor.create(QName18);\r
+            adaptor.addChild(root_0, QName18_tree);\r
+            }\r
+\r
+            }\r
+\r
+            retval.stop = input.LT(-1);\r
+\r
+            if ( state.backtracking==0 ) {\r
+\r
+            retval.tree = (Object)adaptor.rulePostProcessing(root_0);\r
+            adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);\r
+            }\r
+        }\r
+        catch (RecognitionException re) {\r
+            reportError(re);\r
+            recover(input,re);\r
+       retval.tree = (Object)adaptor.errorNode(input, retval.start, input.LT(-1), re);\r
+\r
+        }\r
+        finally {\r
+        }\r
+        return retval;\r
+    }\r
+    // $ANTLR end "nodeTest"\r
+\r
+    public static class predicate_return extends ParserRuleReturnScope {\r
+        Object tree;\r
+        public Object getTree() { return tree; }\r
+    };\r
+\r
+    // $ANTLR start "predicate"\r
+    // XPath.g:200:1: fragment predicate : '[' expr ']' -> ^( PREDICATE expr ) ;\r
+    public final XPathParser.predicate_return predicate() throws RecognitionException {\r
+        XPathParser.predicate_return retval = new XPathParser.predicate_return();\r
+        retval.start = input.LT(1);\r
+\r
+        Object root_0 = null;\r
+\r
+        Token char_literal19=null;\r
+        Token char_literal21=null;\r
+        XPathParser.expr_return expr20 = null;\r
+\r
+\r
+        Object char_literal19_tree=null;\r
+        Object char_literal21_tree=null;\r
+        RewriteRuleTokenStream stream_37=new RewriteRuleTokenStream(adaptor,"token 37");\r
+        RewriteRuleTokenStream stream_38=new RewriteRuleTokenStream(adaptor,"token 38");\r
+        RewriteRuleSubtreeStream stream_expr=new RewriteRuleSubtreeStream(adaptor,"rule expr");\r
+        try {\r
+            // XPath.g:202:3: ( '[' expr ']' -> ^( PREDICATE expr ) )\r
+            // XPath.g:202:5: '[' expr ']'\r
+            {\r
+            char_literal19=(Token)match(input,37,FOLLOW_37_in_predicate858); if (state.failed) return retval; \r
+            if ( state.backtracking==0 ) stream_37.add(char_literal19);\r
+\r
+            pushFollow(FOLLOW_expr_in_predicate860);\r
+            expr20=expr();\r
+\r
+            state._fsp--;\r
+            if (state.failed) return retval;\r
+            if ( state.backtracking==0 ) stream_expr.add(expr20.getTree());\r
+            char_literal21=(Token)match(input,38,FOLLOW_38_in_predicate862); if (state.failed) return retval; \r
+            if ( state.backtracking==0 ) stream_38.add(char_literal21);\r
+\r
+\r
+\r
+            // AST REWRITE\r
+            // elements: expr\r
+            // token labels: \r
+            // rule labels: retval\r
+            // token list labels: \r
+            // rule list labels: \r
+            // wildcard labels: \r
+            if ( state.backtracking==0 ) {\r
+            retval.tree = root_0;\r
+            RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"rule retval",retval!=null?retval.tree:null);\r
+\r
+            root_0 = (Object)adaptor.nil();\r
+            // 203:3: -> ^( PREDICATE expr )\r
+            {\r
+                // XPath.g:203:6: ^( PREDICATE expr )\r
+                {\r
+                Object root_1 = (Object)adaptor.nil();\r
+                root_1 = (Object)adaptor.becomeRoot((Object)adaptor.create(PREDICATE, "PREDICATE"), root_1);\r
+\r
+                adaptor.addChild(root_1, stream_expr.nextTree());\r
+\r
+                adaptor.addChild(root_0, root_1);\r
+                }\r
+\r
+            }\r
+\r
+            retval.tree = root_0;}\r
+            }\r
+\r
+            retval.stop = input.LT(-1);\r
+\r
+            if ( state.backtracking==0 ) {\r
+\r
+            retval.tree = (Object)adaptor.rulePostProcessing(root_0);\r
+            adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);\r
+            }\r
+        }\r
+        catch (RecognitionException re) {\r
+            reportError(re);\r
+            recover(input,re);\r
+       retval.tree = (Object)adaptor.errorNode(input, retval.start, input.LT(-1), re);\r
+\r
+        }\r
+        finally {\r
+        }\r
+        return retval;\r
+    }\r
+    // $ANTLR end "predicate"\r
+\r
+    public static class expr_return extends ParserRuleReturnScope {\r
+        Object tree;\r
+        public Object getTree() { return tree; }\r
+    };\r
+\r
+    // $ANTLR start "expr"\r
+    // XPath.g:206:1: expr : comparisonExpr ;\r
+    public final XPathParser.expr_return expr() throws RecognitionException {\r
+        XPathParser.expr_return retval = new XPathParser.expr_return();\r
+        retval.start = input.LT(1);\r
+\r
+        Object root_0 = null;\r
+\r
+        XPathParser.comparisonExpr_return comparisonExpr22 = null;\r
+\r
+\r
+\r
+        try {\r
+            // XPath.g:207:3: ( comparisonExpr )\r
+            // XPath.g:207:5: comparisonExpr\r
+            {\r
+            root_0 = (Object)adaptor.nil();\r
+\r
+            pushFollow(FOLLOW_comparisonExpr_in_expr885);\r
+            comparisonExpr22=comparisonExpr();\r
+\r
+            state._fsp--;\r
+            if (state.failed) return retval;\r
+            if ( state.backtracking==0 ) adaptor.addChild(root_0, comparisonExpr22.getTree());\r
+\r
+            }\r
+\r
+            retval.stop = input.LT(-1);\r
+\r
+            if ( state.backtracking==0 ) {\r
+\r
+            retval.tree = (Object)adaptor.rulePostProcessing(root_0);\r
+            adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);\r
+            }\r
+        }\r
+        catch (RecognitionException re) {\r
+            reportError(re);\r
+            recover(input,re);\r
+       retval.tree = (Object)adaptor.errorNode(input, retval.start, input.LT(-1), re);\r
+\r
+        }\r
+        finally {\r
+        }\r
+        return retval;\r
+    }\r
+    // $ANTLR end "expr"\r
+\r
+    public static class comparisonExpr_return extends ParserRuleReturnScope {\r
+        Object tree;\r
+        public Object getTree() { return tree; }\r
+    };\r
+\r
+    // $ANTLR start "comparisonExpr"\r
+    // XPath.g:210:1: fragment comparisonExpr : ( pathExpr | ( pathExpr '=' )=> pathExpr '=' pathExpr | ( pathExpr '!=' )=> pathExpr '!=' pathExpr | ( pathExpr '>' )=> pathExpr '>' pathExpr | ( pathExpr '>=' )=> pathExpr '>=' pathExpr | ( pathExpr '<' )=> pathExpr '<' pathExpr | ( pathExpr '<=' )=> pathExpr '<=' pathExpr | ( pathExpr '~=' )=> pathExpr '~=' pathExpr );\r
+    public final XPathParser.comparisonExpr_return comparisonExpr() throws RecognitionException {\r
+        XPathParser.comparisonExpr_return retval = new XPathParser.comparisonExpr_return();\r
+        retval.start = input.LT(1);\r
+\r
+        Object root_0 = null;\r
+\r
+        Token char_literal25=null;\r
+        Token string_literal28=null;\r
+        Token char_literal31=null;\r
+        Token string_literal34=null;\r
+        Token char_literal37=null;\r
+        Token string_literal40=null;\r
+        Token string_literal43=null;\r
+        XPathParser.pathExpr_return pathExpr23 = null;\r
+\r
+        XPathParser.pathExpr_return pathExpr24 = null;\r
+\r
+        XPathParser.pathExpr_return pathExpr26 = null;\r
+\r
+        XPathParser.pathExpr_return pathExpr27 = null;\r
+\r
+        XPathParser.pathExpr_return pathExpr29 = null;\r
+\r
+        XPathParser.pathExpr_return pathExpr30 = null;\r
+\r
+        XPathParser.pathExpr_return pathExpr32 = null;\r
+\r
+        XPathParser.pathExpr_return pathExpr33 = null;\r
+\r
+        XPathParser.pathExpr_return pathExpr35 = null;\r
+\r
+        XPathParser.pathExpr_return pathExpr36 = null;\r
+\r
+        XPathParser.pathExpr_return pathExpr38 = null;\r
+\r
+        XPathParser.pathExpr_return pathExpr39 = null;\r
+\r
+        XPathParser.pathExpr_return pathExpr41 = null;\r
+\r
+        XPathParser.pathExpr_return pathExpr42 = null;\r
+\r
+        XPathParser.pathExpr_return pathExpr44 = null;\r
+\r
+\r
+        Object char_literal25_tree=null;\r
+        Object string_literal28_tree=null;\r
+        Object char_literal31_tree=null;\r
+        Object string_literal34_tree=null;\r
+        Object char_literal37_tree=null;\r
+        Object string_literal40_tree=null;\r
+        Object string_literal43_tree=null;\r
+\r
+        try {\r
+            // XPath.g:212:3: ( pathExpr | ( pathExpr '=' )=> pathExpr '=' pathExpr | ( pathExpr '!=' )=> pathExpr '!=' pathExpr | ( pathExpr '>' )=> pathExpr '>' pathExpr | ( pathExpr '>=' )=> pathExpr '>=' pathExpr | ( pathExpr '<' )=> pathExpr '<' pathExpr | ( pathExpr '<=' )=> pathExpr '<=' pathExpr | ( pathExpr '~=' )=> pathExpr '~=' pathExpr )\r
+            int alt6=8;\r
+            alt6 = dfa6.predict(input);\r
+            switch (alt6) {\r
+                case 1 :\r
+                    // XPath.g:212:5: pathExpr\r
+                    {\r
+                    root_0 = (Object)adaptor.nil();\r
+\r
+                    pushFollow(FOLLOW_pathExpr_in_comparisonExpr900);\r
+                    pathExpr23=pathExpr();\r
+\r
+                    state._fsp--;\r
+                    if (state.failed) return retval;\r
+                    if ( state.backtracking==0 ) adaptor.addChild(root_0, pathExpr23.getTree());\r
+\r
+                    }\r
+                    break;\r
+                case 2 :\r
+                    // XPath.g:213:5: ( pathExpr '=' )=> pathExpr '=' pathExpr\r
+                    {\r
+                    root_0 = (Object)adaptor.nil();\r
+\r
+                    pushFollow(FOLLOW_pathExpr_in_comparisonExpr914);\r
+                    pathExpr24=pathExpr();\r
+\r
+                    state._fsp--;\r
+                    if (state.failed) return retval;\r
+                    if ( state.backtracking==0 ) adaptor.addChild(root_0, pathExpr24.getTree());\r
+                    char_literal25=(Token)match(input,39,FOLLOW_39_in_comparisonExpr916); if (state.failed) return retval;\r
+                    if ( state.backtracking==0 ) {\r
+                    char_literal25_tree = (Object)adaptor.create(char_literal25);\r
+                    adaptor.addChild(root_0, char_literal25_tree);\r
+                    }\r
+                    pushFollow(FOLLOW_pathExpr_in_comparisonExpr918);\r
+                    pathExpr26=pathExpr();\r
+\r
+                    state._fsp--;\r
+                    if (state.failed) return retval;\r
+                    if ( state.backtracking==0 ) adaptor.addChild(root_0, pathExpr26.getTree());\r
+\r
+                    }\r
+                    break;\r
+                case 3 :\r
+                    // XPath.g:214:5: ( pathExpr '!=' )=> pathExpr '!=' pathExpr\r
+                    {\r
+                    root_0 = (Object)adaptor.nil();\r
+\r
+                    pushFollow(FOLLOW_pathExpr_in_comparisonExpr932);\r
+                    pathExpr27=pathExpr();\r
+\r
+                    state._fsp--;\r
+                    if (state.failed) return retval;\r
+                    if ( state.backtracking==0 ) adaptor.addChild(root_0, pathExpr27.getTree());\r
+                    string_literal28=(Token)match(input,40,FOLLOW_40_in_comparisonExpr934); if (state.failed) return retval;\r
+                    if ( state.backtracking==0 ) {\r
+                    string_literal28_tree = (Object)adaptor.create(string_literal28);\r
+                    adaptor.addChild(root_0, string_literal28_tree);\r
+                    }\r
+                    pushFollow(FOLLOW_pathExpr_in_comparisonExpr936);\r
+                    pathExpr29=pathExpr();\r
+\r
+                    state._fsp--;\r
+                    if (state.failed) return retval;\r
+                    if ( state.backtracking==0 ) adaptor.addChild(root_0, pathExpr29.getTree());\r
+\r
+                    }\r
+                    break;\r
+                case 4 :\r
+                    // XPath.g:215:5: ( pathExpr '>' )=> pathExpr '>' pathExpr\r
+                    {\r
+                    root_0 = (Object)adaptor.nil();\r
+\r
+                    pushFollow(FOLLOW_pathExpr_in_comparisonExpr950);\r
+                    pathExpr30=pathExpr();\r
+\r
+                    state._fsp--;\r
+                    if (state.failed) return retval;\r
+                    if ( state.backtracking==0 ) adaptor.addChild(root_0, pathExpr30.getTree());\r
+                    char_literal31=(Token)match(input,41,FOLLOW_41_in_comparisonExpr952); if (state.failed) return retval;\r
+                    if ( state.backtracking==0 ) {\r
+                    char_literal31_tree = (Object)adaptor.create(char_literal31);\r
+                    adaptor.addChild(root_0, char_literal31_tree);\r
+                    }\r
+                    pushFollow(FOLLOW_pathExpr_in_comparisonExpr954);\r
+                    pathExpr32=pathExpr();\r
+\r
+                    state._fsp--;\r
+                    if (state.failed) return retval;\r
+                    if ( state.backtracking==0 ) adaptor.addChild(root_0, pathExpr32.getTree());\r
+\r
+                    }\r
+                    break;\r
+                case 5 :\r
+                    // XPath.g:216:5: ( pathExpr '>=' )=> pathExpr '>=' pathExpr\r
+                    {\r
+                    root_0 = (Object)adaptor.nil();\r
+\r
+                    pushFollow(FOLLOW_pathExpr_in_comparisonExpr968);\r
+                    pathExpr33=pathExpr();\r
+\r
+                    state._fsp--;\r
+                    if (state.failed) return retval;\r
+                    if ( state.backtracking==0 ) adaptor.addChild(root_0, pathExpr33.getTree());\r
+                    string_literal34=(Token)match(input,42,FOLLOW_42_in_comparisonExpr970); if (state.failed) return retval;\r
+                    if ( state.backtracking==0 ) {\r
+                    string_literal34_tree = (Object)adaptor.create(string_literal34);\r
+                    adaptor.addChild(root_0, string_literal34_tree);\r
+                    }\r
+                    pushFollow(FOLLOW_pathExpr_in_comparisonExpr972);\r
+                    pathExpr35=pathExpr();\r
+\r
+                    state._fsp--;\r
+                    if (state.failed) return retval;\r
+                    if ( state.backtracking==0 ) adaptor.addChild(root_0, pathExpr35.getTree());\r
+\r
+                    }\r
+                    break;\r
+                case 6 :\r
+                    // XPath.g:217:5: ( pathExpr '<' )=> pathExpr '<' pathExpr\r
+                    {\r
+                    root_0 = (Object)adaptor.nil();\r
+\r
+                    pushFollow(FOLLOW_pathExpr_in_comparisonExpr986);\r
+                    pathExpr36=pathExpr();\r
+\r
+                    state._fsp--;\r
+                    if (state.failed) return retval;\r
+                    if ( state.backtracking==0 ) adaptor.addChild(root_0, pathExpr36.getTree());\r
+                    char_literal37=(Token)match(input,43,FOLLOW_43_in_comparisonExpr988); if (state.failed) return retval;\r
+                    if ( state.backtracking==0 ) {\r
+                    char_literal37_tree = (Object)adaptor.create(char_literal37);\r
+                    adaptor.addChild(root_0, char_literal37_tree);\r
+                    }\r
+                    pushFollow(FOLLOW_pathExpr_in_comparisonExpr990);\r
+                    pathExpr38=pathExpr();\r
+\r
+                    state._fsp--;\r
+                    if (state.failed) return retval;\r
+                    if ( state.backtracking==0 ) adaptor.addChild(root_0, pathExpr38.getTree());\r
+\r
+                    }\r
+                    break;\r
+                case 7 :\r
+                    // XPath.g:218:5: ( pathExpr '<=' )=> pathExpr '<=' pathExpr\r
+                    {\r
+                    root_0 = (Object)adaptor.nil();\r
+\r
+                    pushFollow(FOLLOW_pathExpr_in_comparisonExpr1004);\r
+                    pathExpr39=pathExpr();\r
+\r
+                    state._fsp--;\r
+                    if (state.failed) return retval;\r
+                    if ( state.backtracking==0 ) adaptor.addChild(root_0, pathExpr39.getTree());\r
+                    string_literal40=(Token)match(input,44,FOLLOW_44_in_comparisonExpr1006); if (state.failed) return retval;\r
+                    if ( state.backtracking==0 ) {\r
+                    string_literal40_tree = (Object)adaptor.create(string_literal40);\r
+                    adaptor.addChild(root_0, string_literal40_tree);\r
+                    }\r
+                    pushFollow(FOLLOW_pathExpr_in_comparisonExpr1008);\r
+                    pathExpr41=pathExpr();\r
+\r
+                    state._fsp--;\r
+                    if (state.failed) return retval;\r
+                    if ( state.backtracking==0 ) adaptor.addChild(root_0, pathExpr41.getTree());\r
+\r
+                    }\r
+                    break;\r
+                case 8 :\r
+                    // XPath.g:219:5: ( pathExpr '~=' )=> pathExpr '~=' pathExpr\r
+                    {\r
+                    root_0 = (Object)adaptor.nil();\r
+\r
+                    pushFollow(FOLLOW_pathExpr_in_comparisonExpr1022);\r
+                    pathExpr42=pathExpr();\r
+\r
+                    state._fsp--;\r
+                    if (state.failed) return retval;\r
+                    if ( state.backtracking==0 ) adaptor.addChild(root_0, pathExpr42.getTree());\r
+                    string_literal43=(Token)match(input,45,FOLLOW_45_in_comparisonExpr1024); if (state.failed) return retval;\r
+                    if ( state.backtracking==0 ) {\r
+                    string_literal43_tree = (Object)adaptor.create(string_literal43);\r
+                    adaptor.addChild(root_0, string_literal43_tree);\r
+                    }\r
+                    pushFollow(FOLLOW_pathExpr_in_comparisonExpr1026);\r
+                    pathExpr44=pathExpr();\r
+\r
+                    state._fsp--;\r
+                    if (state.failed) return retval;\r
+                    if ( state.backtracking==0 ) adaptor.addChild(root_0, pathExpr44.getTree());\r
+\r
+                    }\r
+                    break;\r
+\r
+            }\r
+            retval.stop = input.LT(-1);\r
+\r
+            if ( state.backtracking==0 ) {\r
+\r
+            retval.tree = (Object)adaptor.rulePostProcessing(root_0);\r
+            adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);\r
+            }\r
+        }\r
+        catch (RecognitionException re) {\r
+            reportError(re);\r
+            recover(input,re);\r
+       retval.tree = (Object)adaptor.errorNode(input, retval.start, input.LT(-1), re);\r
+\r
+        }\r
+        finally {\r
+        }\r
+        return retval;\r
+    }\r
+    // $ANTLR end "comparisonExpr"\r
+\r
+    public static class pathExpr_return extends ParserRuleReturnScope {\r
+        Object tree;\r
+        public Object getTree() { return tree; }\r
+    };\r
+\r
+    // $ANTLR start "pathExpr"\r
+    // XPath.g:223:1: fragment pathExpr : ( locationExpr | primaryExpr );\r
+    public final XPathParser.pathExpr_return pathExpr() throws RecognitionException {\r
+        XPathParser.pathExpr_return retval = new XPathParser.pathExpr_return();\r
+        retval.start = input.LT(1);\r
+\r
+        Object root_0 = null;\r
+\r
+        XPathParser.locationExpr_return locationExpr45 = null;\r
+\r
+        XPathParser.primaryExpr_return primaryExpr46 = null;\r
+\r
+\r
+\r
+        try {\r
+            // XPath.g:225:3: ( locationExpr | primaryExpr )\r
+            int alt7=2;\r
+            switch ( input.LA(1) ) {\r
+            case 34:\r
+            case 36:\r
+                {\r
+                alt7=1;\r
+                }\r
+                break;\r
+            case QName:\r
+                {\r
+                int LA7_2 = input.LA(2);\r
+\r
+                if ( ((LA7_2>=Comma && LA7_2<=Colon)||(LA7_2>=34 && LA7_2<=35)||(LA7_2>=37 && LA7_2<=45)||LA7_2==47) ) {\r
+                    alt7=1;\r
+                }\r
+                else if ( (LA7_2==46) ) {\r
+                    alt7=2;\r
+                }\r
+                else {\r
+                    if (state.backtracking>0) {state.failed=true; return retval;}\r
+                    NoViableAltException nvae =\r
+                        new NoViableAltException("", 7, 2, input);\r
+\r
+                    throw nvae;\r
+                }\r
+                }\r
+                break;\r
+            case String:\r
+            case Integer:\r
+            case Double:\r
+                {\r
+                alt7=2;\r
+                }\r
+                break;\r
+            default:\r
+                if (state.backtracking>0) {state.failed=true; return retval;}\r
+                NoViableAltException nvae =\r
+                    new NoViableAltException("", 7, 0, input);\r
+\r
+                throw nvae;\r
+            }\r
+\r
+            switch (alt7) {\r
+                case 1 :\r
+                    // XPath.g:225:5: locationExpr\r
+                    {\r
+                    root_0 = (Object)adaptor.nil();\r
+\r
+                    pushFollow(FOLLOW_locationExpr_in_pathExpr1042);\r
+                    locationExpr45=locationExpr();\r
+\r
+                    state._fsp--;\r
+                    if (state.failed) return retval;\r
+                    if ( state.backtracking==0 ) adaptor.addChild(root_0, locationExpr45.getTree());\r
+\r
+                    }\r
+                    break;\r
+                case 2 :\r
+                    // XPath.g:226:5: primaryExpr\r
+                    {\r
+                    root_0 = (Object)adaptor.nil();\r
+\r
+                    pushFollow(FOLLOW_primaryExpr_in_pathExpr1048);\r
+                    primaryExpr46=primaryExpr();\r
+\r
+                    state._fsp--;\r
+                    if (state.failed) return retval;\r
+                    if ( state.backtracking==0 ) adaptor.addChild(root_0, primaryExpr46.getTree());\r
+\r
+                    }\r
+                    break;\r
+\r
+            }\r
+            retval.stop = input.LT(-1);\r
+\r
+            if ( state.backtracking==0 ) {\r
+\r
+            retval.tree = (Object)adaptor.rulePostProcessing(root_0);\r
+            adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);\r
+            }\r
+        }\r
+        catch (RecognitionException re) {\r
+            reportError(re);\r
+            recover(input,re);\r
+       retval.tree = (Object)adaptor.errorNode(input, retval.start, input.LT(-1), re);\r
+\r
+        }\r
+        finally {\r
+        }\r
+        return retval;\r
+    }\r
+    // $ANTLR end "pathExpr"\r
+\r
+    public static class primaryExpr_return extends ParserRuleReturnScope {\r
+        Object tree;\r
+        public Object getTree() { return tree; }\r
+    };\r
+\r
+    // $ANTLR start "primaryExpr"\r
+    // XPath.g:229:1: fragment primaryExpr : ( String | Integer | Double | functionCall );\r
+    public final XPathParser.primaryExpr_return primaryExpr() throws RecognitionException {\r
+        XPathParser.primaryExpr_return retval = new XPathParser.primaryExpr_return();\r
+        retval.start = input.LT(1);\r
+\r
+        Object root_0 = null;\r
+\r
+        Token String47=null;\r
+        Token Integer48=null;\r
+        Token Double49=null;\r
+        XPathParser.functionCall_return functionCall50 = null;\r
+\r
+\r
+        Object String47_tree=null;\r
+        Object Integer48_tree=null;\r
+        Object Double49_tree=null;\r
+\r
+        try {\r
+            // XPath.g:231:3: ( String | Integer | Double | functionCall )\r
+            int alt8=4;\r
+            switch ( input.LA(1) ) {\r
+            case String:\r
+                {\r
+                alt8=1;\r
+                }\r
+                break;\r
+            case Integer:\r
+                {\r
+                alt8=2;\r
+                }\r
+                break;\r
+            case Double:\r
+                {\r
+                alt8=3;\r
+                }\r
+                break;\r
+            case QName:\r
+                {\r
+                alt8=4;\r
+                }\r
+                break;\r
+            default:\r
+                if (state.backtracking>0) {state.failed=true; return retval;}\r
+                NoViableAltException nvae =\r
+                    new NoViableAltException("", 8, 0, input);\r
+\r
+                throw nvae;\r
+            }\r
+\r
+            switch (alt8) {\r
+                case 1 :\r
+                    // XPath.g:231:5: String\r
+                    {\r
+                    root_0 = (Object)adaptor.nil();\r
+\r
+                    String47=(Token)match(input,String,FOLLOW_String_in_primaryExpr1067); if (state.failed) return retval;\r
+                    if ( state.backtracking==0 ) {\r
+                    String47_tree = (Object)adaptor.create(String47);\r
+                    adaptor.addChild(root_0, String47_tree);\r
+                    }\r
+\r
+                    }\r
+                    break;\r
+                case 2 :\r
+                    // XPath.g:232:5: Integer\r
+                    {\r
+                    root_0 = (Object)adaptor.nil();\r
+\r
+                    Integer48=(Token)match(input,Integer,FOLLOW_Integer_in_primaryExpr1073); if (state.failed) return retval;\r
+                    if ( state.backtracking==0 ) {\r
+                    Integer48_tree = (Object)adaptor.create(Integer48);\r
+                    adaptor.addChild(root_0, Integer48_tree);\r
+                    }\r
+\r
+                    }\r
+                    break;\r
+                case 3 :\r
+                    // XPath.g:233:5: Double\r
+                    {\r
+                    root_0 = (Object)adaptor.nil();\r
+\r
+                    Double49=(Token)match(input,Double,FOLLOW_Double_in_primaryExpr1079); if (state.failed) return retval;\r
+                    if ( state.backtracking==0 ) {\r
+                    Double49_tree = (Object)adaptor.create(Double49);\r
+                    adaptor.addChild(root_0, Double49_tree);\r
+                    }\r
+\r
+                    }\r
+                    break;\r
+                case 4 :\r
+                    // XPath.g:234:5: functionCall\r
+                    {\r
+                    root_0 = (Object)adaptor.nil();\r
+\r
+                    pushFollow(FOLLOW_functionCall_in_primaryExpr1085);\r
+                    functionCall50=functionCall();\r
+\r
+                    state._fsp--;\r
+                    if (state.failed) return retval;\r
+                    if ( state.backtracking==0 ) adaptor.addChild(root_0, functionCall50.getTree());\r
+\r
+                    }\r
+                    break;\r
+\r
+            }\r
+            retval.stop = input.LT(-1);\r
+\r
+            if ( state.backtracking==0 ) {\r
+\r
+            retval.tree = (Object)adaptor.rulePostProcessing(root_0);\r
+            adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);\r
+            }\r
+        }\r
+        catch (RecognitionException re) {\r
+            reportError(re);\r
+            recover(input,re);\r
+       retval.tree = (Object)adaptor.errorNode(input, retval.start, input.LT(-1), re);\r
+\r
+        }\r
+        finally {\r
+        }\r
+        return retval;\r
+    }\r
+    // $ANTLR end "primaryExpr"\r
+\r
+    public static class functionCall_return extends ParserRuleReturnScope {\r
+        Object tree;\r
+        public Object getTree() { return tree; }\r
+    };\r
+\r
+    // $ANTLR start "functionCall"\r
+    // XPath.g:238:1: fragment functionCall : QName '(' ( expr ( ',' expr )* )? ')' ;\r
+    public final XPathParser.functionCall_return functionCall() throws RecognitionException {\r
+        XPathParser.functionCall_return retval = new XPathParser.functionCall_return();\r
+        retval.start = input.LT(1);\r
+\r
+        Object root_0 = null;\r
+\r
+        Token QName51=null;\r
+        Token char_literal52=null;\r
+        Token char_literal54=null;\r
+        Token char_literal56=null;\r
+        XPathParser.expr_return expr53 = null;\r
+\r
+        XPathParser.expr_return expr55 = null;\r
+\r
+\r
+        Object QName51_tree=null;\r
+        Object char_literal52_tree=null;\r
+        Object char_literal54_tree=null;\r
+        Object char_literal56_tree=null;\r
+\r
+        try {\r
+            // XPath.g:240:3: ( QName '(' ( expr ( ',' expr )* )? ')' )\r
+            // XPath.g:240:5: QName '(' ( expr ( ',' expr )* )? ')'\r
+            {\r
+            root_0 = (Object)adaptor.nil();\r
+\r
+            QName51=(Token)match(input,QName,FOLLOW_QName_in_functionCall1105); if (state.failed) return retval;\r
+            if ( state.backtracking==0 ) {\r
+            QName51_tree = (Object)adaptor.create(QName51);\r
+            adaptor.addChild(root_0, QName51_tree);\r
+            }\r
+            char_literal52=(Token)match(input,46,FOLLOW_46_in_functionCall1107); if (state.failed) return retval;\r
+            if ( state.backtracking==0 ) {\r
+            char_literal52_tree = (Object)adaptor.create(char_literal52);\r
+            adaptor.addChild(root_0, char_literal52_tree);\r
+            }\r
+            // XPath.g:240:15: ( expr ( ',' expr )* )?\r
+            int alt10=2;\r
+            int LA10_0 = input.LA(1);\r
+\r
+            if ( ((LA10_0>=String && LA10_0<=Integer)||LA10_0==Double||LA10_0==QName||LA10_0==34||LA10_0==36) ) {\r
+                alt10=1;\r
+            }\r
+            switch (alt10) {\r
+                case 1 :\r
+                    // XPath.g:240:16: expr ( ',' expr )*\r
+                    {\r
+                    pushFollow(FOLLOW_expr_in_functionCall1110);\r
+                    expr53=expr();\r
+\r
+                    state._fsp--;\r
+                    if (state.failed) return retval;\r
+                    if ( state.backtracking==0 ) adaptor.addChild(root_0, expr53.getTree());\r
+                    // XPath.g:240:21: ( ',' expr )*\r
+                    loop9:\r
+                    do {\r
+                        int alt9=2;\r
+                        int LA9_0 = input.LA(1);\r
+\r
+                        if ( (LA9_0==Comma) ) {\r
+                            alt9=1;\r
+                        }\r
+\r
+\r
+                        switch (alt9) {\r
+                       case 1 :\r
+                           // XPath.g:240:22: ',' expr\r
+                           {\r
+                           char_literal54=(Token)match(input,Comma,FOLLOW_Comma_in_functionCall1113); if (state.failed) return retval;\r
+                           if ( state.backtracking==0 ) {\r
+                           char_literal54_tree = (Object)adaptor.create(char_literal54);\r
+                           adaptor.addChild(root_0, char_literal54_tree);\r
+                           }\r
+                           pushFollow(FOLLOW_expr_in_functionCall1115);\r
+                           expr55=expr();\r
+\r
+                           state._fsp--;\r
+                           if (state.failed) return retval;\r
+                           if ( state.backtracking==0 ) adaptor.addChild(root_0, expr55.getTree());\r
+\r
+                           }\r
+                           break;\r
+\r
+                       default :\r
+                           break loop9;\r
+                        }\r
+                    } while (true);\r
+\r
+\r
+                    }\r
+                    break;\r
+\r
+            }\r
+\r
+            char_literal56=(Token)match(input,47,FOLLOW_47_in_functionCall1121); if (state.failed) return retval;\r
+            if ( state.backtracking==0 ) {\r
+            char_literal56_tree = (Object)adaptor.create(char_literal56);\r
+            adaptor.addChild(root_0, char_literal56_tree);\r
+            }\r
+\r
+            }\r
+\r
+            retval.stop = input.LT(-1);\r
+\r
+            if ( state.backtracking==0 ) {\r
+\r
+            retval.tree = (Object)adaptor.rulePostProcessing(root_0);\r
+            adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);\r
+            }\r
+        }\r
+        catch (RecognitionException re) {\r
+            reportError(re);\r
+            recover(input,re);\r
+       retval.tree = (Object)adaptor.errorNode(input, retval.start, input.LT(-1), re);\r
+\r
+        }\r
+        finally {\r
+        }\r
+        return retval;\r
+    }\r
+    // $ANTLR end "functionCall"\r
+\r
+    // $ANTLR start synpred1_XPath\r
+    public final void synpred1_XPath_fragment() throws RecognitionException {   \r
+        // XPath.g:177:5: ( step '/' )\r
+        // XPath.g:177:6: step '/'\r
+        {\r
+        pushFollow(FOLLOW_step_in_synpred1_XPath687);\r
+        step();\r
+\r
+        state._fsp--;\r
+        if (state.failed) return ;\r
+        match(input,34,FOLLOW_34_in_synpred1_XPath689); if (state.failed) return ;\r
+\r
+        }\r
+    }\r
+    // $ANTLR end synpred1_XPath\r
+\r
+    // $ANTLR start synpred2_XPath\r
+    public final void synpred2_XPath_fragment() throws RecognitionException {   \r
+        // XPath.g:179:5: ( step '//' )\r
+        // XPath.g:179:6: step '//'\r
+        {\r
+        pushFollow(FOLLOW_step_in_synpred2_XPath722);\r
+        step();\r
+\r
+        state._fsp--;\r
+        if (state.failed) return ;\r
+        match(input,35,FOLLOW_35_in_synpred2_XPath724); if (state.failed) return ;\r
+\r
+        }\r
+    }\r
+    // $ANTLR end synpred2_XPath\r
+\r
+    // $ANTLR start synpred3_XPath\r
+    public final void synpred3_XPath_fragment() throws RecognitionException {   \r
+        // XPath.g:213:5: ( pathExpr '=' )\r
+        // XPath.g:213:6: pathExpr '='\r
+        {\r
+        pushFollow(FOLLOW_pathExpr_in_synpred3_XPath907);\r
+        pathExpr();\r
+\r
+        state._fsp--;\r
+        if (state.failed) return ;\r
+        match(input,39,FOLLOW_39_in_synpred3_XPath909); if (state.failed) return ;\r
+\r
+        }\r
+    }\r
+    // $ANTLR end synpred3_XPath\r
+\r
+    // $ANTLR start synpred4_XPath\r
+    public final void synpred4_XPath_fragment() throws RecognitionException {   \r
+        // XPath.g:214:5: ( pathExpr '!=' )\r
+        // XPath.g:214:6: pathExpr '!='\r
+        {\r
+        pushFollow(FOLLOW_pathExpr_in_synpred4_XPath925);\r
+        pathExpr();\r
+\r
+        state._fsp--;\r
+        if (state.failed) return ;\r
+        match(input,40,FOLLOW_40_in_synpred4_XPath927); if (state.failed) return ;\r
+\r
+        }\r
+    }\r
+    // $ANTLR end synpred4_XPath\r
+\r
+    // $ANTLR start synpred5_XPath\r
+    public final void synpred5_XPath_fragment() throws RecognitionException {   \r
+        // XPath.g:215:5: ( pathExpr '>' )\r
+        // XPath.g:215:6: pathExpr '>'\r
+        {\r
+        pushFollow(FOLLOW_pathExpr_in_synpred5_XPath943);\r
+        pathExpr();\r
+\r
+        state._fsp--;\r
+        if (state.failed) return ;\r
+        match(input,41,FOLLOW_41_in_synpred5_XPath945); if (state.failed) return ;\r
+\r
+        }\r
+    }\r
+    // $ANTLR end synpred5_XPath\r
+\r
+    // $ANTLR start synpred6_XPath\r
+    public final void synpred6_XPath_fragment() throws RecognitionException {   \r
+        // XPath.g:216:5: ( pathExpr '>=' )\r
+        // XPath.g:216:6: pathExpr '>='\r
+        {\r
+        pushFollow(FOLLOW_pathExpr_in_synpred6_XPath961);\r
+        pathExpr();\r
+\r
+        state._fsp--;\r
+        if (state.failed) return ;\r
+        match(input,42,FOLLOW_42_in_synpred6_XPath963); if (state.failed) return ;\r
+\r
+        }\r
+    }\r
+    // $ANTLR end synpred6_XPath\r
+\r
+    // $ANTLR start synpred7_XPath\r
+    public final void synpred7_XPath_fragment() throws RecognitionException {   \r
+        // XPath.g:217:5: ( pathExpr '<' )\r
+        // XPath.g:217:6: pathExpr '<'\r
+        {\r
+        pushFollow(FOLLOW_pathExpr_in_synpred7_XPath979);\r
+        pathExpr();\r
+\r
+        state._fsp--;\r
+        if (state.failed) return ;\r
+        match(input,43,FOLLOW_43_in_synpred7_XPath981); if (state.failed) return ;\r
+\r
+        }\r
+    }\r
+    // $ANTLR end synpred7_XPath\r
+\r
+    // $ANTLR start synpred8_XPath\r
+    public final void synpred8_XPath_fragment() throws RecognitionException {   \r
+        // XPath.g:218:5: ( pathExpr '<=' )\r
+        // XPath.g:218:6: pathExpr '<='\r
+        {\r
+        pushFollow(FOLLOW_pathExpr_in_synpred8_XPath997);\r
+        pathExpr();\r
+\r
+        state._fsp--;\r
+        if (state.failed) return ;\r
+        match(input,44,FOLLOW_44_in_synpred8_XPath999); if (state.failed) return ;\r
+\r
+        }\r
+    }\r
+    // $ANTLR end synpred8_XPath\r
+\r
+    // $ANTLR start synpred9_XPath\r
+    public final void synpred9_XPath_fragment() throws RecognitionException {   \r
+        // XPath.g:219:5: ( pathExpr '~=' )\r
+        // XPath.g:219:6: pathExpr '~='\r
+        {\r
+        pushFollow(FOLLOW_pathExpr_in_synpred9_XPath1015);\r
+        pathExpr();\r
+\r
+        state._fsp--;\r
+        if (state.failed) return ;\r
+        match(input,45,FOLLOW_45_in_synpred9_XPath1017); if (state.failed) return ;\r
+\r
+        }\r
+    }\r
+    // $ANTLR end synpred9_XPath\r
+\r
+    // Delegated rules\r
+\r
+    public final boolean synpred5_XPath() {\r
+        state.backtracking++;\r
+        int start = input.mark();\r
+        try {\r
+            synpred5_XPath_fragment(); // can never throw exception\r
+        } catch (RecognitionException re) {\r
+            System.err.println("impossible: "+re);\r
+        }\r
+        boolean success = !state.failed;\r
+        input.rewind(start);\r
+        state.backtracking--;\r
+        state.failed=false;\r
+        return success;\r
+    }\r
+    public final boolean synpred6_XPath() {\r
+        state.backtracking++;\r
+        int start = input.mark();\r
+        try {\r
+            synpred6_XPath_fragment(); // can never throw exception\r
+        } catch (RecognitionException re) {\r
+            System.err.println("impossible: "+re);\r
+        }\r
+        boolean success = !state.failed;\r
+        input.rewind(start);\r
+        state.backtracking--;\r
+        state.failed=false;\r
+        return success;\r
+    }\r
+    public final boolean synpred3_XPath() {\r
+        state.backtracking++;\r
+        int start = input.mark();\r
+        try {\r
+            synpred3_XPath_fragment(); // can never throw exception\r
+        } catch (RecognitionException re) {\r
+            System.err.println("impossible: "+re);\r
+        }\r
+        boolean success = !state.failed;\r
+        input.rewind(start);\r
+        state.backtracking--;\r
+        state.failed=false;\r
+        return success;\r
+    }\r
+    public final boolean synpred8_XPath() {\r
+        state.backtracking++;\r
+        int start = input.mark();\r
+        try {\r
+            synpred8_XPath_fragment(); // can never throw exception\r
+        } catch (RecognitionException re) {\r
+            System.err.println("impossible: "+re);\r
+        }\r
+        boolean success = !state.failed;\r
+        input.rewind(start);\r
+        state.backtracking--;\r
+        state.failed=false;\r
+        return success;\r
+    }\r
+    public final boolean synpred9_XPath() {\r
+        state.backtracking++;\r
+        int start = input.mark();\r
+        try {\r
+            synpred9_XPath_fragment(); // can never throw exception\r
+        } catch (RecognitionException re) {\r
+            System.err.println("impossible: "+re);\r
+        }\r
+        boolean success = !state.failed;\r
+        input.rewind(start);\r
+        state.backtracking--;\r
+        state.failed=false;\r
+        return success;\r
+    }\r
+    public final boolean synpred7_XPath() {\r
+        state.backtracking++;\r
+        int start = input.mark();\r
+        try {\r
+            synpred7_XPath_fragment(); // can never throw exception\r
+        } catch (RecognitionException re) {\r
+            System.err.println("impossible: "+re);\r
+        }\r
+        boolean success = !state.failed;\r
+        input.rewind(start);\r
+        state.backtracking--;\r
+        state.failed=false;\r
+        return success;\r
+    }\r
+    public final boolean synpred4_XPath() {\r
+        state.backtracking++;\r
+        int start = input.mark();\r
+        try {\r
+            synpred4_XPath_fragment(); // can never throw exception\r
+        } catch (RecognitionException re) {\r
+            System.err.println("impossible: "+re);\r
+        }\r
+        boolean success = !state.failed;\r
+        input.rewind(start);\r
+        state.backtracking--;\r
+        state.failed=false;\r
+        return success;\r
+    }\r
+    public final boolean synpred2_XPath() {\r
+        state.backtracking++;\r
+        int start = input.mark();\r
+        try {\r
+            synpred2_XPath_fragment(); // can never throw exception\r
+        } catch (RecognitionException re) {\r
+            System.err.println("impossible: "+re);\r
+        }\r
+        boolean success = !state.failed;\r
+        input.rewind(start);\r
+        state.backtracking--;\r
+        state.failed=false;\r
+        return success;\r
+    }\r
+    public final boolean synpred1_XPath() {\r
+        state.backtracking++;\r
+        int start = input.mark();\r
+        try {\r
+            synpred1_XPath_fragment(); // can never throw exception\r
+        } catch (RecognitionException re) {\r
+            System.err.println("impossible: "+re);\r
+        }\r
+        boolean success = !state.failed;\r
+        input.rewind(start);\r
+        state.backtracking--;\r
+        state.failed=false;\r
+        return success;\r
+    }\r
+\r
+\r
+    protected DFA6 dfa6 = new DFA6(this);\r
+    static final String DFA6_eotS =\r
+        "\17\uffff";\r
+    static final String DFA6_eofS =\r
+        "\17\uffff";\r
+    static final String DFA6_minS =\r
+        "\1\24\6\0\10\uffff";\r
+    static final String DFA6_maxS =\r
+        "\1\44\6\0\10\uffff";\r
+    static final String DFA6_acceptS =\r
+        "\7\uffff\1\1\1\2\1\3\1\4\1\5\1\6\1\7\1\10";\r
+    static final String DFA6_specialS =\r
+        "\1\uffff\1\0\1\1\1\2\1\3\1\4\1\5\10\uffff}>";\r
+    static final String[] DFA6_transitionS = {\r
+            "\1\4\1\5\2\uffff\1\6\7\uffff\1\2\1\uffff\1\3\1\uffff\1\1",\r
+            "\1\uffff",\r
+            "\1\uffff",\r
+            "\1\uffff",\r
+            "\1\uffff",\r
+            "\1\uffff",\r
+            "\1\uffff",\r
+            "",\r
+            "",\r
+            "",\r
+            "",\r
+            "",\r
+            "",\r
+            "",\r
+            ""\r
+    };\r
+\r
+    static final short[] DFA6_eot = DFA.unpackEncodedString(DFA6_eotS);\r
+    static final short[] DFA6_eof = DFA.unpackEncodedString(DFA6_eofS);\r
+    static final char[] DFA6_min = DFA.unpackEncodedStringToUnsignedChars(DFA6_minS);\r
+    static final char[] DFA6_max = DFA.unpackEncodedStringToUnsignedChars(DFA6_maxS);\r
+    static final short[] DFA6_accept = DFA.unpackEncodedString(DFA6_acceptS);\r
+    static final short[] DFA6_special = DFA.unpackEncodedString(DFA6_specialS);\r
+    static final short[][] DFA6_transition;\r
+\r
+    static {\r
+        int numStates = DFA6_transitionS.length;\r
+        DFA6_transition = new short[numStates][];\r
+        for (int i=0; i<numStates; i++) {\r
+            DFA6_transition[i] = DFA.unpackEncodedString(DFA6_transitionS[i]);\r
+        }\r
+    }\r
+\r
+    class DFA6 extends DFA {\r
+\r
+        public DFA6(BaseRecognizer recognizer) {\r
+            this.recognizer = recognizer;\r
+            this.decisionNumber = 6;\r
+            this.eot = DFA6_eot;\r
+            this.eof = DFA6_eof;\r
+            this.min = DFA6_min;\r
+            this.max = DFA6_max;\r
+            this.accept = DFA6_accept;\r
+            this.special = DFA6_special;\r
+            this.transition = DFA6_transition;\r
+        }\r
+        public String getDescription() {\r
+            return "210:1: fragment comparisonExpr : ( pathExpr | ( pathExpr '=' )=> pathExpr '=' pathExpr | ( pathExpr '!=' )=> pathExpr '!=' pathExpr | ( pathExpr '>' )=> pathExpr '>' pathExpr | ( pathExpr '>=' )=> pathExpr '>=' pathExpr | ( pathExpr '<' )=> pathExpr '<' pathExpr | ( pathExpr '<=' )=> pathExpr '<=' pathExpr | ( pathExpr '~=' )=> pathExpr '~=' pathExpr );";\r
+        }\r
+        public int specialStateTransition(int s, IntStream _input) throws NoViableAltException {\r
+            TokenStream input = (TokenStream)_input;\r
+               int _s = s;\r
+            switch ( s ) {\r
+                    case 0 : \r
+                        int LA6_1 = input.LA(1);\r
+\r
+                         \r
+                        int index6_1 = input.index();\r
+                        input.rewind();\r
+                        s = -1;\r
+                        if ( (true) ) {s = 7;}\r
+\r
+                        else if ( (synpred3_XPath()) ) {s = 8;}\r
+\r
+                        else if ( (synpred4_XPath()) ) {s = 9;}\r
+\r
+                        else if ( (synpred5_XPath()) ) {s = 10;}\r
+\r
+                        else if ( (synpred6_XPath()) ) {s = 11;}\r
+\r
+                        else if ( (synpred7_XPath()) ) {s = 12;}\r
+\r
+                        else if ( (synpred8_XPath()) ) {s = 13;}\r
+\r
+                        else if ( (synpred9_XPath()) ) {s = 14;}\r
+\r
+                         \r
+                        input.seek(index6_1);\r
+                        if ( s>=0 ) return s;\r
+                        break;\r
+                    case 1 : \r
+                        int LA6_2 = input.LA(1);\r
+\r
+                         \r
+                        int index6_2 = input.index();\r
+                        input.rewind();\r
+                        s = -1;\r
+                        if ( (true) ) {s = 7;}\r
+\r
+                        else if ( (synpred3_XPath()) ) {s = 8;}\r
+\r
+                        else if ( (synpred4_XPath()) ) {s = 9;}\r
+\r
+                        else if ( (synpred5_XPath()) ) {s = 10;}\r
+\r
+                        else if ( (synpred6_XPath()) ) {s = 11;}\r
+\r
+                        else if ( (synpred7_XPath()) ) {s = 12;}\r
+\r
+                        else if ( (synpred8_XPath()) ) {s = 13;}\r
+\r
+                        else if ( (synpred9_XPath()) ) {s = 14;}\r
+\r
+                         \r
+                        input.seek(index6_2);\r
+                        if ( s>=0 ) return s;\r
+                        break;\r
+                    case 2 : \r
+                        int LA6_3 = input.LA(1);\r
+\r
+                         \r
+                        int index6_3 = input.index();\r
+                        input.rewind();\r
+                        s = -1;\r
+                        if ( (true) ) {s = 7;}\r
+\r
+                        else if ( (synpred3_XPath()) ) {s = 8;}\r
+\r
+                        else if ( (synpred4_XPath()) ) {s = 9;}\r
+\r
+                        else if ( (synpred5_XPath()) ) {s = 10;}\r
+\r
+                        else if ( (synpred6_XPath()) ) {s = 11;}\r
+\r
+                        else if ( (synpred7_XPath()) ) {s = 12;}\r
+\r
+                        else if ( (synpred8_XPath()) ) {s = 13;}\r
+\r
+                        else if ( (synpred9_XPath()) ) {s = 14;}\r
+\r
+                         \r
+                        input.seek(index6_3);\r
+                        if ( s>=0 ) return s;\r
+                        break;\r
+                    case 3 : \r
+                        int LA6_4 = input.LA(1);\r
+\r
+                         \r
+                        int index6_4 = input.index();\r
+                        input.rewind();\r
+                        s = -1;\r
+                        if ( (true) ) {s = 7;}\r
+\r
+                        else if ( (synpred3_XPath()) ) {s = 8;}\r
+\r
+                        else if ( (synpred4_XPath()) ) {s = 9;}\r
+\r
+                        else if ( (synpred5_XPath()) ) {s = 10;}\r
+\r
+                        else if ( (synpred6_XPath()) ) {s = 11;}\r
+\r
+                        else if ( (synpred7_XPath()) ) {s = 12;}\r
+\r
+                        else if ( (synpred8_XPath()) ) {s = 13;}\r
+\r
+                        else if ( (synpred9_XPath()) ) {s = 14;}\r
+\r
+                         \r
+                        input.seek(index6_4);\r
+                        if ( s>=0 ) return s;\r
+                        break;\r
+                    case 4 : \r
+                        int LA6_5 = input.LA(1);\r
+\r
+                         \r
+                        int index6_5 = input.index();\r
+                        input.rewind();\r
+                        s = -1;\r
+                        if ( (true) ) {s = 7;}\r
+\r
+                        else if ( (synpred3_XPath()) ) {s = 8;}\r
+\r
+                        else if ( (synpred4_XPath()) ) {s = 9;}\r
+\r
+                        else if ( (synpred5_XPath()) ) {s = 10;}\r
+\r
+                        else if ( (synpred6_XPath()) ) {s = 11;}\r
+\r
+                        else if ( (synpred7_XPath()) ) {s = 12;}\r
+\r
+                        else if ( (synpred8_XPath()) ) {s = 13;}\r
+\r
+                        else if ( (synpred9_XPath()) ) {s = 14;}\r
+\r
+                         \r
+                        input.seek(index6_5);\r
+                        if ( s>=0 ) return s;\r
+                        break;\r
+                    case 5 : \r
+                        int LA6_6 = input.LA(1);\r
+\r
+                         \r
+                        int index6_6 = input.index();\r
+                        input.rewind();\r
+                        s = -1;\r
+                        if ( (true) ) {s = 7;}\r
+\r
+                        else if ( (synpred3_XPath()) ) {s = 8;}\r
+\r
+                        else if ( (synpred4_XPath()) ) {s = 9;}\r
+\r
+                        else if ( (synpred5_XPath()) ) {s = 10;}\r
+\r
+                        else if ( (synpred6_XPath()) ) {s = 11;}\r
+\r
+                        else if ( (synpred7_XPath()) ) {s = 12;}\r
+\r
+                        else if ( (synpred8_XPath()) ) {s = 13;}\r
+\r
+                        else if ( (synpred9_XPath()) ) {s = 14;}\r
+\r
+                         \r
+                        input.seek(index6_6);\r
+                        if ( s>=0 ) return s;\r
+                        break;\r
+            }\r
+            if (state.backtracking>0) {state.failed=true; return -1;}\r
+            NoViableAltException nvae =\r
+                new NoViableAltException(getDescription(), 6, _s, input);\r
+            error(nvae);\r
+            throw nvae;\r
+        }\r
+    }\r
\r
+\r
+    public static final BitSet FOLLOW_locationExpr_in_xpath620 = new BitSet(new long[]{0x0000000000000002L});\r
+    public static final BitSet FOLLOW_relativePath_in_locationExpr646 = new BitSet(new long[]{0x0000000000000002L});\r
+    public static final BitSet FOLLOW_absolutePath_in_locationExpr652 = new BitSet(new long[]{0x0000000000000002L});\r
+    public static final BitSet FOLLOW_step_in_relativePath669 = new BitSet(new long[]{0x0000000000000002L});\r
+    public static final BitSet FOLLOW_step_in_relativePath694 = new BitSet(new long[]{0x0000000400000000L});\r
+    public static final BitSet FOLLOW_34_in_relativePath696 = new BitSet(new long[]{0x0000001100000000L});\r
+    public static final BitSet FOLLOW_relativePath_in_relativePath698 = new BitSet(new long[]{0x0000000000000002L});\r
+    public static final BitSet FOLLOW_step_in_relativePath729 = new BitSet(new long[]{0x0000000800000000L});\r
+    public static final BitSet FOLLOW_35_in_relativePath731 = new BitSet(new long[]{0x0000001100000000L});\r
+    public static final BitSet FOLLOW_relativePath_in_relativePath733 = new BitSet(new long[]{0x0000000000000002L});\r
+    public static final BitSet FOLLOW_34_in_absolutePath764 = new BitSet(new long[]{0x0000001100000000L});\r
+    public static final BitSet FOLLOW_relativePath_in_absolutePath766 = new BitSet(new long[]{0x0000000000000002L});\r
+    public static final BitSet FOLLOW_nodeTest_in_step800 = new BitSet(new long[]{0x0000002000000002L});\r
+    public static final BitSet FOLLOW_predicate_in_step802 = new BitSet(new long[]{0x0000002000000002L});\r
+    public static final BitSet FOLLOW_36_in_nodeTest830 = new BitSet(new long[]{0x0000000100000000L});\r
+    public static final BitSet FOLLOW_QName_in_nodeTest834 = new BitSet(new long[]{0x0000000004000000L});\r
+    public static final BitSet FOLLOW_Colon_in_nodeTest836 = new BitSet(new long[]{0x0000000100000000L});\r
+    public static final BitSet FOLLOW_QName_in_nodeTest840 = new BitSet(new long[]{0x0000000000000002L});\r
+    public static final BitSet FOLLOW_37_in_predicate858 = new BitSet(new long[]{0x0000001501300000L});\r
+    public static final BitSet FOLLOW_expr_in_predicate860 = new BitSet(new long[]{0x0000004000000000L});\r
+    public static final BitSet FOLLOW_38_in_predicate862 = new BitSet(new long[]{0x0000000000000002L});\r
+    public static final BitSet FOLLOW_comparisonExpr_in_expr885 = new BitSet(new long[]{0x0000000000000002L});\r
+    public static final BitSet FOLLOW_pathExpr_in_comparisonExpr900 = new BitSet(new long[]{0x0000000000000002L});\r
+    public static final BitSet FOLLOW_pathExpr_in_comparisonExpr914 = new BitSet(new long[]{0x0000008000000000L});\r
+    public static final BitSet FOLLOW_39_in_comparisonExpr916 = new BitSet(new long[]{0x0000001501300000L});\r
+    public static final BitSet FOLLOW_pathExpr_in_comparisonExpr918 = new BitSet(new long[]{0x0000000000000002L});\r
+    public static final BitSet FOLLOW_pathExpr_in_comparisonExpr932 = new BitSet(new long[]{0x0000010000000000L});\r
+    public static final BitSet FOLLOW_40_in_comparisonExpr934 = new BitSet(new long[]{0x0000001501300000L});\r
+    public static final BitSet FOLLOW_pathExpr_in_comparisonExpr936 = new BitSet(new long[]{0x0000000000000002L});\r
+    public static final BitSet FOLLOW_pathExpr_in_comparisonExpr950 = new BitSet(new long[]{0x0000020000000000L});\r
+    public static final BitSet FOLLOW_41_in_comparisonExpr952 = new BitSet(new long[]{0x0000001501300000L});\r
+    public static final BitSet FOLLOW_pathExpr_in_comparisonExpr954 = new BitSet(new long[]{0x0000000000000002L});\r
+    public static final BitSet FOLLOW_pathExpr_in_comparisonExpr968 = new BitSet(new long[]{0x0000040000000000L});\r
+    public static final BitSet FOLLOW_42_in_comparisonExpr970 = new BitSet(new long[]{0x0000001501300000L});\r
+    public static final BitSet FOLLOW_pathExpr_in_comparisonExpr972 = new BitSet(new long[]{0x0000000000000002L});\r
+    public static final BitSet FOLLOW_pathExpr_in_comparisonExpr986 = new BitSet(new long[]{0x0000080000000000L});\r
+    public static final BitSet FOLLOW_43_in_comparisonExpr988 = new BitSet(new long[]{0x0000001501300000L});\r
+    public static final BitSet FOLLOW_pathExpr_in_comparisonExpr990 = new BitSet(new long[]{0x0000000000000002L});\r
+    public static final BitSet FOLLOW_pathExpr_in_comparisonExpr1004 = new BitSet(new long[]{0x0000100000000000L});\r
+    public static final BitSet FOLLOW_44_in_comparisonExpr1006 = new BitSet(new long[]{0x0000001501300000L});\r
+    public static final BitSet FOLLOW_pathExpr_in_comparisonExpr1008 = new BitSet(new long[]{0x0000000000000002L});\r
+    public static final BitSet FOLLOW_pathExpr_in_comparisonExpr1022 = new BitSet(new long[]{0x0000200000000000L});\r
+    public static final BitSet FOLLOW_45_in_comparisonExpr1024 = new BitSet(new long[]{0x0000001501300000L});\r
+    public static final BitSet FOLLOW_pathExpr_in_comparisonExpr1026 = new BitSet(new long[]{0x0000000000000002L});\r
+    public static final BitSet FOLLOW_locationExpr_in_pathExpr1042 = new BitSet(new long[]{0x0000000000000002L});\r
+    public static final BitSet FOLLOW_primaryExpr_in_pathExpr1048 = new BitSet(new long[]{0x0000000000000002L});\r
+    public static final BitSet FOLLOW_String_in_primaryExpr1067 = new BitSet(new long[]{0x0000000000000002L});\r
+    public static final BitSet FOLLOW_Integer_in_primaryExpr1073 = new BitSet(new long[]{0x0000000000000002L});\r
+    public static final BitSet FOLLOW_Double_in_primaryExpr1079 = new BitSet(new long[]{0x0000000000000002L});\r
+    public static final BitSet FOLLOW_functionCall_in_primaryExpr1085 = new BitSet(new long[]{0x0000000000000002L});\r
+    public static final BitSet FOLLOW_QName_in_functionCall1105 = new BitSet(new long[]{0x0000400000000000L});\r
+    public static final BitSet FOLLOW_46_in_functionCall1107 = new BitSet(new long[]{0x0000801501300000L});\r
+    public static final BitSet FOLLOW_expr_in_functionCall1110 = new BitSet(new long[]{0x0000800002000000L});\r
+    public static final BitSet FOLLOW_Comma_in_functionCall1113 = new BitSet(new long[]{0x0000001501300000L});\r
+    public static final BitSet FOLLOW_expr_in_functionCall1115 = new BitSet(new long[]{0x0000800002000000L});\r
+    public static final BitSet FOLLOW_47_in_functionCall1121 = new BitSet(new long[]{0x0000000000000002L});\r
+    public static final BitSet FOLLOW_step_in_synpred1_XPath687 = new BitSet(new long[]{0x0000000400000000L});\r
+    public static final BitSet FOLLOW_34_in_synpred1_XPath689 = new BitSet(new long[]{0x0000000000000002L});\r
+    public static final BitSet FOLLOW_step_in_synpred2_XPath722 = new BitSet(new long[]{0x0000000800000000L});\r
+    public static final BitSet FOLLOW_35_in_synpred2_XPath724 = new BitSet(new long[]{0x0000000000000002L});\r
+    public static final BitSet FOLLOW_pathExpr_in_synpred3_XPath907 = new BitSet(new long[]{0x0000008000000000L});\r
+    public static final BitSet FOLLOW_39_in_synpred3_XPath909 = new BitSet(new long[]{0x0000000000000002L});\r
+    public static final BitSet FOLLOW_pathExpr_in_synpred4_XPath925 = new BitSet(new long[]{0x0000010000000000L});\r
+    public static final BitSet FOLLOW_40_in_synpred4_XPath927 = new BitSet(new long[]{0x0000000000000002L});\r
+    public static final BitSet FOLLOW_pathExpr_in_synpred5_XPath943 = new BitSet(new long[]{0x0000020000000000L});\r
+    public static final BitSet FOLLOW_41_in_synpred5_XPath945 = new BitSet(new long[]{0x0000000000000002L});\r
+    public static final BitSet FOLLOW_pathExpr_in_synpred6_XPath961 = new BitSet(new long[]{0x0000040000000000L});\r
+    public static final BitSet FOLLOW_42_in_synpred6_XPath963 = new BitSet(new long[]{0x0000000000000002L});\r
+    public static final BitSet FOLLOW_pathExpr_in_synpred7_XPath979 = new BitSet(new long[]{0x0000080000000000L});\r
+    public static final BitSet FOLLOW_43_in_synpred7_XPath981 = new BitSet(new long[]{0x0000000000000002L});\r
+    public static final BitSet FOLLOW_pathExpr_in_synpred8_XPath997 = new BitSet(new long[]{0x0000100000000000L});\r
+    public static final BitSet FOLLOW_44_in_synpred8_XPath999 = new BitSet(new long[]{0x0000000000000002L});\r
+    public static final BitSet FOLLOW_pathExpr_in_synpred9_XPath1015 = new BitSet(new long[]{0x0000200000000000L});\r
+    public static final BitSet FOLLOW_45_in_synpred9_XPath1017 = new BitSet(new long[]{0x0000000000000002L});\r
+\r
+}
\ No newline at end of file
diff --git a/src/main/java/org/xerial/lens/relation/query/lang/XPathExpr.java b/src/main/java/org/xerial/lens/relation/query/lang/XPathExpr.java
new file mode 100644 (file)
index 0000000..5c9a672
--- /dev/null
@@ -0,0 +1,89 @@
+/*--------------------------------------------------------------------------\r
+ *  Copyright 2009 Taro L. Saito\r
+ *\r
+ *  Licensed under the Apache License, Version 2.0 (the "License");\r
+ *  you may not use this file except in compliance with the License.\r
+ *  You may obtain a copy of the License at\r
+ *\r
+ *     http://www.apache.org/licenses/LICENSE-2.0\r
+ *\r
+ *  Unless required by applicable law or agreed to in writing, software\r
+ *  distributed under the License is distributed on an "AS IS" BASIS,\r
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r
+ *  See the License for the specific language governing permissions and\r
+ *  limitations under the License.\r
+ *--------------------------------------------------------------------------*/\r
+//--------------------------------------\r
+// XerialJ\r
+//\r
+// XPathExpr.java\r
+// Since: Sep 29, 2009 2:26:59 PM\r
+//\r
+// $URL$\r
+// $Author$\r
+//--------------------------------------\r
+package org.xerial.lens.relation.query.lang;\r
+\r
+import java.util.ArrayList;\r
+import java.util.List;\r
+\r
+import org.antlr.runtime.ANTLRStringStream;\r
+import org.antlr.runtime.CommonTokenStream;\r
+import org.antlr.runtime.RecognitionException;\r
+import org.antlr.runtime.tree.Tree;\r
+import org.xerial.core.XerialErrorCode;\r
+import org.xerial.core.XerialException;\r
+import org.xerial.lens.Lens;\r
+import org.xerial.lens.relation.query.impl.XPathLexer;\r
+import org.xerial.lens.relation.query.impl.XPathParser;\r
+import org.xerial.lens.relation.query.impl.XPathParser.xpath_return;\r
+import org.xerial.util.antlr.ANTLRUtil;\r
+import org.xerial.util.log.Logger;\r
+\r
+/**\r
+ * XPath expression\r
+ * \r
+ * @author leo\r
+ * \r
+ */\r
+public class XPathExpr {\r
+\r
+    private static Logger _logger = Logger.getLogger(XPathExpr.class);\r
+\r
+    public static enum Axis {\r
+        Relative, PC, AD\r
+    }\r
+\r
+    public static class Step {\r
+        public String name;\r
+        public Axis axis = Axis.Relative;\r
+        public List<Step> step = new ArrayList<Step>();\r
+        public List<Predicate> prediate = new ArrayList<Predicate>();\r
+    }\r
+\r
+    public static class Predicate {\r
+\r
+    }\r
+\r
+    public Step step;\r
+\r
+    public static XPathExpr parse(String xpathExpr) throws XerialException {\r
+        XPathLexer lexer = new XPathLexer(new ANTLRStringStream(xpathExpr));\r
+        CommonTokenStream token = new CommonTokenStream(lexer);\r
+        XPathParser parser = new XPathParser(token);\r
+\r
+        try {\r
+            xpath_return r = parser.xpath();\r
+\r
+            if (_logger.isDebugEnabled())\r
+                _logger.debug(ANTLRUtil.parseTree((Tree) r.getTree(), XPathParser.tokenNames));\r
+\r
+            return Lens.loadANTLRParseTree(XPathExpr.class, (Tree) r.getTree(),\r
+                    XPathParser.tokenNames);\r
+        }\r
+        catch (RecognitionException e) {\r
+            throw new XerialException(XerialErrorCode.PARSE_ERROR, e);\r
+        }\r
+\r
+    }\r
+}\r
diff --git a/src/test/java/org/xerial/lens/relation/query/lang/XPathExprTest.java b/src/test/java/org/xerial/lens/relation/query/lang/XPathExprTest.java
new file mode 100644 (file)
index 0000000..2b1c97c
--- /dev/null
@@ -0,0 +1,59 @@
+/*--------------------------------------------------------------------------\r
+ *  Copyright 2009 Taro L. Saito\r
+ *\r
+ *  Licensed under the Apache License, Version 2.0 (the "License");\r
+ *  you may not use this file except in compliance with the License.\r
+ *  You may obtain a copy of the License at\r
+ *\r
+ *     http://www.apache.org/licenses/LICENSE-2.0\r
+ *\r
+ *  Unless required by applicable law or agreed to in writing, software\r
+ *  distributed under the License is distributed on an "AS IS" BASIS,\r
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r
+ *  See the License for the specific language governing permissions and\r
+ *  limitations under the License.\r
+ *--------------------------------------------------------------------------*/\r
+//--------------------------------------\r
+// XerialJ\r
+//\r
+// XPathExprTest.java\r
+// Since: Sep 29, 2009 2:45:48 PM\r
+//\r
+// $URL$\r
+// $Author$\r
+//--------------------------------------\r
+package org.xerial.lens.relation.query.lang;\r
+\r
+import org.junit.After;\r
+import org.junit.Before;\r
+import org.junit.Test;\r
+import org.xerial.core.XerialException;\r
+import org.xerial.lens.Lens;\r
+import org.xerial.util.log.Logger;\r
+\r
+public class XPathExprTest {\r
+\r
+    private static Logger _logger = Logger.getLogger(XPathExprTest.class);\r
+\r
+    @Before\r
+    public void setUp() throws Exception {}\r
+\r
+    @After\r
+    public void tearDown() throws Exception {}\r
+\r
+    public void parse(String expr) throws XerialException {\r
+        XPathExpr e = XPathExpr.parse(expr);\r
+        _logger.info(String.format("%s\n%s", expr, Lens.toSilk(e)));\r
+    }\r
+\r
+    @Test\r
+    public void testParse() throws Exception {\r
+\r
+        parse("/A/B");\r
+        parse("//A");\r
+        parse("//book");\r
+        parse("//title");\r
+        parse("//A[B][C]");\r
+    }\r
+\r
+}\r