OSDN Git Service

add LogWriter interface to enable switch log format
authorleo <leo@ae02f08e-27ec-0310-ae8c-8ba02fe2eafd>
Tue, 13 Oct 2009 06:58:23 +0000 (06:58 +0000)
committerleo <leo@ae02f08e-27ec-0310-ae8c-8ba02fe2eafd>
Tue, 13 Oct 2009 06:58:23 +0000 (06:58 +0000)
git-svn-id: http://www.xerial.org/svn/project/XerialJ/trunk/xerial-core@3634 ae02f08e-27ec-0310-ae8c-8ba02fe2eafd

16 files changed:
src/main/java/org/xerial/lens/relation/NodeBase.java
src/main/java/org/xerial/lens/relation/Tuple.java
src/main/java/org/xerial/lens/relation/TupleElement.java
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/lang/RelationExpr.java
src/main/java/org/xerial/silk/SilkWriter.java
src/main/java/org/xerial/silk/cui/SilkMain.java
src/main/java/org/xerial/util/log/LogWriter.java [new file with mode: 0644]
src/main/java/org/xerial/util/log/Logger.java
src/main/java/org/xerial/util/log/SilkLogWriter.java [new file with mode: 0644]
src/main/java/org/xerial/util/log/SimpleLogWriter.java [new file with mode: 0644]
src/test/java/org/xerial/lens/LensTest.java
src/test/java/org/xerial/silk/SilkWriterTest.java

index 90260e8..8730583 100644 (file)
@@ -38,7 +38,7 @@ import org.xerial.core.XerialErrorCode;
 public abstract class NodeBase<NodeType> implements TupleElement<NodeType> {\r
     protected NodeBase() {}\r
 \r
-    public boolean isNode() {\r
+    public boolean isAtom() {\r
         return true;\r
     }\r
 \r
@@ -75,7 +75,7 @@ public abstract class NodeBase<NodeType> implements TupleElement<NodeType> {
     }\r
 \r
     @SuppressWarnings("unchecked")\r
-    public NodeType castToNode() {\r
+    public NodeType castToElement() {\r
         return (NodeType) this;\r
     }\r
 \r
index 58d348b..4b3d06a 100644 (file)
@@ -145,7 +145,7 @@ public class Tuple<Element> implements TupleElement<Element>, Iterable<TupleElem
         return nodeList.addAll(relationFragment);\r
     }\r
 \r
-    public Element castToNode() {\r
+    public Element castToElement() {\r
         return null;\r
     }\r
 \r
@@ -153,7 +153,7 @@ public class Tuple<Element> implements TupleElement<Element>, Iterable<TupleElem
         return this;\r
     }\r
 \r
-    public boolean isNode() {\r
+    public boolean isAtom() {\r
         return true;\r
     }\r
 \r
@@ -172,7 +172,7 @@ public class Tuple<Element> implements TupleElement<Element>, Iterable<TupleElem
     @SuppressWarnings("unchecked")\r
     public Element getNode(int index) {\r
         TupleElement<Element> node = get(index);\r
-        if (node.isNode())\r
+        if (node.isAtom())\r
             return (Element) node;\r
         else\r
             throw new XerialError(XerialErrorCode.MISSING_ELEMENT, "node is not found: " + index);\r
@@ -184,7 +184,7 @@ public class Tuple<Element> implements TupleElement<Element>, Iterable<TupleElem
         if (node == null)\r
             return null;\r
 \r
-        if (node.isNode())\r
+        if (node.isAtom())\r
             return (Element) node;\r
         else\r
             throw new XerialError(XerialErrorCode.MISSING_ELEMENT, "node is not found: " + index);\r
@@ -198,7 +198,7 @@ public class Tuple<Element> implements TupleElement<Element>, Iterable<TupleElem
     }\r
 \r
     private void flatten(List<TupleElement<Element>> result, TupleElement<Element> cell) {\r
-        if (cell.isNode())\r
+        if (cell.isAtom())\r
             result.add(cell);\r
         else {\r
             for (TupleElement<Element> each : cell.castToTuple()) {\r
index 0bbef57..bfd4ae2 100644 (file)
@@ -34,11 +34,11 @@ package org.xerial.lens.relation;
  */\r
 public interface TupleElement<Element> {\r
     /**\r
-     * Returns true if this cell is a singleton\r
+     * Returns true if this element is a singleton, i.e. no more nested nodes\r
      * \r
      * @return\r
      */\r
-    public boolean isNode();\r
+    public boolean isAtom();\r
 \r
     /**\r
      * Returns true if this cell is a tuple\r
@@ -48,9 +48,9 @@ public interface TupleElement<Element> {
     public boolean isTuple();\r
 \r
     /**\r
-     * Get the number of elements contained in this cell. When this cell is an\r
-     * atom, the size will be 1. When a tuple, the returned size is the tuple\r
-     * size.\r
+     * Get the number of elements contained in this element. When this element\r
+     * is an atom, the size will be 1. When a tuple, the returned size is the\r
+     * tuple size.\r
      * \r
      * @return\r
      */\r
@@ -78,7 +78,7 @@ public interface TupleElement<Element> {
      * \r
      * @return\r
      */\r
-    Element castToNode();\r
+    Element castToElement();\r
 \r
     /**\r
      * If this cell is tuple, then return tuple. otherwise return null\r
index 8371c60..897d91e 100644 (file)
@@ -39,7 +39,6 @@ tokens {
   NODEVALUE;\r
   NAME;\r
   VALUE;\r
-  INDEX;\r
 }\r
 \r
 \r
@@ -99,7 +98,6 @@ package org.xerial.lens.relation.query.impl;
 //--------------------------------------\r
 package org.xerial.lens.relation.query.impl;\r
 \r
-import org.xerial.lens.relation.TupleIndex;\r
 }\r
 \r
 @lexer::members {\r
@@ -107,7 +105,6 @@ import org.xerial.lens.relation.TupleIndex;
 }\r
 \r
 @members {\r
-   private TupleIndex currentIndex = null;\r
 } \r
 \r
 // lexer rules\r
@@ -190,24 +187,7 @@ expr:
   ; \r
  \r
 relation \r
-scope \r
-{\r
-  int nodeItemIndex;\r
-  TupleIndex relationIndex; \r
-}\r
-@init \r
-{\r
-  $relation::nodeItemIndex = 1;\r
-  if(currentIndex == null)\r
-    currentIndex = new TupleIndex(1);\r
-  else\r
-    currentIndex = new TupleIndex(currentIndex, 1); \r
-}\r
-@after\r
-{\r
-  currentIndex = currentIndex.parent();\r
-}\r
-   : relation_i -> ^(RELATION relation_i INDEX[currentIndex.toString()])\r
+   : relation_i -> ^(RELATION relation_i)\r
 ;\r
 \r
 relation_i: nodeName alias? LParen! nodeItem (Comma! nodeItem)* RParen!;\r
@@ -225,11 +205,8 @@ alias: As QName -> ALIAS[$QName.text];
 \r
 fragment\r
 nodeItem\r
-@init {\r
-  int index = $relation::nodeItemIndex++;\r
-}\r
   : nodeName alias? nodeValue? \r
-    -> ^(NODE nodeName alias? nodeValue? INDEX[new TupleIndex(currentIndex, index).toString()])\r
+    -> ^(NODE nodeName alias? nodeValue?)\r
   | relation \r
   ;\r
 \r
index d20e7ca..5b4c454 100644 (file)
@@ -1,52 +1,51 @@
-INDEX=15\r
 PATTERNMATCH=9\r
-Match=40\r
-Regex=41\r
-Digit=19\r
-Frac=28\r
-HexDigit=21\r
+Match=39\r
+Regex=40\r
+Digit=18\r
+Frac=27\r
+HexDigit=20\r
 QUERY=4\r
 ALIAS=11\r
 VALUE=14\r
-Letter=20\r
-Comma=43\r
-Dot=42\r
-EscapeSequence=23\r
-Integer=27\r
-WhiteSpace=52\r
+Letter=19\r
+Comma=42\r
+Dot=41\r
+EscapeSequence=22\r
+Integer=26\r
+WhiteSpace=51\r
 OPERATOR=7\r
-False=32\r
-Colon=44\r
-LineComment=17\r
+False=31\r
+LineComment=16\r
+Colon=43\r
 NODEVALUE=12\r
-As=45\r
-SafeFirstLetter=50\r
-Null=33\r
-Star=48\r
-Eq=38\r
-Exp=29\r
-QNameChar=53\r
+As=44\r
+SafeFirstLetter=49\r
+Null=32\r
+Star=47\r
+Eq=37\r
+Exp=28\r
+QNameChar=52\r
 RELATION=5\r
-Gt=35\r
-RParen=47\r
-UnicodeChar=22\r
-StringChar=24\r
-True=31\r
+Gt=34\r
+RParen=46\r
+UnicodeChar=21\r
+StringChar=23\r
+True=30\r
 OPERAND=8\r
-LineBreak=18\r
-LParen=46\r
-String=26\r
-SafeLetter=51\r
-LineBreakChar=16\r
+LineBreak=17\r
+LParen=45\r
+String=25\r
+SafeLetter=50\r
+LineBreakChar=15\r
 COMPARE=6\r
-QName=54\r
-Geq=37\r
+QName=53\r
+Geq=36\r
 NODE=10\r
-StringChar_s=25\r
-Neq=39\r
-UnsafeUnicodeChar=49\r
-Double=30\r
-Lt=34\r
+StringChar_s=24\r
+Neq=38\r
+UnsafeUnicodeChar=48\r
+Double=29\r
+Lt=33\r
 NAME=13\r
-Leq=36\r
-WhiteSpaces=55\r
+Leq=35\r
+WhiteSpaces=54\r
index 0964d84..943b0d9 100644 (file)
@@ -1,4 +1,4 @@
-// $ANTLR 3.1.3 Mar 17, 2009 19:23:44 LensQuery.g 2009-09-30 22:59:27\r
+// $ANTLR 3.1.3 Mar 17, 2009 19:23:44 LensQuery.g 2009-10-13 14:02:52\r
 \r
 /*--------------------------------------------------------------------------\r
  *  Copyright 2009 Taro L. Saito\r
@@ -33,59 +33,58 @@ import java.util.List;
 import java.util.ArrayList;\r
 \r
 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=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
+    public static final int Match=39;\r
+    public static final int Regex=40;\r
+    public static final int Digit=18;\r
+    public static final int Frac=27;\r
+    public static final int HexDigit=20;\r
     public static final int QUERY=4;\r
     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=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=52;\r
+    public static final int Letter=19;\r
+    public static final int Comma=42;\r
+    public static final int Dot=41;\r
+    public static final int EscapeSequence=22;\r
+    public static final int Integer=26;\r
+    public static final int WhiteSpace=51;\r
     public static final int OPERATOR=7;\r
-    public static final int False=32;\r
-    public static final int Colon=44;\r
-    public static final int LineComment=17;\r
+    public static final int False=31;\r
+    public static final int LineComment=16;\r
+    public static final int Colon=43;\r
     public static final int NODEVALUE=12;\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=48;\r
-    public static final int Eq=38;\r
-    public static final int Exp=29;\r
-    public static final int QNameChar=53;\r
+    public static final int As=44;\r
+    public static final int SafeFirstLetter=49;\r
+    public static final int Null=32;\r
+    public static final int Star=47;\r
+    public static final int Eq=37;\r
+    public static final int Exp=28;\r
+    public static final int QNameChar=52;\r
     public static final int RELATION=5;\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 Gt=34;\r
+    public static final int RParen=46;\r
+    public static final int UnicodeChar=21;\r
+    public static final int StringChar=23;\r
+    public static final int True=30;\r
     public static final int OPERAND=8;\r
-    public static final int LineBreak=18;\r
-    public static final int LParen=46;\r
-    public static final int String=26;\r
-    public static final int SafeLetter=51;\r
-    public static final int LineBreakChar=16;\r
+    public static final int LineBreak=17;\r
+    public static final int LParen=45;\r
+    public static final int String=25;\r
+    public static final int SafeLetter=50;\r
+    public static final int LineBreakChar=15;\r
     public static final int COMPARE=6;\r
-    public static final int QName=54;\r
-    public static final int Geq=37;\r
+    public static final int QName=53;\r
+    public static final int Geq=36;\r
     public static final int EOF=-1;\r
     public static final int NODE=10;\r
-    public static final int Neq=39;\r
-    public static final int StringChar_s=25;\r
-    public static final int UnsafeUnicodeChar=49;\r
-    public static final int Double=30;\r
-    public static final int Lt=34;\r
+    public static final int Neq=38;\r
+    public static final int StringChar_s=24;\r
+    public static final int UnsafeUnicodeChar=48;\r
+    public static final int Double=29;\r
+    public static final int Lt=33;\r
     public static final int NAME=13;\r
-    public static final int Leq=36;\r
-    public static final int WhiteSpaces=55;\r
+    public static final int Leq=35;\r
+    public static final int WhiteSpaces=54;\r
 \r
 \r
 \r
@@ -106,7 +105,7 @@ public class LensQueryLexer extends Lexer {
     // $ANTLR start "LineBreakChar"\r
     public final void mLineBreakChar() throws RecognitionException {\r
         try {\r
-            // LensQuery.g:116:23: ( '\\n' | '\\r' )\r
+            // LensQuery.g:113:23: ( '\\n' | '\\r' )\r
             // LensQuery.g:\r
             {\r
             if ( input.LA(1)=='\n'||input.LA(1)=='\r' ) {\r
@@ -132,11 +131,11 @@ public class LensQueryLexer extends Lexer {
         try {\r
             int _type = LineComment;\r
             int _channel = DEFAULT_TOKEN_CHANNEL;\r
-            // LensQuery.g:117:12: ( '#' (~ ( LineBreakChar ) )* )\r
-            // LensQuery.g:117:14: '#' (~ ( LineBreakChar ) )*\r
+            // LensQuery.g:114:12: ( '#' (~ ( LineBreakChar ) )* )\r
+            // LensQuery.g:114:14: '#' (~ ( LineBreakChar ) )*\r
             {\r
             match('#'); \r
-            // LensQuery.g:117:18: (~ ( LineBreakChar ) )*\r
+            // LensQuery.g:114:18: (~ ( LineBreakChar ) )*\r
             loop1:\r
             do {\r
                 int alt1=2;\r
@@ -149,7 +148,7 @@ public class LensQueryLexer extends Lexer {
 \r
                 switch (alt1) {\r
                case 1 :\r
-                   // LensQuery.g:117:18: ~ ( LineBreakChar )\r
+                   // LensQuery.g:114: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
@@ -186,10 +185,10 @@ public class LensQueryLexer extends Lexer {
         try {\r
             int _type = LineBreak;\r
             int _channel = DEFAULT_TOKEN_CHANNEL;\r
-            // LensQuery.g:120:10: ( ( '\\r' '\\n' | '\\r' | '\\n' ) )\r
-            // LensQuery.g:120:12: ( '\\r' '\\n' | '\\r' | '\\n' )\r
+            // LensQuery.g:117:10: ( ( '\\r' '\\n' | '\\r' | '\\n' ) )\r
+            // LensQuery.g:117:12: ( '\\r' '\\n' | '\\r' | '\\n' )\r
             {\r
-            // LensQuery.g:120:12: ( '\\r' '\\n' | '\\r' | '\\n' )\r
+            // LensQuery.g:117:12: ( '\\r' '\\n' | '\\r' | '\\n' )\r
             int alt2=3;\r
             int LA2_0 = input.LA(1);\r
 \r
@@ -213,7 +212,7 @@ public class LensQueryLexer extends Lexer {
             }\r
             switch (alt2) {\r
                 case 1 :\r
-                    // LensQuery.g:120:13: '\\r' '\\n'\r
+                    // LensQuery.g:117:13: '\\r' '\\n'\r
                     {\r
                     match('\r'); \r
                     match('\n'); \r
@@ -221,14 +220,14 @@ public class LensQueryLexer extends Lexer {
                     }\r
                     break;\r
                 case 2 :\r
-                    // LensQuery.g:120:25: '\\r'\r
+                    // LensQuery.g:117:25: '\\r'\r
                     {\r
                     match('\r'); \r
 \r
                     }\r
                     break;\r
                 case 3 :\r
-                    // LensQuery.g:120:32: '\\n'\r
+                    // LensQuery.g:117:32: '\\n'\r
                     {\r
                     match('\n'); \r
 \r
@@ -252,8 +251,8 @@ public class LensQueryLexer extends Lexer {
     // $ANTLR start "Digit"\r
     public final void mDigit() throws RecognitionException {\r
         try {\r
-            // LensQuery.g:123:15: ( '0' .. '9' )\r
-            // LensQuery.g:123:17: '0' .. '9'\r
+            // LensQuery.g:120:15: ( '0' .. '9' )\r
+            // LensQuery.g:120:17: '0' .. '9'\r
             {\r
             matchRange('0','9'); \r
 \r
@@ -268,7 +267,7 @@ public class LensQueryLexer extends Lexer {
     // $ANTLR start "Letter"\r
     public final void mLetter() throws RecognitionException {\r
         try {\r
-            // LensQuery.g:124:16: ( 'A' .. 'F' | 'a' .. 'f' )\r
+            // LensQuery.g:121:16: ( 'A' .. 'F' | 'a' .. 'f' )\r
             // LensQuery.g:\r
             {\r
             if ( (input.LA(1)>='A' && input.LA(1)<='F')||(input.LA(1)>='a' && input.LA(1)<='f') ) {\r
@@ -292,7 +291,7 @@ public class LensQueryLexer extends Lexer {
     // $ANTLR start "HexDigit"\r
     public final void mHexDigit() throws RecognitionException {\r
         try {\r
-            // LensQuery.g:125:18: ( Digit | Letter )\r
+            // LensQuery.g:122:18: ( Digit | Letter )\r
             // LensQuery.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
@@ -316,8 +315,8 @@ public class LensQueryLexer extends Lexer {
     // $ANTLR start "UnicodeChar"\r
     public final void mUnicodeChar() throws RecognitionException {\r
         try {\r
-            // LensQuery.g:126:21: (~ ( '\"' | '\\\\' ) )\r
-            // LensQuery.g:126:23: ~ ( '\"' | '\\\\' )\r
+            // LensQuery.g:123:21: (~ ( '\"' | '\\\\' ) )\r
+            // LensQuery.g:123: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
@@ -340,11 +339,11 @@ public class LensQueryLexer extends Lexer {
     // $ANTLR start "EscapeSequence"\r
     public final void mEscapeSequence() throws RecognitionException {\r
         try {\r
-            // LensQuery.g:128:3: ( '\\\\' ( '\\\"' | '\\\\' | '/' | 'b' | 'f' | 'n' | 'r' | 't' | 'u' HexDigit HexDigit HexDigit HexDigit ) )\r
-            // LensQuery.g:128:5: '\\\\' ( '\\\"' | '\\\\' | '/' | 'b' | 'f' | 'n' | 'r' | 't' | 'u' HexDigit HexDigit HexDigit HexDigit )\r
+            // LensQuery.g:125:3: ( '\\\\' ( '\\\"' | '\\\\' | '/' | 'b' | 'f' | 'n' | 'r' | 't' | 'u' HexDigit HexDigit HexDigit HexDigit ) )\r
+            // LensQuery.g:125:5: '\\\\' ( '\\\"' | '\\\\' | '/' | 'b' | 'f' | 'n' | 'r' | 't' | 'u' HexDigit HexDigit HexDigit HexDigit )\r
             {\r
             match('\\'); \r
-            // LensQuery.g:128:10: ( '\\\"' | '\\\\' | '/' | 'b' | 'f' | 'n' | 'r' | 't' | 'u' HexDigit HexDigit HexDigit HexDigit )\r
+            // LensQuery.g:125:10: ( '\\\"' | '\\\\' | '/' | 'b' | 'f' | 'n' | 'r' | 't' | 'u' HexDigit HexDigit HexDigit HexDigit )\r
             int alt3=9;\r
             switch ( input.LA(1) ) {\r
             case '\"':\r
@@ -401,63 +400,63 @@ public class LensQueryLexer extends Lexer {
 \r
             switch (alt3) {\r
                 case 1 :\r
-                    // LensQuery.g:128:11: '\\\"'\r
+                    // LensQuery.g:125:11: '\\\"'\r
                     {\r
                     match('\"'); \r
 \r
                     }\r
                     break;\r
                 case 2 :\r
-                    // LensQuery.g:128:18: '\\\\'\r
+                    // LensQuery.g:125:18: '\\\\'\r
                     {\r
                     match('\\'); \r
 \r
                     }\r
                     break;\r
                 case 3 :\r
-                    // LensQuery.g:128:25: '/'\r
+                    // LensQuery.g:125:25: '/'\r
                     {\r
                     match('/'); \r
 \r
                     }\r
                     break;\r
                 case 4 :\r
-                    // LensQuery.g:128:31: 'b'\r
+                    // LensQuery.g:125:31: 'b'\r
                     {\r
                     match('b'); \r
 \r
                     }\r
                     break;\r
                 case 5 :\r
-                    // LensQuery.g:128:37: 'f'\r
+                    // LensQuery.g:125:37: 'f'\r
                     {\r
                     match('f'); \r
 \r
                     }\r
                     break;\r
                 case 6 :\r
-                    // LensQuery.g:128:43: 'n'\r
+                    // LensQuery.g:125:43: 'n'\r
                     {\r
                     match('n'); \r
 \r
                     }\r
                     break;\r
                 case 7 :\r
-                    // LensQuery.g:128:49: 'r'\r
+                    // LensQuery.g:125:49: 'r'\r
                     {\r
                     match('r'); \r
 \r
                     }\r
                     break;\r
                 case 8 :\r
-                    // LensQuery.g:128:55: 't'\r
+                    // LensQuery.g:125:55: 't'\r
                     {\r
                     match('t'); \r
 \r
                     }\r
                     break;\r
                 case 9 :\r
-                    // LensQuery.g:128:61: 'u' HexDigit HexDigit HexDigit HexDigit\r
+                    // LensQuery.g:125:61: 'u' HexDigit HexDigit HexDigit HexDigit\r
                     {\r
                     match('u'); \r
                     mHexDigit(); \r
@@ -482,7 +481,7 @@ public class LensQueryLexer extends Lexer {
     // $ANTLR start "StringChar"\r
     public final void mStringChar() throws RecognitionException {\r
         try {\r
-            // LensQuery.g:131:21: ( UnicodeChar | EscapeSequence )\r
+            // LensQuery.g:128:21: ( UnicodeChar | EscapeSequence )\r
             int alt4=2;\r
             int LA4_0 = input.LA(1);\r
 \r
@@ -500,14 +499,14 @@ public class LensQueryLexer extends Lexer {
             }\r
             switch (alt4) {\r
                 case 1 :\r
-                    // LensQuery.g:131:24: UnicodeChar\r
+                    // LensQuery.g:128:24: UnicodeChar\r
                     {\r
                     mUnicodeChar(); \r
 \r
                     }\r
                     break;\r
                 case 2 :\r
-                    // LensQuery.g:131:38: EscapeSequence\r
+                    // LensQuery.g:128:38: EscapeSequence\r
                     {\r
                     mEscapeSequence(); \r
 \r
@@ -524,10 +523,10 @@ public class LensQueryLexer extends Lexer {
     // $ANTLR start "StringChar_s"\r
     public final void mStringChar_s() throws RecognitionException {\r
         try {\r
-            // LensQuery.g:132:22: ( ( StringChar )* )\r
-            // LensQuery.g:132:24: ( StringChar )*\r
+            // LensQuery.g:129:22: ( ( StringChar )* )\r
+            // LensQuery.g:129:24: ( StringChar )*\r
             {\r
-            // LensQuery.g:132:24: ( StringChar )*\r
+            // LensQuery.g:129:24: ( StringChar )*\r
             loop5:\r
             do {\r
                 int alt5=2;\r
@@ -540,7 +539,7 @@ public class LensQueryLexer extends Lexer {
 \r
                 switch (alt5) {\r
                case 1 :\r
-                   // LensQuery.g:132:24: StringChar\r
+                   // LensQuery.g:129:24: StringChar\r
                    {\r
                    mStringChar(); \r
 \r
@@ -568,8 +567,8 @@ public class LensQueryLexer extends Lexer {
             int _channel = DEFAULT_TOKEN_CHANNEL;\r
             Token s=null;\r
 \r
-            // LensQuery.g:134:7: ( '\"' s= StringChar_s '\"' )\r
-            // LensQuery.g:134:9: '\"' s= StringChar_s '\"'\r
+            // LensQuery.g:131:7: ( '\"' s= StringChar_s '\"' )\r
+            // LensQuery.g:131:9: '\"' s= StringChar_s '\"'\r
             {\r
             match('\"'); \r
             int sStart244 = getCharIndex();\r
@@ -593,10 +592,10 @@ public class LensQueryLexer extends Lexer {
         try {\r
             int _type = Integer;\r
             int _channel = DEFAULT_TOKEN_CHANNEL;\r
-            // LensQuery.g:137:8: ( ( '-' )? ( '0' | '1' .. '9' ( Digit )* ) )\r
-            // LensQuery.g:137:10: ( '-' )? ( '0' | '1' .. '9' ( Digit )* )\r
+            // LensQuery.g:134:8: ( ( '-' )? ( '0' | '1' .. '9' ( Digit )* ) )\r
+            // LensQuery.g:134:10: ( '-' )? ( '0' | '1' .. '9' ( Digit )* )\r
             {\r
-            // LensQuery.g:137:10: ( '-' )?\r
+            // LensQuery.g:134:10: ( '-' )?\r
             int alt6=2;\r
             int LA6_0 = input.LA(1);\r
 \r
@@ -605,7 +604,7 @@ public class LensQueryLexer extends Lexer {
             }\r
             switch (alt6) {\r
                 case 1 :\r
-                    // LensQuery.g:137:10: '-'\r
+                    // LensQuery.g:134:10: '-'\r
                     {\r
                     match('-'); \r
 \r
@@ -614,7 +613,7 @@ public class LensQueryLexer extends Lexer {
 \r
             }\r
 \r
-            // LensQuery.g:137:15: ( '0' | '1' .. '9' ( Digit )* )\r
+            // LensQuery.g:134:15: ( '0' | '1' .. '9' ( Digit )* )\r
             int alt8=2;\r
             int LA8_0 = input.LA(1);\r
 \r
@@ -632,17 +631,17 @@ public class LensQueryLexer extends Lexer {
             }\r
             switch (alt8) {\r
                 case 1 :\r
-                    // LensQuery.g:137:16: '0'\r
+                    // LensQuery.g:134:16: '0'\r
                     {\r
                     match('0'); \r
 \r
                     }\r
                     break;\r
                 case 2 :\r
-                    // LensQuery.g:137:22: '1' .. '9' ( Digit )*\r
+                    // LensQuery.g:134:22: '1' .. '9' ( Digit )*\r
                     {\r
                     matchRange('1','9'); \r
-                    // LensQuery.g:137:31: ( Digit )*\r
+                    // LensQuery.g:134:31: ( Digit )*\r
                     loop7:\r
                     do {\r
                         int alt7=2;\r
@@ -655,7 +654,7 @@ public class LensQueryLexer extends Lexer {
 \r
                         switch (alt7) {\r
                        case 1 :\r
-                           // LensQuery.g:137:31: Digit\r
+                           // LensQuery.g:134:31: Digit\r
                            {\r
                            mDigit(); \r
 \r
@@ -687,11 +686,11 @@ public class LensQueryLexer extends Lexer {
     // $ANTLR start "Frac"\r
     public final void mFrac() throws RecognitionException {\r
         try {\r
-            // LensQuery.g:138:14: ( '.' ( Digit )+ )\r
-            // LensQuery.g:138:16: '.' ( Digit )+\r
+            // LensQuery.g:135:14: ( '.' ( Digit )+ )\r
+            // LensQuery.g:135:16: '.' ( Digit )+\r
             {\r
             match('.'); \r
-            // LensQuery.g:138:20: ( Digit )+\r
+            // LensQuery.g:135:20: ( Digit )+\r
             int cnt9=0;\r
             loop9:\r
             do {\r
@@ -705,7 +704,7 @@ public class LensQueryLexer extends Lexer {
 \r
                 switch (alt9) {\r
                case 1 :\r
-                   // LensQuery.g:138:20: Digit\r
+                   // LensQuery.g:135:20: Digit\r
                    {\r
                    mDigit(); \r
 \r
@@ -733,8 +732,8 @@ public class LensQueryLexer extends Lexer {
     // $ANTLR start "Exp"\r
     public final void mExp() throws RecognitionException {\r
         try {\r
-            // LensQuery.g:139:13: ( ( 'e' | 'E' ) ( '+' | '-' )? ( Digit )+ )\r
-            // LensQuery.g:139:15: ( 'e' | 'E' ) ( '+' | '-' )? ( Digit )+\r
+            // LensQuery.g:136:13: ( ( 'e' | 'E' ) ( '+' | '-' )? ( Digit )+ )\r
+            // LensQuery.g:136:15: ( 'e' | 'E' ) ( '+' | '-' )? ( Digit )+\r
             {\r
             if ( input.LA(1)=='E'||input.LA(1)=='e' ) {\r
                 input.consume();\r
@@ -745,7 +744,7 @@ public class LensQueryLexer extends Lexer {
                 recover(mse);\r
                 throw mse;}\r
 \r
-            // LensQuery.g:139:27: ( '+' | '-' )?\r
+            // LensQuery.g:136:27: ( '+' | '-' )?\r
             int alt10=2;\r
             int LA10_0 = input.LA(1);\r
 \r
@@ -771,7 +770,7 @@ public class LensQueryLexer extends Lexer {
 \r
             }\r
 \r
-            // LensQuery.g:139:40: ( Digit )+\r
+            // LensQuery.g:136:40: ( Digit )+\r
             int cnt11=0;\r
             loop11:\r
             do {\r
@@ -785,7 +784,7 @@ public class LensQueryLexer extends Lexer {
 \r
                 switch (alt11) {\r
                case 1 :\r
-                   // LensQuery.g:139:40: Digit\r
+                   // LensQuery.g:136:40: Digit\r
                    {\r
                    mDigit(); \r
 \r
@@ -815,11 +814,11 @@ public class LensQueryLexer extends Lexer {
         try {\r
             int _type = Double;\r
             int _channel = DEFAULT_TOKEN_CHANNEL;\r
-            // LensQuery.g:140:7: ( Integer ( Frac ( Exp )? | Exp ) )\r
-            // LensQuery.g:140:9: Integer ( Frac ( Exp )? | Exp )\r
+            // LensQuery.g:137:7: ( Integer ( Frac ( Exp )? | Exp ) )\r
+            // LensQuery.g:137:9: Integer ( Frac ( Exp )? | Exp )\r
             {\r
             mInteger(); \r
-            // LensQuery.g:140:17: ( Frac ( Exp )? | Exp )\r
+            // LensQuery.g:137:17: ( Frac ( Exp )? | Exp )\r
             int alt13=2;\r
             int LA13_0 = input.LA(1);\r
 \r
@@ -837,10 +836,10 @@ public class LensQueryLexer extends Lexer {
             }\r
             switch (alt13) {\r
                 case 1 :\r
-                    // LensQuery.g:140:18: Frac ( Exp )?\r
+                    // LensQuery.g:137:18: Frac ( Exp )?\r
                     {\r
                     mFrac(); \r
-                    // LensQuery.g:140:23: ( Exp )?\r
+                    // LensQuery.g:137:23: ( Exp )?\r
                     int alt12=2;\r
                     int LA12_0 = input.LA(1);\r
 \r
@@ -849,7 +848,7 @@ public class LensQueryLexer extends Lexer {
                     }\r
                     switch (alt12) {\r
                         case 1 :\r
-                            // LensQuery.g:140:23: Exp\r
+                            // LensQuery.g:137:23: Exp\r
                             {\r
                             mExp(); \r
 \r
@@ -862,7 +861,7 @@ public class LensQueryLexer extends Lexer {
                     }\r
                     break;\r
                 case 2 :\r
-                    // LensQuery.g:140:30: Exp\r
+                    // LensQuery.g:137:30: Exp\r
                     {\r
                     mExp(); \r
 \r
@@ -887,8 +886,8 @@ public class LensQueryLexer extends Lexer {
         try {\r
             int _type = True;\r
             int _channel = DEFAULT_TOKEN_CHANNEL;\r
-            // LensQuery.g:142:5: ( 'true' )\r
-            // LensQuery.g:142:7: 'true'\r
+            // LensQuery.g:139:5: ( 'true' )\r
+            // LensQuery.g:139:7: 'true'\r
             {\r
             match("true"); \r
 \r
@@ -908,8 +907,8 @@ public class LensQueryLexer extends Lexer {
         try {\r
             int _type = False;\r
             int _channel = DEFAULT_TOKEN_CHANNEL;\r
-            // LensQuery.g:143:6: ( 'false' )\r
-            // LensQuery.g:143:8: 'false'\r
+            // LensQuery.g:140:6: ( 'false' )\r
+            // LensQuery.g:140:8: 'false'\r
             {\r
             match("false"); \r
 \r
@@ -929,8 +928,8 @@ public class LensQueryLexer extends Lexer {
         try {\r
             int _type = Null;\r
             int _channel = DEFAULT_TOKEN_CHANNEL;\r
-            // LensQuery.g:144:5: ( 'null' )\r
-            // LensQuery.g:144:7: 'null'\r
+            // LensQuery.g:141:5: ( 'null' )\r
+            // LensQuery.g:141:7: 'null'\r
             {\r
             match("null"); \r
 \r
@@ -950,8 +949,8 @@ public class LensQueryLexer extends Lexer {
         try {\r
             int _type = Lt;\r
             int _channel = DEFAULT_TOKEN_CHANNEL;\r
-            // LensQuery.g:148:3: ( '<' )\r
-            // LensQuery.g:148:5: '<'\r
+            // LensQuery.g:145:3: ( '<' )\r
+            // LensQuery.g:145:5: '<'\r
             {\r
             match('<'); \r
 \r
@@ -970,8 +969,8 @@ public class LensQueryLexer extends Lexer {
         try {\r
             int _type = Gt;\r
             int _channel = DEFAULT_TOKEN_CHANNEL;\r
-            // LensQuery.g:149:3: ( '>' )\r
-            // LensQuery.g:149:5: '>'\r
+            // LensQuery.g:146:3: ( '>' )\r
+            // LensQuery.g:146:5: '>'\r
             {\r
             match('>'); \r
 \r
@@ -990,8 +989,8 @@ public class LensQueryLexer extends Lexer {
         try {\r
             int _type = Leq;\r
             int _channel = DEFAULT_TOKEN_CHANNEL;\r
-            // LensQuery.g:150:4: ( '<=' )\r
-            // LensQuery.g:150:6: '<='\r
+            // LensQuery.g:147:4: ( '<=' )\r
+            // LensQuery.g:147:6: '<='\r
             {\r
             match("<="); \r
 \r
@@ -1011,8 +1010,8 @@ public class LensQueryLexer extends Lexer {
         try {\r
             int _type = Geq;\r
             int _channel = DEFAULT_TOKEN_CHANNEL;\r
-            // LensQuery.g:151:4: ( '>=' )\r
-            // LensQuery.g:151:6: '>='\r
+            // LensQuery.g:148:4: ( '>=' )\r
+            // LensQuery.g:148:6: '>='\r
             {\r
             match(">="); \r
 \r
@@ -1032,8 +1031,8 @@ public class LensQueryLexer extends Lexer {
         try {\r
             int _type = Eq;\r
             int _channel = DEFAULT_TOKEN_CHANNEL;\r
-            // LensQuery.g:152:3: ( '=' )\r
-            // LensQuery.g:152:5: '='\r
+            // LensQuery.g:149:3: ( '=' )\r
+            // LensQuery.g:149:5: '='\r
             {\r
             match('='); \r
 \r
@@ -1052,8 +1051,8 @@ public class LensQueryLexer extends Lexer {
         try {\r
             int _type = Neq;\r
             int _channel = DEFAULT_TOKEN_CHANNEL;\r
-            // LensQuery.g:153:4: ( '!=' )\r
-            // LensQuery.g:153:6: '!='\r
+            // LensQuery.g:150:4: ( '!=' )\r
+            // LensQuery.g:150:6: '!='\r
             {\r
             match("!="); \r
 \r
@@ -1073,8 +1072,8 @@ public class LensQueryLexer extends Lexer {
         try {\r
             int _type = Match;\r
             int _channel = DEFAULT_TOKEN_CHANNEL;\r
-            // LensQuery.g:154:6: ( '~=' )\r
-            // LensQuery.g:154:8: '~='\r
+            // LensQuery.g:151:6: ( '~=' )\r
+            // LensQuery.g:151:8: '~='\r
             {\r
             match("~="); \r
 \r
@@ -1094,11 +1093,11 @@ public class LensQueryLexer extends Lexer {
         try {\r
             int _type = Regex;\r
             int _channel = DEFAULT_TOKEN_CHANNEL;\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
+            // LensQuery.g:152:6: ( '/' ( options {greedy=false; } : . )* '/' ( 'a' .. 'z' | 'A' .. 'Z' )* )\r
+            // LensQuery.g:152:8: '/' ( options {greedy=false; } : . )* '/' ( 'a' .. 'z' | 'A' .. 'Z' )*\r
             {\r
             match('/'); \r
-            // LensQuery.g:155:13: ( options {greedy=false; } : . )*\r
+            // LensQuery.g:152:13: ( options {greedy=false; } : . )*\r
             loop14:\r
             do {\r
                 int alt14=2;\r
@@ -1114,7 +1113,7 @@ public class LensQueryLexer extends Lexer {
 \r
                 switch (alt14) {\r
                case 1 :\r
-                   // LensQuery.g:155:38: .\r
+                   // LensQuery.g:152:38: .\r
                    {\r
                    matchAny(); \r
 \r
@@ -1127,7 +1126,7 @@ public class LensQueryLexer extends Lexer {
             } while (true);\r
 \r
             match('/'); \r
-            // LensQuery.g:155:46: ( 'a' .. 'z' | 'A' .. 'Z' )*\r
+            // LensQuery.g:152:46: ( 'a' .. 'z' | 'A' .. 'Z' )*\r
             loop15:\r
             do {\r
                 int alt15=2;\r
@@ -1176,8 +1175,8 @@ public class LensQueryLexer extends Lexer {
         try {\r
             int _type = Dot;\r
             int _channel = DEFAULT_TOKEN_CHANNEL;\r
-            // LensQuery.g:158:4: ( '.' )\r
-            // LensQuery.g:158:6: '.'\r
+            // LensQuery.g:155:4: ( '.' )\r
+            // LensQuery.g:155:6: '.'\r
             {\r
             match('.'); \r
 \r
@@ -1196,8 +1195,8 @@ public class LensQueryLexer extends Lexer {
         try {\r
             int _type = Comma;\r
             int _channel = DEFAULT_TOKEN_CHANNEL;\r
-            // LensQuery.g:159:6: ( ',' )\r
-            // LensQuery.g:159:8: ','\r
+            // LensQuery.g:156:6: ( ',' )\r
+            // LensQuery.g:156:8: ','\r
             {\r
             match(','); \r
 \r
@@ -1216,8 +1215,8 @@ public class LensQueryLexer extends Lexer {
         try {\r
             int _type = Colon;\r
             int _channel = DEFAULT_TOKEN_CHANNEL;\r
-            // LensQuery.g:160:6: ( ':' )\r
-            // LensQuery.g:160:8: ':'\r
+            // LensQuery.g:157:6: ( ':' )\r
+            // LensQuery.g:157:8: ':'\r
             {\r
             match(':'); \r
 \r
@@ -1236,8 +1235,8 @@ public class LensQueryLexer extends Lexer {
         try {\r
             int _type = As;\r
             int _channel = DEFAULT_TOKEN_CHANNEL;\r
-            // LensQuery.g:162:3: ( 'as' )\r
-            // LensQuery.g:162:5: 'as'\r
+            // LensQuery.g:159:3: ( 'as' )\r
+            // LensQuery.g:159:5: 'as'\r
             {\r
             match("as"); \r
 \r
@@ -1257,8 +1256,8 @@ public class LensQueryLexer extends Lexer {
         try {\r
             int _type = LParen;\r
             int _channel = DEFAULT_TOKEN_CHANNEL;\r
-            // LensQuery.g:164:7: ( '(' )\r
-            // LensQuery.g:164:9: '('\r
+            // LensQuery.g:161:7: ( '(' )\r
+            // LensQuery.g:161:9: '('\r
             {\r
             match('('); \r
 \r
@@ -1277,8 +1276,8 @@ public class LensQueryLexer extends Lexer {
         try {\r
             int _type = RParen;\r
             int _channel = DEFAULT_TOKEN_CHANNEL;\r
-            // LensQuery.g:165:7: ( ')' )\r
-            // LensQuery.g:165:9: ')'\r
+            // LensQuery.g:162:7: ( ')' )\r
+            // LensQuery.g:162:9: ')'\r
             {\r
             match(')'); \r
 \r
@@ -1297,8 +1296,8 @@ public class LensQueryLexer extends Lexer {
         try {\r
             int _type = Star;\r
             int _channel = DEFAULT_TOKEN_CHANNEL;\r
-            // LensQuery.g:167:5: ( '*' )\r
-            // LensQuery.g:167:7: '*'\r
+            // LensQuery.g:164:5: ( '*' )\r
+            // LensQuery.g:164:7: '*'\r
             {\r
             match('*'); \r
 \r
@@ -1315,7 +1314,7 @@ public class LensQueryLexer extends Lexer {
     // $ANTLR start "UnsafeUnicodeChar"\r
     public final void mUnsafeUnicodeChar() throws RecognitionException {\r
         try {\r
-            // LensQuery.g:170:18: ( '(' | ')' | '[' | ']' | '{' | '}' | ',' | ':' | '#' | '<' | '>' | '|' | '*' | '\\'' | '\"' | '@' | '%' | '\\\\' | '.' | '-' )\r
+            // LensQuery.g:167: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
@@ -1339,7 +1338,7 @@ public class LensQueryLexer extends Lexer {
     // $ANTLR start "SafeFirstLetter"\r
     public final void mSafeFirstLetter() throws RecognitionException {\r
         try {\r
-            // LensQuery.g:172:25: ( 'A' .. 'Z' | 'a' .. 'z' )\r
+            // LensQuery.g:169: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
@@ -1363,7 +1362,7 @@ public class LensQueryLexer extends Lexer {
     // $ANTLR start "SafeLetter"\r
     public final void mSafeLetter() throws RecognitionException {\r
         try {\r
-            // LensQuery.g:173:20: ( SafeFirstLetter | '0' .. '9' | '-' | '_' )\r
+            // LensQuery.g:170: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
@@ -1387,8 +1386,8 @@ public class LensQueryLexer extends Lexer {
     // $ANTLR start "QNameChar"\r
     public final void mQNameChar() throws RecognitionException {\r
         try {\r
-            // LensQuery.g:176:19: (~ ( LineBreakChar | UnsafeUnicodeChar | WhiteSpace ) )\r
-            // LensQuery.g:176:21: ~ ( LineBreakChar | UnsafeUnicodeChar | WhiteSpace )\r
+            // LensQuery.g:173:19: (~ ( LineBreakChar | UnsafeUnicodeChar | WhiteSpace ) )\r
+            // LensQuery.g:173: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
@@ -1413,10 +1412,10 @@ public class LensQueryLexer extends Lexer {
         try {\r
             int _type = QName;\r
             int _channel = DEFAULT_TOKEN_CHANNEL;\r
-            // LensQuery.g:177:6: ( ( QNameChar )+ ( Dot ( QNameChar )+ )* )\r
-            // LensQuery.g:177:8: ( QNameChar )+ ( Dot ( QNameChar )+ )*\r
+            // LensQuery.g:174:6: ( ( QNameChar )+ ( Dot ( QNameChar )+ )* )\r
+            // LensQuery.g:174:8: ( QNameChar )+ ( Dot ( QNameChar )+ )*\r
             {\r
-            // LensQuery.g:177:8: ( QNameChar )+\r
+            // LensQuery.g:174:8: ( QNameChar )+\r
             int cnt16=0;\r
             loop16:\r
             do {\r
@@ -1430,7 +1429,7 @@ public class LensQueryLexer extends Lexer {
 \r
                 switch (alt16) {\r
                case 1 :\r
-                   // LensQuery.g:177:8: QNameChar\r
+                   // LensQuery.g:174:8: QNameChar\r
                    {\r
                    mQNameChar(); \r
 \r
@@ -1446,7 +1445,7 @@ public class LensQueryLexer extends Lexer {
                 cnt16++;\r
             } while (true);\r
 \r
-            // LensQuery.g:177:19: ( Dot ( QNameChar )+ )*\r
+            // LensQuery.g:174:19: ( Dot ( QNameChar )+ )*\r
             loop18:\r
             do {\r
                 int alt18=2;\r
@@ -1459,10 +1458,10 @@ public class LensQueryLexer extends Lexer {
 \r
                 switch (alt18) {\r
                case 1 :\r
-                   // LensQuery.g:177:20: Dot ( QNameChar )+\r
+                   // LensQuery.g:174:20: Dot ( QNameChar )+\r
                    {\r
                    mDot(); \r
-                   // LensQuery.g:177:24: ( QNameChar )+\r
+                   // LensQuery.g:174:24: ( QNameChar )+\r
                    int cnt17=0;\r
                    loop17:\r
                    do {\r
@@ -1476,7 +1475,7 @@ public class LensQueryLexer extends Lexer {
 \r
                        switch (alt17) {\r
                        case 1 :\r
-                           // LensQuery.g:177:24: QNameChar\r
+                           // LensQuery.g:174:24: QNameChar\r
                            {\r
                            mQNameChar(); \r
 \r
@@ -1515,7 +1514,7 @@ public class LensQueryLexer extends Lexer {
     // $ANTLR start "WhiteSpace"\r
     public final void mWhiteSpace() throws RecognitionException {\r
         try {\r
-            // LensQuery.g:181:11: ( ' ' | '\\t' )\r
+            // LensQuery.g:178:11: ( ' ' | '\\t' )\r
             // LensQuery.g:\r
             {\r
             if ( input.LA(1)=='\t'||input.LA(1)==' ' ) {\r
@@ -1541,10 +1540,10 @@ public class LensQueryLexer extends Lexer {
         try {\r
             int _type = WhiteSpaces;\r
             int _channel = DEFAULT_TOKEN_CHANNEL;\r
-            // LensQuery.g:183:12: ( ( WhiteSpace )+ )\r
-            // LensQuery.g:183:14: ( WhiteSpace )+\r
+            // LensQuery.g:180:12: ( ( WhiteSpace )+ )\r
+            // LensQuery.g:180:14: ( WhiteSpace )+\r
             {\r
-            // LensQuery.g:183:14: ( WhiteSpace )+\r
+            // LensQuery.g:180:14: ( WhiteSpace )+\r
             int cnt19=0;\r
             loop19:\r
             do {\r
@@ -1558,7 +1557,7 @@ public class LensQueryLexer extends Lexer {
 \r
                 switch (alt19) {\r
                case 1 :\r
-                   // LensQuery.g:183:14: WhiteSpace\r
+                   // LensQuery.g:180:14: WhiteSpace\r
                    {\r
                    mWhiteSpace(); \r
 \r
index 77d974d..718b9b8 100644 (file)
@@ -1,4 +1,4 @@
-// $ANTLR 3.1.3 Mar 17, 2009 19:23:44 LensQuery.g 2009-09-30 22:59:27\r
+// $ANTLR 3.1.3 Mar 17, 2009 19:23:44 LensQuery.g 2009-10-13 14:02:52\r
 \r
 /*--------------------------------------------------------------------------\r
  *  Copyright 2009 Taro L. Saito\r
@@ -24,7 +24,6 @@
 //--------------------------------------\r
 package org.xerial.lens.relation.query.impl;\r
 \r
-import org.xerial.lens.relation.TupleIndex;\r
 \r
 \r
 import org.antlr.runtime.*;\r
@@ -37,61 +36,60 @@ 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", "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", "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=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
+    public static final int Match=39;\r
+    public static final int Regex=40;\r
+    public static final int Digit=18;\r
+    public static final int Frac=27;\r
+    public static final int HexDigit=20;\r
     public static final int QUERY=4;\r
     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=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=52;\r
+    public static final int Letter=19;\r
+    public static final int Comma=42;\r
+    public static final int Dot=41;\r
+    public static final int EscapeSequence=22;\r
+    public static final int Integer=26;\r
+    public static final int WhiteSpace=51;\r
     public static final int OPERATOR=7;\r
-    public static final int False=32;\r
-    public static final int Colon=44;\r
-    public static final int LineComment=17;\r
+    public static final int False=31;\r
+    public static final int LineComment=16;\r
+    public static final int Colon=43;\r
     public static final int NODEVALUE=12;\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=48;\r
-    public static final int Eq=38;\r
-    public static final int Exp=29;\r
-    public static final int QNameChar=53;\r
+    public static final int As=44;\r
+    public static final int SafeFirstLetter=49;\r
+    public static final int Null=32;\r
+    public static final int Star=47;\r
+    public static final int Eq=37;\r
+    public static final int Exp=28;\r
+    public static final int QNameChar=52;\r
     public static final int RELATION=5;\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 Gt=34;\r
+    public static final int RParen=46;\r
+    public static final int UnicodeChar=21;\r
+    public static final int StringChar=23;\r
+    public static final int True=30;\r
     public static final int OPERAND=8;\r
-    public static final int LineBreak=18;\r
-    public static final int LParen=46;\r
-    public static final int String=26;\r
-    public static final int SafeLetter=51;\r
-    public static final int LineBreakChar=16;\r
+    public static final int LineBreak=17;\r
+    public static final int LParen=45;\r
+    public static final int String=25;\r
+    public static final int SafeLetter=50;\r
+    public static final int LineBreakChar=15;\r
     public static final int COMPARE=6;\r
-    public static final int QName=54;\r
+    public static final int QName=53;\r
     public static final int EOF=-1;\r
-    public static final int Geq=37;\r
+    public static final int Geq=36;\r
     public static final int NODE=10;\r
-    public static final int StringChar_s=25;\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 Lt=34;\r
+    public static final int StringChar_s=24;\r
+    public static final int Neq=38;\r
+    public static final int UnsafeUnicodeChar=48;\r
+    public static final int Double=29;\r
+    public static final int Lt=33;\r
     public static final int NAME=13;\r
-    public static final int Leq=36;\r
-    public static final int WhiteSpaces=55;\r
+    public static final int Leq=35;\r
+    public static final int WhiteSpaces=54;\r
 \r
     // delegates\r
     // delegators\r
@@ -118,7 +116,6 @@ public class LensQueryParser extends Parser {
     public String getGrammarFileName() { return "LensQuery.g"; }\r
 \r
 \r
-       private TupleIndex currentIndex = null;\r
 \r
 \r
     public static class expr_return extends ParserRuleReturnScope {\r
@@ -127,7 +124,7 @@ public class LensQueryParser extends Parser {
     };\r
 \r
     // $ANTLR start "expr"\r
-    // LensQuery.g:188:1: expr : relation ;\r
+    // LensQuery.g:185: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
@@ -139,12 +136,12 @@ public class LensQueryParser extends Parser {
 \r
 \r
         try {\r
-            // LensQuery.g:188:5: ( relation )\r
-            // LensQuery.g:189:3: relation\r
+            // LensQuery.g:185:5: ( relation )\r
+            // LensQuery.g:186:3: relation\r
             {\r
             root_0 = (Object)adaptor.nil();\r
 \r
-            pushFollow(FOLLOW_relation_in_expr779);\r
+            pushFollow(FOLLOW_relation_in_expr774);\r
             relation1=relation();\r
 \r
             state._fsp--;\r
@@ -171,21 +168,14 @@ public class LensQueryParser extends Parser {
     }\r
     // $ANTLR end "expr"\r
 \r
-    protected static class relation_scope {\r
-        int nodeItemIndex;\r
-        TupleIndex relationIndex;\r
-    }\r
-    protected Stack relation_stack = new Stack();\r
-\r
     public static class relation_return extends ParserRuleReturnScope {\r
         Object tree;\r
         public Object getTree() { return tree; }\r
     };\r
 \r
     // $ANTLR start "relation"\r
-    // LensQuery.g:192:1: relation : relation_i -> ^( RELATION relation_i INDEX[currentIndex.toString()] ) ;\r
+    // LensQuery.g:189:1: relation : relation_i -> ^( RELATION relation_i ) ;\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
         retval.start = input.LT(1);\r
 \r
@@ -195,18 +185,11 @@ public class LensQueryParser extends Parser {
 \r
 \r
         RewriteRuleSubtreeStream stream_relation_i=new RewriteRuleSubtreeStream(adaptor,"rule relation_i");\r
-\r
-          ((relation_scope)relation_stack.peek()).nodeItemIndex = 1;\r
-          if(currentIndex == null)\r
-            currentIndex = new TupleIndex(1);\r
-          else\r
-            currentIndex = new TupleIndex(currentIndex, 1); \r
-\r
         try {\r
-            // LensQuery.g:210:4: ( relation_i -> ^( RELATION relation_i INDEX[currentIndex.toString()] ) )\r
-            // LensQuery.g:210:6: relation_i\r
+            // LensQuery.g:190:4: ( relation_i -> ^( RELATION relation_i ) )\r
+            // LensQuery.g:190:6: relation_i\r
             {\r
-            pushFollow(FOLLOW_relation_i_in_relation813);\r
+            pushFollow(FOLLOW_relation_i_in_relation792);\r
             relation_i2=relation_i();\r
 \r
             state._fsp--;\r
@@ -225,15 +208,14 @@ 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
-            // 210:17: -> ^( RELATION relation_i INDEX[currentIndex.toString()] )\r
+            // 190:17: -> ^( RELATION relation_i )\r
             {\r
-                // LensQuery.g:210:20: ^( RELATION relation_i INDEX[currentIndex.toString()] )\r
+                // LensQuery.g:190:20: ^( RELATION relation_i )\r
                 {\r
                 Object root_1 = (Object)adaptor.nil();\r
                 root_1 = (Object)adaptor.becomeRoot((Object)adaptor.create(RELATION, "RELATION"), root_1);\r
 \r
                 adaptor.addChild(root_1, stream_relation_i.nextTree());\r
-                adaptor.addChild(root_1, (Object)adaptor.create(INDEX, currentIndex.toString()));\r
 \r
                 adaptor.addChild(root_0, root_1);\r
                 }\r
@@ -248,9 +230,6 @@ public class LensQueryParser extends Parser {
             retval.tree = (Object)adaptor.rulePostProcessing(root_0);\r
             adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);\r
 \r
-\r
-              currentIndex = currentIndex.parent();\r
-\r
         }\r
         catch (RecognitionException re) {\r
             reportError(re);\r
@@ -259,7 +238,6 @@ public class LensQueryParser extends Parser {
 \r
         }\r
         finally {\r
-            relation_stack.pop();\r
         }\r
         return retval;\r
     }\r
@@ -271,7 +249,7 @@ public class LensQueryParser extends Parser {
     };\r
 \r
     // $ANTLR start "relation_i"\r
-    // LensQuery.g:213:1: relation_i : nodeName ( alias )? LParen nodeItem ( Comma nodeItem )* RParen ;\r
+    // LensQuery.g:193: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
@@ -295,18 +273,18 @@ public class LensQueryParser extends Parser {
         Object RParen9_tree=null;\r
 \r
         try {\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
+            // LensQuery.g:193:11: ( nodeName ( alias )? LParen nodeItem ( Comma nodeItem )* RParen )\r
+            // LensQuery.g:193:13: nodeName ( alias )? LParen nodeItem ( Comma nodeItem )* RParen\r
             {\r
             root_0 = (Object)adaptor.nil();\r
 \r
-            pushFollow(FOLLOW_nodeName_in_relation_i832);\r
+            pushFollow(FOLLOW_nodeName_in_relation_i808);\r
             nodeName3=nodeName();\r
 \r
             state._fsp--;\r
 \r
             adaptor.addChild(root_0, nodeName3.getTree());\r
-            // LensQuery.g:213:22: ( alias )?\r
+            // LensQuery.g:193:22: ( alias )?\r
             int alt1=2;\r
             int LA1_0 = input.LA(1);\r
 \r
@@ -315,9 +293,9 @@ public class LensQueryParser extends Parser {
             }\r
             switch (alt1) {\r
                 case 1 :\r
-                    // LensQuery.g:213:22: alias\r
+                    // LensQuery.g:193:22: alias\r
                     {\r
-                    pushFollow(FOLLOW_alias_in_relation_i834);\r
+                    pushFollow(FOLLOW_alias_in_relation_i810);\r
                     alias4=alias();\r
 \r
                     state._fsp--;\r
@@ -329,14 +307,14 @@ public class LensQueryParser extends Parser {
 \r
             }\r
 \r
-            LParen5=(Token)match(input,LParen,FOLLOW_LParen_in_relation_i837); \r
-            pushFollow(FOLLOW_nodeItem_in_relation_i840);\r
+            LParen5=(Token)match(input,LParen,FOLLOW_LParen_in_relation_i813); \r
+            pushFollow(FOLLOW_nodeItem_in_relation_i816);\r
             nodeItem6=nodeItem();\r
 \r
             state._fsp--;\r
 \r
             adaptor.addChild(root_0, nodeItem6.getTree());\r
-            // LensQuery.g:213:46: ( Comma nodeItem )*\r
+            // LensQuery.g:193:46: ( Comma nodeItem )*\r
             loop2:\r
             do {\r
                 int alt2=2;\r
@@ -349,10 +327,10 @@ public class LensQueryParser extends Parser {
 \r
                 switch (alt2) {\r
                case 1 :\r
-                   // LensQuery.g:213:47: Comma nodeItem\r
+                   // LensQuery.g:193:47: Comma nodeItem\r
                    {\r
-                   Comma7=(Token)match(input,Comma,FOLLOW_Comma_in_relation_i843); \r
-                   pushFollow(FOLLOW_nodeItem_in_relation_i846);\r
+                   Comma7=(Token)match(input,Comma,FOLLOW_Comma_in_relation_i819); \r
+                   pushFollow(FOLLOW_nodeItem_in_relation_i822);\r
                    nodeItem8=nodeItem();\r
 \r
                    state._fsp--;\r
@@ -367,7 +345,7 @@ public class LensQueryParser extends Parser {
                 }\r
             } while (true);\r
 \r
-            RParen9=(Token)match(input,RParen,FOLLOW_RParen_in_relation_i850); \r
+            RParen9=(Token)match(input,RParen,FOLLOW_RParen_in_relation_i826); \r
 \r
             }\r
 \r
@@ -395,7 +373,7 @@ public class LensQueryParser extends Parser {
     };\r
 \r
     // $ANTLR start "nodeName"\r
-    // LensQuery.g:216:1: fragment nodeName : ( QName -> NAME[$QName.text] | String -> NAME[$String.text] );\r
+    // LensQuery.g:196: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
@@ -411,7 +389,7 @@ public class LensQueryParser extends Parser {
         RewriteRuleTokenStream stream_QName=new RewriteRuleTokenStream(adaptor,"token QName");\r
 \r
         try {\r
-            // LensQuery.g:218:3: ( QName -> NAME[$QName.text] | String -> NAME[$String.text] )\r
+            // LensQuery.g:198:3: ( QName -> NAME[$QName.text] | String -> NAME[$String.text] )\r
             int alt3=2;\r
             int LA3_0 = input.LA(1);\r
 \r
@@ -429,9 +407,9 @@ public class LensQueryParser extends Parser {
             }\r
             switch (alt3) {\r
                 case 1 :\r
-                    // LensQuery.g:218:5: QName\r
+                    // LensQuery.g:198:5: QName\r
                     {\r
-                    QName10=(Token)match(input,QName,FOLLOW_QName_in_nodeName864);  \r
+                    QName10=(Token)match(input,QName,FOLLOW_QName_in_nodeName840);  \r
                     stream_QName.add(QName10);\r
 \r
 \r
@@ -447,7 +425,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
-                    // 218:11: -> NAME[$QName.text]\r
+                    // 198:11: -> NAME[$QName.text]\r
                     {\r
                         adaptor.addChild(root_0, (Object)adaptor.create(NAME, (QName10!=null?QName10.getText():null)));\r
 \r
@@ -457,9 +435,9 @@ public class LensQueryParser extends Parser {
                     }\r
                     break;\r
                 case 2 :\r
-                    // LensQuery.g:219:5: String\r
+                    // LensQuery.g:199:5: String\r
                     {\r
-                    String11=(Token)match(input,String,FOLLOW_String_in_nodeName875);  \r
+                    String11=(Token)match(input,String,FOLLOW_String_in_nodeName851);  \r
                     stream_String.add(String11);\r
 \r
 \r
@@ -475,7 +453,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
-                    // 219:12: -> NAME[$String.text]\r
+                    // 199:12: -> NAME[$String.text]\r
                     {\r
                         adaptor.addChild(root_0, (Object)adaptor.create(NAME, (String11!=null?String11.getText():null)));\r
 \r
@@ -510,7 +488,7 @@ public class LensQueryParser extends Parser {
     };\r
 \r
     // $ANTLR start "alias"\r
-    // LensQuery.g:222:1: fragment alias : As QName -> ALIAS[$QName.text] ;\r
+    // LensQuery.g:202: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
@@ -526,13 +504,13 @@ public class LensQueryParser extends Parser {
         RewriteRuleTokenStream stream_QName=new RewriteRuleTokenStream(adaptor,"token QName");\r
 \r
         try {\r
-            // LensQuery.g:223:6: ( As QName -> ALIAS[$QName.text] )\r
-            // LensQuery.g:223:8: As QName\r
+            // LensQuery.g:203:6: ( As QName -> ALIAS[$QName.text] )\r
+            // LensQuery.g:203:8: As QName\r
             {\r
-            As12=(Token)match(input,As,FOLLOW_As_in_alias892);  \r
+            As12=(Token)match(input,As,FOLLOW_As_in_alias868);  \r
             stream_As.add(As12);\r
 \r
-            QName13=(Token)match(input,QName,FOLLOW_QName_in_alias894);  \r
+            QName13=(Token)match(input,QName,FOLLOW_QName_in_alias870);  \r
             stream_QName.add(QName13);\r
 \r
 \r
@@ -548,7 +526,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
-            // 223:17: -> ALIAS[$QName.text]\r
+            // 203:17: -> ALIAS[$QName.text]\r
             {\r
                 adaptor.addChild(root_0, (Object)adaptor.create(ALIAS, (QName13!=null?QName13.getText():null)));\r
 \r
@@ -581,7 +559,7 @@ public class LensQueryParser extends Parser {
     };\r
 \r
     // $ANTLR start "nodeItem"\r
-    // LensQuery.g:226:1: fragment nodeItem : ( nodeName ( alias )? ( nodeValue )? -> ^( NODE nodeName ( alias )? ( nodeValue )? INDEX[new TupleIndex(currentIndex, index).toString()] ) | relation );\r
+    // LensQuery.g:206:1: fragment nodeItem : ( nodeName ( alias )? ( nodeValue )? -> ^( NODE nodeName ( alias )? ( nodeValue )? ) | 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
@@ -600,11 +578,8 @@ public class LensQueryParser extends Parser {
         RewriteRuleSubtreeStream stream_nodeName=new RewriteRuleSubtreeStream(adaptor,"rule nodeName");\r
         RewriteRuleSubtreeStream stream_nodeValue=new RewriteRuleSubtreeStream(adaptor,"rule nodeValue");\r
         RewriteRuleSubtreeStream stream_alias=new RewriteRuleSubtreeStream(adaptor,"rule alias");\r
-\r
-          int index = ((relation_scope)relation_stack.peek()).nodeItemIndex++;\r
-\r
         try {\r
-            // LensQuery.g:231:3: ( nodeName ( alias )? ( nodeValue )? -> ^( NODE nodeName ( alias )? ( nodeValue )? INDEX[new TupleIndex(currentIndex, index).toString()] ) | relation )\r
+            // LensQuery.g:208:3: ( nodeName ( alias )? ( nodeValue )? -> ^( NODE nodeName ( alias )? ( nodeValue )? ) | relation )\r
             int alt6=2;\r
             int LA6_0 = input.LA(1);\r
 \r
@@ -730,15 +705,15 @@ public class LensQueryParser extends Parser {
             }\r
             switch (alt6) {\r
                 case 1 :\r
-                    // LensQuery.g:231:5: nodeName ( alias )? ( nodeValue )?\r
+                    // LensQuery.g:208:5: nodeName ( alias )? ( nodeValue )?\r
                     {\r
-                    pushFollow(FOLLOW_nodeName_in_nodeItem919);\r
+                    pushFollow(FOLLOW_nodeName_in_nodeItem890);\r
                     nodeName14=nodeName();\r
 \r
                     state._fsp--;\r
 \r
                     stream_nodeName.add(nodeName14.getTree());\r
-                    // LensQuery.g:231:14: ( alias )?\r
+                    // LensQuery.g:208:14: ( alias )?\r
                     int alt4=2;\r
                     int LA4_0 = input.LA(1);\r
 \r
@@ -747,9 +722,9 @@ public class LensQueryParser extends Parser {
                     }\r
                     switch (alt4) {\r
                         case 1 :\r
-                            // LensQuery.g:231:14: alias\r
+                            // LensQuery.g:208:14: alias\r
                             {\r
-                            pushFollow(FOLLOW_alias_in_nodeItem921);\r
+                            pushFollow(FOLLOW_alias_in_nodeItem892);\r
                             alias15=alias();\r
 \r
                             state._fsp--;\r
@@ -761,7 +736,7 @@ public class LensQueryParser extends Parser {
 \r
                     }\r
 \r
-                    // LensQuery.g:231:21: ( nodeValue )?\r
+                    // LensQuery.g:208:21: ( nodeValue )?\r
                     int alt5=2;\r
                     int LA5_0 = input.LA(1);\r
 \r
@@ -770,9 +745,9 @@ public class LensQueryParser extends Parser {
                     }\r
                     switch (alt5) {\r
                         case 1 :\r
-                            // LensQuery.g:231:21: nodeValue\r
+                            // LensQuery.g:208:21: nodeValue\r
                             {\r
-                            pushFollow(FOLLOW_nodeValue_in_nodeItem924);\r
+                            pushFollow(FOLLOW_nodeValue_in_nodeItem895);\r
                             nodeValue16=nodeValue();\r
 \r
                             state._fsp--;\r
@@ -787,7 +762,7 @@ public class LensQueryParser extends Parser {
 \r
 \r
                     // AST REWRITE\r
-                    // elements: alias, nodeName, nodeValue\r
+                    // elements: nodeName, alias, nodeValue\r
                     // token labels: \r
                     // rule labels: retval\r
                     // token list labels: \r
@@ -797,27 +772,26 @@ 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
-                    // 232:5: -> ^( NODE nodeName ( alias )? ( nodeValue )? INDEX[new TupleIndex(currentIndex, index).toString()] )\r
+                    // 209:5: -> ^( NODE nodeName ( alias )? ( nodeValue )? )\r
                     {\r
-                        // LensQuery.g:232:8: ^( NODE nodeName ( alias )? ( nodeValue )? INDEX[new TupleIndex(currentIndex, index).toString()] )\r
+                        // LensQuery.g:209:8: ^( NODE nodeName ( alias )? ( nodeValue )? )\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:232:24: ( alias )?\r
+                        // LensQuery.g:209:24: ( alias )?\r
                         if ( stream_alias.hasNext() ) {\r
                             adaptor.addChild(root_1, stream_alias.nextTree());\r
 \r
                         }\r
                         stream_alias.reset();\r
-                        // LensQuery.g:232:31: ( nodeValue )?\r
+                        // LensQuery.g:209:31: ( nodeValue )?\r
                         if ( stream_nodeValue.hasNext() ) {\r
                             adaptor.addChild(root_1, stream_nodeValue.nextTree());\r
 \r
                         }\r
                         stream_nodeValue.reset();\r
-                        adaptor.addChild(root_1, (Object)adaptor.create(INDEX, new TupleIndex(currentIndex, index).toString()));\r
 \r
                         adaptor.addChild(root_0, root_1);\r
                         }\r
@@ -828,11 +802,11 @@ public class LensQueryParser extends Parser {
                     }\r
                     break;\r
                 case 2 :\r
-                    // LensQuery.g:233:5: relation\r
+                    // LensQuery.g:210:5: relation\r
                     {\r
                     root_0 = (Object)adaptor.nil();\r
 \r
-                    pushFollow(FOLLOW_relation_in_nodeItem953);\r
+                    pushFollow(FOLLOW_relation_in_nodeItem921);\r
                     relation17=relation();\r
 \r
                     state._fsp--;\r
@@ -867,7 +841,7 @@ public class LensQueryParser extends Parser {
     };\r
 \r
     // $ANTLR start "value"\r
-    // LensQuery.g:236:1: fragment value : ( String | Integer | Double | QName );\r
+    // LensQuery.g:213: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
@@ -879,7 +853,7 @@ public class LensQueryParser extends Parser {
         Object set18_tree=null;\r
 \r
         try {\r
-            // LensQuery.g:238:3: ( String | Integer | Double | QName )\r
+            // LensQuery.g:215:3: ( String | Integer | Double | QName )\r
             // LensQuery.g:\r
             {\r
             root_0 = (Object)adaptor.nil();\r
@@ -922,7 +896,7 @@ public class LensQueryParser extends Parser {
     };\r
 \r
     // $ANTLR start "nodeValue"\r
-    // LensQuery.g:241:1: fragment nodeValue : ( Colon value -> NODEVALUE[$value.text] | nodeCmp );\r
+    // LensQuery.g:218: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
@@ -939,7 +913,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:243:3: ( Colon value -> NODEVALUE[$value.text] | nodeCmp )\r
+            // LensQuery.g:220:3: ( Colon value -> NODEVALUE[$value.text] | nodeCmp )\r
             int alt7=2;\r
             int LA7_0 = input.LA(1);\r
 \r
@@ -957,12 +931,12 @@ public class LensQueryParser extends Parser {
             }\r
             switch (alt7) {\r
                 case 1 :\r
-                    // LensQuery.g:243:5: Colon value\r
+                    // LensQuery.g:220:5: Colon value\r
                     {\r
-                    Colon19=(Token)match(input,Colon,FOLLOW_Colon_in_nodeValue1002);  \r
+                    Colon19=(Token)match(input,Colon,FOLLOW_Colon_in_nodeValue970);  \r
                     stream_Colon.add(Colon19);\r
 \r
-                    pushFollow(FOLLOW_value_in_nodeValue1004);\r
+                    pushFollow(FOLLOW_value_in_nodeValue972);\r
                     value20=value();\r
 \r
                     state._fsp--;\r
@@ -981,7 +955,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
-                    // 243:17: -> NODEVALUE[$value.text]\r
+                    // 220: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
@@ -991,11 +965,11 @@ public class LensQueryParser extends Parser {
                     }\r
                     break;\r
                 case 2 :\r
-                    // LensQuery.g:244:5: nodeCmp\r
+                    // LensQuery.g:221:5: nodeCmp\r
                     {\r
                     root_0 = (Object)adaptor.nil();\r
 \r
-                    pushFollow(FOLLOW_nodeCmp_in_nodeValue1015);\r
+                    pushFollow(FOLLOW_nodeCmp_in_nodeValue983);\r
                     nodeCmp21=nodeCmp();\r
 \r
                     state._fsp--;\r
@@ -1030,7 +1004,7 @@ public class LensQueryParser extends Parser {
     };\r
 \r
     // $ANTLR start "nodeCmp"\r
-    // LensQuery.g:247:1: fragment nodeCmp : ( cmpOp value -> ^( COMPARE OPERATOR[$cmpOp.text] OPERAND[$value.text] ) | Match Regex -> ^( PATTERNMATCH OPERAND[$Regex.text] ) );\r
+    // LensQuery.g:224: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
@@ -1051,7 +1025,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:249:3: ( cmpOp value -> ^( COMPARE OPERATOR[$cmpOp.text] OPERAND[$value.text] ) | Match Regex -> ^( PATTERNMATCH OPERAND[$Regex.text] ) )\r
+            // LensQuery.g:226: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
@@ -1069,15 +1043,15 @@ public class LensQueryParser extends Parser {
             }\r
             switch (alt8) {\r
                 case 1 :\r
-                    // LensQuery.g:249:5: cmpOp value\r
+                    // LensQuery.g:226:5: cmpOp value\r
                     {\r
-                    pushFollow(FOLLOW_cmpOp_in_nodeCmp1035);\r
+                    pushFollow(FOLLOW_cmpOp_in_nodeCmp1003);\r
                     cmpOp22=cmpOp();\r
 \r
                     state._fsp--;\r
 \r
                     stream_cmpOp.add(cmpOp22.getTree());\r
-                    pushFollow(FOLLOW_value_in_nodeCmp1037);\r
+                    pushFollow(FOLLOW_value_in_nodeCmp1005);\r
                     value23=value();\r
 \r
                     state._fsp--;\r
@@ -1096,9 +1070,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
-                    // 249:17: -> ^( COMPARE OPERATOR[$cmpOp.text] OPERAND[$value.text] )\r
+                    // 226:17: -> ^( COMPARE OPERATOR[$cmpOp.text] OPERAND[$value.text] )\r
                     {\r
-                        // LensQuery.g:249:20: ^( COMPARE OPERATOR[$cmpOp.text] OPERAND[$value.text] )\r
+                        // LensQuery.g:226: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
@@ -1115,12 +1089,12 @@ public class LensQueryParser extends Parser {
                     }\r
                     break;\r
                 case 2 :\r
-                    // LensQuery.g:250:5: Match Regex\r
+                    // LensQuery.g:227:5: Match Regex\r
                     {\r
-                    Match24=(Token)match(input,Match,FOLLOW_Match_in_nodeCmp1055);  \r
+                    Match24=(Token)match(input,Match,FOLLOW_Match_in_nodeCmp1023);  \r
                     stream_Match.add(Match24);\r
 \r
-                    Regex25=(Token)match(input,Regex,FOLLOW_Regex_in_nodeCmp1057);  \r
+                    Regex25=(Token)match(input,Regex,FOLLOW_Regex_in_nodeCmp1025);  \r
                     stream_Regex.add(Regex25);\r
 \r
 \r
@@ -1136,9 +1110,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
-                    // 250:17: -> ^( PATTERNMATCH OPERAND[$Regex.text] )\r
+                    // 227:17: -> ^( PATTERNMATCH OPERAND[$Regex.text] )\r
                     {\r
-                        // LensQuery.g:250:20: ^( PATTERNMATCH OPERAND[$Regex.text] )\r
+                        // LensQuery.g:227: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
@@ -1179,7 +1153,7 @@ public class LensQueryParser extends Parser {
     };\r
 \r
     // $ANTLR start "cmpOp"\r
-    // LensQuery.g:253:1: fragment cmpOp : ( Lt | Gt | Eq | Leq | Geq | Neq ) ;\r
+    // LensQuery.g:230: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
@@ -1191,8 +1165,8 @@ public class LensQueryParser extends Parser {
         Object set26_tree=null;\r
 \r
         try {\r
-            // LensQuery.g:254:6: ( ( Lt | Gt | Eq | Leq | Geq | Neq ) )\r
-            // LensQuery.g:254:8: ( Lt | Gt | Eq | Leq | Geq | Neq )\r
+            // LensQuery.g:231:6: ( ( Lt | Gt | Eq | Leq | Geq | Neq ) )\r
+            // LensQuery.g:231:8: ( Lt | Gt | Eq | Leq | Geq | Neq )\r
             {\r
             root_0 = (Object)adaptor.nil();\r
 \r
@@ -1233,31 +1207,31 @@ public class LensQueryParser extends Parser {
 \r
  \r
 \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_relation_in_expr774 = new BitSet(new long[]{0x0000000000000002L});\r
+    public static final BitSet FOLLOW_relation_i_in_relation792 = new BitSet(new long[]{0x0000000000000002L});\r
+    public static final BitSet FOLLOW_nodeName_in_relation_i808 = new BitSet(new long[]{0x0000300000000000L});\r
+    public static final BitSet FOLLOW_alias_in_relation_i810 = new BitSet(new long[]{0x0000200000000000L});\r
+    public static final BitSet FOLLOW_LParen_in_relation_i813 = new BitSet(new long[]{0x0020000002000000L});\r
+    public static final BitSet FOLLOW_nodeItem_in_relation_i816 = new BitSet(new long[]{0x0000440000000000L});\r
+    public static final BitSet FOLLOW_Comma_in_relation_i819 = new BitSet(new long[]{0x0020000002000000L});\r
+    public static final BitSet FOLLOW_nodeItem_in_relation_i822 = new BitSet(new long[]{0x0000440000000000L});\r
+    public static final BitSet FOLLOW_RParen_in_relation_i826 = new BitSet(new long[]{0x0000000000000002L});\r
+    public static final BitSet FOLLOW_QName_in_nodeName840 = new BitSet(new long[]{0x0000000000000002L});\r
+    public static final BitSet FOLLOW_String_in_nodeName851 = new BitSet(new long[]{0x0000000000000002L});\r
+    public static final BitSet FOLLOW_As_in_alias868 = new BitSet(new long[]{0x0020000000000000L});\r
+    public static final BitSet FOLLOW_QName_in_alias870 = new BitSet(new long[]{0x0000000000000002L});\r
+    public static final BitSet FOLLOW_nodeName_in_nodeItem890 = new BitSet(new long[]{0x000018FE00000002L});\r
+    public static final BitSet FOLLOW_alias_in_nodeItem892 = new BitSet(new long[]{0x000008FE00000002L});\r
+    public static final BitSet FOLLOW_nodeValue_in_nodeItem895 = new BitSet(new long[]{0x0000000000000002L});\r
+    public static final BitSet FOLLOW_relation_in_nodeItem921 = 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_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
+    public static final BitSet FOLLOW_Colon_in_nodeValue970 = new BitSet(new long[]{0x0020000026000000L});\r
+    public static final BitSet FOLLOW_value_in_nodeValue972 = new BitSet(new long[]{0x0000000000000002L});\r
+    public static final BitSet FOLLOW_nodeCmp_in_nodeValue983 = new BitSet(new long[]{0x0000000000000002L});\r
+    public static final BitSet FOLLOW_cmpOp_in_nodeCmp1003 = new BitSet(new long[]{0x0020000026000000L});\r
+    public static final BitSet FOLLOW_value_in_nodeCmp1005 = new BitSet(new long[]{0x0000000000000002L});\r
+    public static final BitSet FOLLOW_Match_in_nodeCmp1023 = new BitSet(new long[]{0x0000010000000000L});\r
+    public static final BitSet FOLLOW_Regex_in_nodeCmp1025 = new BitSet(new long[]{0x0000000000000002L});\r
+    public static final BitSet FOLLOW_set_in_cmpOp1050 = new BitSet(new long[]{0x0000000000000002L});\r
 \r
 }
\ No newline at end of file
index fafac17..6ef2a52 100644 (file)
@@ -31,8 +31,8 @@ import org.antlr.runtime.tree.Tree;
 import org.xerial.core.XerialErrorCode;\r
 import org.xerial.core.XerialException;\r
 import org.xerial.lens.Lens;\r
-import org.xerial.lens.relation.TupleElement;\r
 import org.xerial.lens.relation.Tuple;\r
+import org.xerial.lens.relation.TupleElement;\r
 import org.xerial.lens.relation.query.QuerySet;\r
 import org.xerial.lens.relation.query.QuerySet.QuerySetBuilder;\r
 import org.xerial.lens.relation.query.impl.LensQueryLexer;\r
@@ -68,8 +68,9 @@ public class RelationExpr extends Tuple<RelationAttribute> {
         try {\r
             LensQueryParser.relation_return ret = p.relation();\r
             if (_logger.isDebugEnabled())\r
-                _logger.debug("\n"\r
-                        + ANTLRUtil.parseTree((Tree) ret.getTree(), LensQueryParser.tokenNames));\r
+                _logger\r
+                        .debug(ANTLRUtil\r
+                                .parseTree((Tree) ret.getTree(), LensQueryParser.tokenNames));\r
 \r
             RelationQuery r = Lens.loadANTLRParseTree(RelationQuery.class, (Tree) ret.getTree(),\r
                     LensQueryParser.tokenNames);\r
index 20b44c1..3eb2e1c 100644 (file)
@@ -447,12 +447,51 @@ public class SilkWriter {
         return this;
     }
 
-    private String escapeDataLine(String dataLine) {
+    public SilkWriter text(String text) {
+        usabilityCheck();
+
+        attributeParenCloseCheck(true);
+
+        if (formatConfig.indentBeforeDataLine)
+            printIndent();
+
+        String line[] = text.split("\r?\n");
+        if (line == null)
+            return this;
+
+        for (String each : line) {
+            out.print(escapeDataLine(each));
+        }
+
+        return this;
+    }
+
+    public static String escapeText(String text) {
+        String[] line = text.split("\r?\n");
+        if (line == null)
+            return escapeDataLine(text);
+
+        List<String> buf = new ArrayList<String>();
+        for (String each : line) {
+            buf.add(escapeDataLine(each));
+        }
+        return StringUtil.join(buf, StringUtil.NEW_LINE);
+    }
+
+    private static Pattern leadingHyphen = Pattern.compile("\\s*-");
+
+    private static String escapeDataLine(String dataLine) {
+
+        if (dataLine == null)
+            return dataLine;
 
-        if (dataLine.startsWith("-")) {
+        Matcher m = leadingHyphen.matcher(dataLine);
+        if (m.lookingAt()) {
+            int hyphenPos = m.end();
             StringBuilder buf = new StringBuilder();
+            buf.append(dataLine.substring(0, hyphenPos - 1));
             buf.append("\\");
-            buf.append(dataLine);
+            buf.append(dataLine.substring(hyphenPos - 1));
             return buf.toString();
         }
 
index 7ca3196..1c83f5a 100644 (file)
@@ -26,7 +26,6 @@ package org.xerial.silk.cui;
 
 import java.io.BufferedReader;
 import java.io.InputStreamReader;
-import java.io.OutputStreamWriter;
 import java.net.URL;
 import java.util.HashSet;
 import java.util.Set;
@@ -37,6 +36,7 @@ import org.xerial.core.XerialException;
 import org.xerial.util.FileResource;
 import org.xerial.util.log.LogLevel;
 import org.xerial.util.log.Logger;
+import org.xerial.util.log.SimpleLogWriter;
 import org.xerial.util.opt.Argument;
 import org.xerial.util.opt.Option;
 import org.xerial.util.opt.OptionParser;
@@ -47,12 +47,10 @@ import org.xerial.util.opt.OptionParser;
  * @author leo
  * 
  */
-public class SilkMain
-{
+public class SilkMain {
     private static Logger _logger = Logger.getLogger(SilkMain.class);
 
-    public static class SilkGlobalOption
-    {
+    public static class SilkGlobalOption {
         @Option(symbol = "h", longName = "help", description = "display help message")
         boolean displayHelp = false;
 
@@ -65,48 +63,41 @@ public class SilkMain
 
     static Set<Class<SilkCommand>> availableCommands = new HashSet<Class<SilkCommand>>();
 
-    static
-    {
-        availableCommands.addAll(FileResource.findClasses(SilkMain.class.getPackage(), SilkCommand.class,
-                SilkMain.class.getClassLoader()));
+    static {
+        availableCommands.addAll(FileResource.findClasses(SilkMain.class.getPackage(),
+                SilkCommand.class, SilkMain.class.getClassLoader()));
 
     }
 
-    public static void main(String[] args)
-    {
-        Logger.getRootLogger().setOutputWriter(new OutputStreamWriter(System.err));
+    public static void main(String[] args) {
+        Logger.getRootLogger().setLogWriter(new SimpleLogWriter(System.err));
 
         SilkGlobalOption globalOption = new SilkGlobalOption();
         OptionParser parser = new OptionParser(globalOption);
         Logger.getRootLogger().setLogLevel(globalOption.logLevel);
-        try
-        {
+        try {
             parser.parse(args, true);
 
             if (globalOption.subCommand == null)
                 throw new XerialException(XerialErrorCode.INVALID_INPUT, "no command");
 
             SilkCommand command = null;
-            for (Class<SilkCommand> each : availableCommands)
-            {
-                try
-                {
+            for (Class<SilkCommand> each : availableCommands) {
+                try {
                     command = each.newInstance();
-                    if (command.getName() != null && command.getName().equals(globalOption.subCommand))
+                    if (command.getName() != null
+                            && command.getName().equals(globalOption.subCommand))
                         break;
                 }
-                catch (InstantiationException e)
-                {
+                catch (InstantiationException e) {
                     _logger.warn(e);
                 }
-                catch (IllegalAccessException e)
-                {
+                catch (IllegalAccessException e) {
                     _logger.warn(e);
                 }
             }
 
-            if (command == null)
-            {
+            if (command == null) {
                 _logger.error("command is not specified");
                 return;
             }
@@ -114,18 +105,18 @@ public class SilkMain
             // 
             OptionParser subCommandOptionParser = new OptionParser(command);
             // run the sub command
-            if (globalOption.displayHelp)
-            {
+            if (globalOption.displayHelp) {
                 // display help messsage of the command
                 String helpFileName = String.format("help-%s.txt", command.getName());
                 URL helpFileAddr = FileResource.find(SilkMain.class, helpFileName);
                 if (helpFileAddr == null)
-                    throw new XerialError(XerialErrorCode.RESOURCE_NOT_FOUND, "help file not found: " + helpFileName);
+                    throw new XerialError(XerialErrorCode.RESOURCE_NOT_FOUND,
+                            "help file not found: " + helpFileName);
 
-                BufferedReader helpReader = new BufferedReader(new InputStreamReader(helpFileAddr.openStream()));
+                BufferedReader helpReader = new BufferedReader(new InputStreamReader(helpFileAddr
+                        .openStream()));
                 String line;
-                while ((line = helpReader.readLine()) != null)
-                {
+                while ((line = helpReader.readLine()) != null) {
                     System.out.println(line);
                 }
                 subCommandOptionParser.printUsage();
@@ -137,12 +128,10 @@ public class SilkMain
             command.execute();
 
         }
-        catch (Exception e)
-        {
+        catch (Exception e) {
             _logger.error(e);
         }
-        catch (Error e)
-        {
+        catch (Error e) {
             e.printStackTrace();
         }
 
diff --git a/src/main/java/org/xerial/util/log/LogWriter.java b/src/main/java/org/xerial/util/log/LogWriter.java
new file mode 100644 (file)
index 0000000..72df36d
--- /dev/null
@@ -0,0 +1,39 @@
+/*--------------------------------------------------------------------------\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
+// LogWriter.java\r
+// Since: Oct 13, 2009 3:24:15 PM\r
+//\r
+// $URL$\r
+// $Author$\r
+//--------------------------------------\r
+package org.xerial.util.log;\r
+\r
+import java.io.IOException;\r
+\r
+/**\r
+ * LogWriter interface\r
+ * \r
+ * @author leo\r
+ * \r
+ */\r
+public interface LogWriter {\r
+\r
+    public void log(Logger logger, LogLevel logLevel, Object message) throws IOException;\r
+\r
+}\r
index 12178bb..38648d0 100644 (file)
@@ -28,33 +28,19 @@ import java.io.BufferedReader;
 import java.io.ByteArrayInputStream;
 import java.io.FileReader;
 import java.io.IOException;
-import java.io.OutputStreamWriter;
 import java.io.Reader;
-import java.io.Writer;
 import java.util.Properties;
 import java.util.TreeMap;
 
-import org.xerial.util.StringUtil;
-
 /**
  * Logger
  * 
  * @author leo
  * 
  */
-public class Logger
-{
-    private static String[] logPrefix = { "", // ALL
-            "\033[0;32m", // TRACE
-            "", // DEBUG
-            "\033[1;36m", // INFO
-            "\033[1;33m", // WARN
-            "\033[1;35m", // ERROR
-            "\033[1;31m", // FATAL
-            "", // OFF
-            "", };
-
-    private Writer _out = null;
+public class Logger {
+
+    private LogWriter writer = null;
     private LogLevel _threshold = LogLevel.UNSPECIFIED;
     private String _loggerFullName = "";
     private String _loggerShortName = "";
@@ -64,23 +50,20 @@ public class Logger
     private static TreeMap<String, Logger> _loggerHolder = new TreeMap<String, Logger>();
     private static Logger _rootLogger = new Logger();
 
-    static
-    {
+    static {
         _rootLogger.setLogLevel(LogLevel.INFO);
-        _rootLogger.setOutputWriter(new OutputStreamWriter(System.err));
+        _rootLogger.setLogWriter(new SimpleLogWriter());
+
         _rootLogger._loggerFullName = "root";
         _rootLogger._loggerShortName = "root";
 
         String logLevel = System.getProperty("xerial.loglevel");
-        if (logLevel != null)
-        {
+        if (logLevel != null) {
             _rootLogger.setLogLevel(logLevel);
         }
-        else
-        {
+        else {
             logLevel = System.getProperty("loglevel");
-            if (logLevel != null)
-            {
+            if (logLevel != null) {
                 _rootLogger.setLogLevel(logLevel);
             }
         }
@@ -90,14 +73,11 @@ public class Logger
             _rootLogger._emitEscapeSequence = Boolean.parseBoolean(useColor);
 
         String loggerConfigFile = System.getProperty("log.config");
-        if (loggerConfigFile != null)
-        {
-            try
-            {
+        if (loggerConfigFile != null) {
+            try {
                 Logger.configure(loggerConfigFile);
             }
-            catch (IOException e)
-            {
+            catch (IOException e) {
                 e.printStackTrace();
             }
         }
@@ -107,30 +87,25 @@ public class Logger
     /**
      * hide constructor
      */
-    private Logger()
-    {
+    private Logger() {
 
     }
 
-    private Logger(String fullTypeName)
-    {
+    private Logger(String fullTypeName) {
         _loggerFullName = fullTypeName;
         String[] packageList = _loggerFullName.split("\\.");
         _loggerShortName = packageList[packageList.length - 1];
         if (packageList.length == 1)
             _parentLogger = _rootLogger;
-        else
-        {
+        else {
             String parentPackageName = concatinate(packageList, packageList.length - 1);
             _parentLogger = getLogger(parentPackageName);
         }
     }
 
-    private String concatinate(String[] packageList, int upTo)
-    {
+    private String concatinate(String[] packageList, int upTo) {
         StringBuilder builder = new StringBuilder();
-        for (int i = 0; i < upTo - 1; i++)
-        {
+        for (int i = 0; i < upTo - 1; i++) {
             builder.append(packageList[i]);
             builder.append(".");
         }
@@ -138,33 +113,28 @@ public class Logger
         return builder.toString();
     }
 
-    public static Logger getLogger(Class< ? > c)
-    {
+    public static Logger getLogger(Class< ? > c) {
         return getLogger(c.getName());
     }
 
-    public static Logger getLogger(Class< ? > c, String suffix)
-    {
+    public static Logger getLogger(Class< ? > c, String suffix) {
         if (suffix == null || suffix.length() <= 0)
             return getLogger(c);
         else
             return getLogger(String.format("%s-%s", c.getName(), suffix));
     }
 
-    public static Logger getLogger(Package p)
-    {
+    public static Logger getLogger(Package p) {
         return getLogger(p.getName());
     }
 
-    public static synchronized Logger getLogger(String fullTypeName)
-    {
+    public static synchronized Logger getLogger(String fullTypeName) {
         if (fullTypeName == null)
             return _rootLogger;
 
         if (_loggerHolder.containsKey(fullTypeName))
             return _loggerHolder.get(fullTypeName);
-        else
-        {
+        else {
             Logger newLogger = new Logger(fullTypeName);
             _loggerHolder.put(fullTypeName, newLogger);
             newLogger._emitEscapeSequence = _rootLogger._emitEscapeSequence;
@@ -172,75 +142,64 @@ public class Logger
         }
     }
 
-    public static Logger getRootLogger()
-    {
+    public static Logger getRootLogger() {
         return _rootLogger;
     }
 
-    public static void configure(String configFile) throws IOException
-    {
+    public static void configure(String configFile) throws IOException {
         configure(new BufferedReader(new FileReader(configFile)));
     }
 
-    public static void configure(Reader configurationFileReader) throws IOException
-    {
+    public static void configure(Reader configurationFileReader) throws IOException {
         Properties configProperties = new Properties();
 
         StringBuilder sb = new StringBuilder();
         int ch;
-        while ((ch = configurationFileReader.read()) > 0)
-        {
+        while ((ch = configurationFileReader.read()) > 0) {
             sb.append((char) ch);
         }
         ByteArrayInputStream bs = new ByteArrayInputStream(sb.toString().getBytes());
         configProperties.load(bs);
 
-        for (Object key : configProperties.keySet())
-        {
+        for (Object key : configProperties.keySet()) {
             String[] lhs = ((String) key).split("#");
             String loggerName = lhs[0];
             String value = configProperties.getProperty(key.toString());
             Logger logger = getLogger(loggerName);
-            if (lhs.length <= 1)
-            {
+            if (lhs.length <= 1) {
                 logger.setLogLevel(value);
             }
-            else if (lhs.length > 1)
-            {
+            else if (lhs.length > 1) {
                 // packageName:parameter = value configuration
                 String parameter = lhs[1];
-                if (parameter.equals("color"))
-                {
-                    logger.setColor(Boolean.parseBoolean(value));
+                if (parameter.equals("color")) {
+                    logger.enableColor(Boolean.parseBoolean(value));
                 }
-                else
-                {
+                else {
                     System.err.println("unknown configuration parameter: " + parameter);
                 }
             }
-            else
-            {
+            else {
                 System.err.println("Error in the logger configuration file: " + key);
             }
         }
     }
 
-    public String getLoggerName()
-    {
+    public String getLoggerName() {
         return _loggerFullName;
     }
 
-    public void setLogLevel(LogLevel logLevel)
-    {
+    public String getLoggerShortName() {
+        return _loggerShortName;
+    }
+
+    public void setLogLevel(LogLevel logLevel) {
         this._threshold = logLevel;
     }
 
-    public void setLogLevel(String logLevel)
-    {
-        for (LogLevel l : LogLevel.values())
-        {
-            if (l.name().equalsIgnoreCase(logLevel))
-            {
+    public void setLogLevel(String logLevel) {
+        for (LogLevel l : LogLevel.values()) {
+            if (l.name().equalsIgnoreCase(logLevel)) {
                 setLogLevel(l);
                 return;
             }
@@ -249,48 +208,43 @@ public class Logger
         warn("unknown log level: " + logLevel);
     }
 
-    public LogLevel getLogLevel()
-    {
+    public LogLevel getLogLevel() {
         return _threshold;
     }
 
-    public void setOutputWriter(Writer writer)
-    {
-        this._out = writer;
+    public void setLogWriter(LogWriter writer) {
+        if (writer == null)
+            throw new NullPointerException();
+
+        this.writer = writer;
     }
 
-    public boolean trace(Object message)
-    {
+    public boolean trace(Object message) {
         log(LogLevel.TRACE, message);
         return true;
     }
 
-    public boolean debug(Object message)
-    {
+    public boolean debug(Object message) {
         log(LogLevel.DEBUG, message);
         return true;
     }
 
-    public boolean info(Object message)
-    {
+    public boolean info(Object message) {
         log(LogLevel.INFO, message);
         return true;
     }
 
-    public boolean warn(Object message)
-    {
+    public boolean warn(Object message) {
         log(LogLevel.WARN, message);
         return true;
     }
 
-    public boolean error(Object message)
-    {
+    public boolean error(Object message) {
         log(LogLevel.ERROR, message);
         return true;
     }
 
-    public boolean fatal(Object message)
-    {
+    public boolean fatal(Object message) {
         log(LogLevel.FATAL, message);
         return true;
     }
@@ -301,56 +255,45 @@ public class Logger
      * @param enable
      * @return
      */
-    public void setColor(boolean enable)
-    {
+    public void enableColor(boolean enable) {
         _emitEscapeSequence = enable;
     }
 
     /**
      * @return true when escape sequence is used to output the log
      */
-    public boolean isColorEnabled()
-    {
+    public boolean isColorEnabled() {
         return _emitEscapeSequence;
     }
 
-    public boolean isDebugEnabled()
-    {
+    public boolean isDebugEnabled() {
         return isEnabled(LogLevel.DEBUG);
     }
 
-    public boolean isTraceEnabled()
-    {
+    public boolean isTraceEnabled() {
         return isEnabled(LogLevel.TRACE);
     }
 
-    public boolean isInfoEnabled()
-    {
+    public boolean isInfoEnabled() {
         return isEnabled(LogLevel.INFO);
     }
 
-    public boolean isWarnEnabled()
-    {
+    public boolean isWarnEnabled() {
         return isEnabled(LogLevel.WARN);
     }
 
-    public boolean isErrorEnabled()
-    {
+    public boolean isErrorEnabled() {
         return isEnabled(LogLevel.ERROR);
     }
 
-    public boolean isFatalEnalbed()
-    {
+    public boolean isFatalEnalbed() {
         return isEnabled(LogLevel.FATAL);
     }
 
-    public boolean isEnabled(LogLevel logLevel)
-    {
-        if (_threshold == LogLevel.UNSPECIFIED)
-        {
+    public boolean isEnabled(LogLevel logLevel) {
+        if (_threshold == LogLevel.UNSPECIFIED) {
             Logger parent = this;
-            while ((parent = parent._parentLogger) != null)
-            {
+            while ((parent = parent._parentLogger) != null) {
                 if (parent.getLogLevel() == LogLevel.UNSPECIFIED)
                     continue;
 
@@ -363,42 +306,29 @@ public class Logger
         return _threshold.ordinal() <= logLevel.ordinal();
     }
 
-    private Writer getWriter()
-    {
-        if (_out != null)
-            return _out;
-        else
-        {
+    private LogWriter getLogWriter() {
+        if (writer != null)
+            return writer;
+        else {
             if (_parentLogger != null)
-                return _parentLogger.getWriter();
+                return _parentLogger.getLogWriter();
             else
                 return null;
         }
     }
 
-    private void log(LogLevel logLevel, Object message)
-    {
+    private void log(LogLevel logLevel, Object message) {
         if (!isEnabled(logLevel))
             return;
 
-        Writer logOut = getWriter();
+        LogWriter logOut = getLogWriter();
         if (logOut == null)
             return; // no output is specified
 
-        try
-        {
-            if (_emitEscapeSequence)
-                logOut.write(logPrefix[logLevel.ordinal()]);
-            logOut.write("[" + _loggerShortName + "]\t");
-            if (message != null)
-                logOut.write(message.toString());
-            if (_emitEscapeSequence)
-                logOut.write("\033[0m");
-            logOut.write(StringUtil.newline());
-            logOut.flush();
+        try {
+            logOut.log(this, logLevel, message);
         }
-        catch (IOException e)
-        {
+        catch (IOException e) {
             e.printStackTrace();
         }
     }
diff --git a/src/main/java/org/xerial/util/log/SilkLogWriter.java b/src/main/java/org/xerial/util/log/SilkLogWriter.java
new file mode 100644 (file)
index 0000000..fadc24f
--- /dev/null
@@ -0,0 +1,72 @@
+/*--------------------------------------------------------------------------\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
+// SilkLogWriter.java\r
+// Since: Oct 13, 2009 3:35:01 PM\r
+//\r
+// $URL$\r
+// $Author$\r
+//--------------------------------------\r
+package org.xerial.util.log;\r
+\r
+import java.io.IOException;\r
+import java.io.OutputStreamWriter;\r
+import java.io.Writer;\r
+\r
+import org.xerial.silk.SilkWriter;\r
+import org.xerial.util.StringUtil;\r
+\r
+/**\r
+ * Generating log in Silk format\r
+ * \r
+ * @author leo\r
+ * \r
+ */\r
+public class SilkLogWriter implements LogWriter {\r
+\r
+    private Writer logOut = new OutputStreamWriter(System.err);\r
+\r
+    public SilkLogWriter() {\r
+\r
+    }\r
+\r
+    public SilkLogWriter(Writer out) {\r
+        this.logOut = out;\r
+    }\r
+\r
+    public void log(Logger logger, LogLevel logLevel, Object message) throws IOException {\r
+\r
+        if (logOut == null)\r
+            return; // no output is specified\r
+\r
+        synchronized (this) {\r
+            logOut.write(String.format("-%s(name:%s)", logLevel, logger.getLoggerShortName()));\r
+\r
+            if (message != null) {\r
+                logOut.write(StringUtil.NEW_LINE);\r
+                String m = SilkWriter.escapeText(message.toString());\r
+                logOut.write(m);\r
+            }\r
+\r
+            logOut.write(StringUtil.newline());\r
+            logOut.flush();\r
+        }\r
+\r
+    }\r
+\r
+}\r
diff --git a/src/main/java/org/xerial/util/log/SimpleLogWriter.java b/src/main/java/org/xerial/util/log/SimpleLogWriter.java
new file mode 100644 (file)
index 0000000..37c9c1c
--- /dev/null
@@ -0,0 +1,92 @@
+/*--------------------------------------------------------------------------\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
+// ConsoleLogWriter.java\r
+// Since: Oct 13, 2009 3:25:28 PM\r
+//\r
+// $URL$\r
+// $Author$\r
+//--------------------------------------\r
+package org.xerial.util.log;\r
+\r
+import java.io.IOException;\r
+import java.io.OutputStream;\r
+import java.io.OutputStreamWriter;\r
+import java.io.Writer;\r
+\r
+import org.xerial.util.StringUtil;\r
+\r
+/**\r
+ * Generating log for console output\r
+ * \r
+ * @author leo\r
+ * \r
+ */\r
+public class SimpleLogWriter implements LogWriter {\r
+\r
+    private Writer logOut;\r
+\r
+    public SimpleLogWriter() {\r
+        logOut = new OutputStreamWriter(System.err);\r
+    }\r
+\r
+    public SimpleLogWriter(OutputStream out) {\r
+        logOut = new OutputStreamWriter(out);\r
+    }\r
+\r
+    public SimpleLogWriter(Writer out) {\r
+        logOut = out;\r
+    }\r
+\r
+    private static String[] logPrefix = { "", // ALL\r
+            "\033[0;32m", // TRACE\r
+            "", // DEBUG\r
+            "\033[1;36m", // INFO\r
+            "\033[1;33m", // WARN\r
+            "\033[1;35m", // ERROR\r
+            "\033[1;31m", // FATAL\r
+            "", // OFF\r
+            "", };\r
+\r
+    public void log(Logger logger, LogLevel logLevel, Object message) {\r
+\r
+        if (logOut == null)\r
+            return; // no output is specified\r
+\r
+        try {\r
+            synchronized (this) {\r
+                if (logger.isColorEnabled())\r
+                    logOut.write(logPrefix[logLevel.ordinal()]);\r
+\r
+                logOut.write(String.format("[%s] %s", logger.getLoggerShortName(),\r
+                        message != null ? message.toString() : ""));\r
+                if (logger.isColorEnabled())\r
+                    logOut.write("\033[0m");\r
+\r
+                logOut.write(StringUtil.newline());\r
+\r
+                logOut.flush();\r
+            }\r
+        }\r
+        catch (IOException e) {\r
+            e.printStackTrace();\r
+        }\r
+\r
+    }\r
+\r
+}\r
index 8f86846..a6150f5 100644 (file)
@@ -371,26 +371,23 @@ public class LensTest {
     }
 
     public static class TupleNode extends NodeBase<TupleNode> {
+        public final int id;
         public final String name;
 
-        public TupleNode(String name) {
+        public TupleNode(int id, String name) {
+            this.id = id;
             this.name = name;
         }
-
-        @Override
-        public String toString() {
-            return name;
-        }
     }
 
     @Test
     public void testToSilkTuple() throws Exception {
         Tuple<TupleNode> t = new Tuple<TupleNode>();
-        t.add(new TupleNode("A"));
-        t.add(new TupleNode("B"));
+        t.add(new TupleNode(1, "A"));
+        t.add(new TupleNode(2, "B"));
 
         String s = Lens.toSilk(t);
-        _logger.info(s);
+        _logger.debug(s);
     }
 
 }
index 7a3a81b..902c041 100644 (file)
@@ -202,4 +202,22 @@ public class SilkWriterTest {
 \r
     }\r
 \r
+    @Test\r
+    public void escapeText() throws Exception {\r
+        String s = SilkWriter.escapeText("-A(id:1)\n  -B");\r
+\r
+        String[] l = s.split("\r?\n");\r
+\r
+        assertEquals("\\-A(id:1)", l[0]);\r
+        assertEquals("  \\-B", l[1]);\r
+\r
+    }\r
+\r
+    @Test\r
+    public void escapeBackSlash() throws Exception {\r
+        String e = SilkWriter.escapeText("\\-already escaped");\r
+        assertEquals("\\-already escaped", e);\r
+\r
+    }\r
+\r
 }\r