OSDN Git Service

git-svn-id: http://www.xerial.org/svn/project/XerialJ/trunk/xerial-core@3497 ae02f08e...
authorleo <leo@ae02f08e-27ec-0310-ae8c-8ba02fe2eafd>
Thu, 30 Jul 2009 01:11:30 +0000 (01:11 +0000)
committerleo <leo@ae02f08e-27ec-0310-ae8c-8ba02fe2eafd>
Thu, 30 Jul 2009 01:11:30 +0000 (01:11 +0000)
24 files changed:
src/main/java/org/xerial/core/ErrorCode.java
src/main/java/org/xerial/core/XerialError.java
src/main/java/org/xerial/core/XerialErrorCode.java
src/main/java/org/xerial/core/XerialException.java
src/main/java/org/xerial/json/JSONErrorCode.java
src/main/java/org/xerial/lens/Lens.java
src/main/java/org/xerial/lens/ObjectMapper.java
src/main/java/org/xerial/silk/schema/impl/SilkSchema.g
src/main/java/org/xerial/silk/schema/impl/SilkSchema.tokens
src/main/java/org/xerial/silk/schema/impl/SilkSchemaLexer.java
src/main/java/org/xerial/silk/schema/impl/SilkSchemaParser.java
src/main/java/org/xerial/util/bean/BeanErrorCode.java
src/main/java/org/xerial/util/opt/Argument.java
src/main/java/org/xerial/util/opt/OptionItem.java
src/main/java/org/xerial/util/opt/OptionParser.java
src/main/java/org/xerial/util/opt/OptionParserException.java
src/main/java/org/xerial/util/opt/OptionSchema.java
src/main/java/org/xerial/util/opt/ShellError.java
src/main/java/org/xerial/util/opt/help-message.template
src/main/java/org/xerial/util/xml/XMLErrorCode.java
src/test/java/org/xerial/lens/LensTest.java
src/test/java/org/xerial/silk/schema/SilkSchemaTest.java
src/test/java/org/xerial/silk/schema/read.silk
src/test/java/org/xerial/util/opt/OptionParserTest.java

index eb9c8c7..951eb5c 100644 (file)
 package org.xerial.core;
 
 /**
- * A common interfarce for error codes
+ * A common interface for error codes
  * 
  * @author leo
  * 
  */
-public interface ErrorCode
-{
+public interface ErrorCode {
+
     static final String EMPTY_DESCRIPTION = "";
 
     /**
@@ -47,4 +47,5 @@ public interface ErrorCode
      * @return
      */
     public String getDescription();
+
 }
index 7c01202..ad307f0 100644 (file)
@@ -31,8 +31,7 @@ package org.xerial.core;
  * @author leo
  * 
  */
-public class XerialError extends RuntimeException
-{
+public class XerialError extends RuntimeException {
     /**
      * 
      */
@@ -40,38 +39,32 @@ public class XerialError extends RuntimeException
 
     private final ErrorCode errorCode;
 
-    public XerialError(ErrorCode errorCode)
-    {
+    public XerialError(ErrorCode errorCode) {
         super();
         this.errorCode = errorCode;
     }
 
-    public XerialError(ErrorCode errorCode, String message, Throwable cause)
-    {
+    public XerialError(ErrorCode errorCode, String message, Throwable cause) {
         super(message, cause);
         this.errorCode = errorCode;
     }
 
-    public XerialError(ErrorCode errorCode, String message)
-    {
+    public XerialError(ErrorCode errorCode, String message) {
         super(message);
         this.errorCode = errorCode;
     }
 
-    public XerialError(ErrorCode errorCode, Throwable cause)
-    {
+    public XerialError(ErrorCode errorCode, Throwable cause) {
         super(cause);
         this.errorCode = errorCode;
     }
-    
-    public XerialError(XerialError cause)
-    {
+
+    public XerialError(XerialError cause) {
         super(cause);
         this.errorCode = cause.getErrorCode();
     }
-    
-    public XerialError(XerialException cause)
-    {
+
+    public XerialError(XerialException cause) {
         super(cause);
         this.errorCode = cause.getErrorCode();
     }
@@ -81,14 +74,12 @@ public class XerialError extends RuntimeException
      * 
      * @return
      */
-    public ErrorCode getErrorCode()
-    {
+    public ErrorCode getErrorCode() {
         return errorCode;
     }
 
     @Override
-    public String getMessage()
-    {
+    public String getMessage() {
         return ExceptionHelper.getMessage(errorCode, super.getMessage());
     }
 
index bde6202..c2f8d20 100644 (file)
@@ -33,12 +33,7 @@ package org.xerial.core;
 public enum XerialErrorCode implements ErrorCode {
 
     // related to programming error
-    INVALID_STATE,
-    SYNTAX_ERROR,
-    NOT_INITIALIZED,
-    UNSUPPORTED,
-    INVALID_INPUT,
-    NOT_READY,
+    INVALID_STATE, SYNTAX_ERROR, NOT_INITIALIZED, UNSUPPORTED, INVALID_INPUT, INVALID_ARGUMENT, NOT_READY,
     // collection
     MISSING_ELEMENT,
 
@@ -46,52 +41,40 @@ public enum XerialErrorCode implements ErrorCode {
     RESOURCE_NOT_FOUND,
 
     // I/O
-    READ_ERROR,
-    OUTPUT_ERROR,
-    IO_EXCEPTION,
-    INTERRUPTED,
+    READ_ERROR, OUTPUT_ERROR, IO_EXCEPTION, INTERRUPTED,
 
     // option parser error
-    DUPLICATE_OPTION,
-    NO_OPTION,
-    NO_USAGE_ANNOTATION,
-    MISSING_ARGUMENT,
+    DUPLICATE_OPTION, NO_OPTION, NO_USAGE_ANNOTATION, MISSING_ARGUMENT,
 
     // type 
-    MISSING_TYPE_PARAMETER,
-    NOT_A_COLLECTION,
-    INACCESSIBLE_METHOD,
-    WRONG_DATA_TYPE,
-    DECODE_ERROR,
-    ENCODE_ERROR,
+    MISSING_TYPE_PARAMETER, NOT_A_COLLECTION, INACCESSIBLE_METHOD, WRONG_DATA_TYPE, DECODE_ERROR, ENCODE_ERROR,
 
     // parse error
-    INVALID_TOKEN,
-    PARSE_ERROR,
+    INVALID_TOKEN, PARSE_ERROR,
 
     // general exception
     INHERITED, ;
 
     private final String description;
 
-    private XerialErrorCode()
-    {
+    private XerialErrorCode() {
         this.description = EMPTY_DESCRIPTION;
     }
 
-    private XerialErrorCode(String description)
-    {
+    private XerialErrorCode(String description) {
         this.description = description;
     }
 
-    public String getCodeName()
-    {
+    public String getCodeName() {
         return name();
     }
 
-    public String getDescription()
-    {
+    public String getDescription() {
         return null;
     }
 
+    public Enum< ? > getCode() {
+        return this;
+    }
+
 }
index 8a0d4a8..1f45ba0 100644 (file)
@@ -38,39 +38,33 @@ import org.xerial.json.JSONErrorCode;
  * @author leo
  * 
  */
-public class XerialException extends Exception
-{
+public class XerialException extends Exception {
     private static final long serialVersionUID = 1L;
 
-    private final ErrorCode   errorCode;
+    private final ErrorCode errorCode;
 
-    public XerialException(XerialException e)
-    {
+    public XerialException(XerialException e) {
         super(e.getErrorMessage());
         this.errorCode = e.errorCode;
 
     }
 
-    public XerialException(ErrorCode errorCode)
-    {
+    public XerialException(ErrorCode errorCode) {
         super();
         this.errorCode = errorCode;
     }
 
-    public XerialException(ErrorCode errorCode, String message, Throwable cause)
-    {
+    public XerialException(ErrorCode errorCode, String message, Throwable cause) {
         super(message, cause);
         this.errorCode = errorCode;
     }
 
-    public XerialException(ErrorCode errorCode, String message)
-    {
+    public XerialException(ErrorCode errorCode, String message) {
         super(message);
         this.errorCode = errorCode;
     }
 
-    public XerialException(ErrorCode errorCode, Throwable cause)
-    {
+    public XerialException(ErrorCode errorCode, Throwable cause) {
         super(cause);
         this.errorCode = errorCode;
     }
@@ -80,19 +74,16 @@ public class XerialException extends Exception
      * 
      * @return
      */
-    public ErrorCode getErrorCode()
-    {
+    public ErrorCode getErrorCode() {
         return errorCode;
     }
 
     @Override
-    public String getMessage()
-    {
+    public String getMessage() {
         return ExceptionHelper.getMessage(errorCode, super.getMessage());
     }
 
-    private String getErrorMessage()
-    {
+    private String getErrorMessage() {
         return super.getMessage();
     }
 
index d2a6997..bef13ca 100644 (file)
@@ -45,24 +45,24 @@ public enum JSONErrorCode implements ErrorCode {
 
     private final String description;
 
-    private JSONErrorCode(String description)
-    {
+    private JSONErrorCode(String description) {
         this.description = description;
     }
 
-    private JSONErrorCode()
-    {
+    private JSONErrorCode() {
         this.description = EMPTY_DESCRIPTION;
     }
 
-    public String getCodeName()
-    {
+    public String getCodeName() {
         return name();
     }
 
-    public String getDescription()
-    {
+    public String getDescription() {
         return description;
     }
 
+    public Enum< ? > getCode() {
+        return this;
+    }
+
 }
index 4c7cb7d..7475aae 100644 (file)
@@ -255,19 +255,19 @@ public class Lens {
         return mapper.map(result, parser);
     }
 
+    public static String toJSON(Object obj) {
+        return ObjectLens.toJSON(obj);
+    }
+
     public static <Result> void find(Class<Result> bindingType, TreeParser parser,
             ObjectHandler<Result> handler) throws XerialException {
         find(bindingType, bindingType.getSimpleName(), parser, handler);
     }
 
-    public static String toJSON(Object obj) {
-        return ObjectLens.toJSON(obj);
-    }
-
     public static <Result> void find(Class<Result> bindingType, String coreNodeName,
             TreeParser parser, ObjectHandler<Result> handler) throws XerialException {
         ObjectMapper mapper = ObjectMapper.getMapper(bindingType.getClass());
-
+        mapper.find(bindingType, parser, coreNodeName, handler);
     }
 
 }
index bc2d849..f54093d 100644 (file)
@@ -218,6 +218,26 @@ public class ObjectMapper {
 
     }
 
+    public <T> void find(Class<T> targetType, TreeParser parser,
+            String coreNodeNameOfTheTargetType, ObjectHandler<T> handler) throws XerialException {
+
+        try {
+            AmoebaJoinHandler mapper = new RelationExtracter();
+
+            _logger.info(qs);
+
+            StreamAmoebaJoin aj = new StreamAmoebaJoin(qs, mapper);
+            aj.sweep(parser);
+        }
+        catch (IOException e) {
+            throw new XerialException(XerialErrorCode.IO_EXCEPTION, e);
+        }
+        catch (Exception e) {
+            throw new XerialException(XerialErrorCode.INHERITED, e);
+        }
+
+    }
+
     private QuerySet buildQuery(Class< ? > targetType) {
         QueryBuilder qb = new QueryBuilder();
         qb.build(targetType, "root");
index 3694620..d29b5ba 100644 (file)
@@ -171,6 +171,7 @@ BelongsTo: 'belongs_to';
 Default: 'default';\r
 Projection: 'projection';\r
 OrderBy: 'order_by';\r
+On: 'on';\r
 \r
 fragment SafeFirstLetter: 'A' .. 'Z' | 'a' .. 'z';\r
 fragment SafeLetter: SafeFirstLetter | '0' .. '9' | '-' | '_';\r
@@ -251,7 +252,7 @@ fragment
 includeItem: QName -> Mixin[$QName.text];\r
 \r
 fragment \r
-indexStatement: Index QName indexTarget (Comma indexTarget)*\r
+indexStatement: Index QName On indexTarget (Comma indexTarget)*\r
   -> ^(Index TypeName[$QName.text] indexTarget+)\r
 ; \r
 \r
index 84c5bfb..46a8d95 100644 (file)
@@ -11,9 +11,9 @@ Frac=31
 HexDigit=24\r
 Symbol=47\r
 OrderBy=56\r
-T__65=65\r
 Default=54\r
 Argument=17\r
+On=57\r
 Index=52\r
 Module=5\r
 Letter=23\r
@@ -27,30 +27,30 @@ DefaultValue=13
 Integer=30\r
 Relation=51\r
 Mixin=9\r
-WhiteSpace=62\r
+WhiteSpace=63\r
 ClassDef=6\r
 LineComment=20\r
-ModuleName=59\r
+ModuleName=60\r
 Projection=55\r
 BelongsTo=53\r
-SafeFirstLetter=57\r
+SafeFirstLetter=58\r
 Star=43\r
 Preamble=19\r
 Exp=32\r
-QNameChar=63\r
+QNameChar=64\r
 RParen=42\r
 UnicodeChar=25\r
 StringChar=27\r
 LineBreak=21\r
 Function=16\r
 Name=7\r
-ModuleDef=61\r
+ModuleDef=62\r
 LParen=41\r
 String=29\r
-SafeLetter=58\r
+SafeLetter=59\r
 LineBreakChar=18\r
 IsArray=11\r
-QName=64\r
+QName=65\r
 StringChar_s=28\r
 UnsafeUnicodeChar=44\r
 Double=33\r
@@ -59,5 +59,5 @@ RBracket=37
 Lt=38\r
 Parent=8\r
 TypeName=12\r
-WhiteSpaces=60\r
-'on'=65\r
+WhiteSpaces=61\r
+'on'=57\r
index a64b03b..babee93 100644 (file)
@@ -1,4 +1,4 @@
-// $ANTLR 3.1.3 Mar 17, 2009 19:23:44 SilkSchema.g 2009-07-08 15:38:42\r
+// $ANTLR 3.1.3 Mar 17, 2009 19:23:44 SilkSchema.g 2009-07-08 19:54:26\r
 \r
 /*--------------------------------------------------------------------------\r
  *  Copyright 2009 Taro L. Saito\r
@@ -46,10 +46,10 @@ public class SilkSchemaLexer extends Lexer {
     public static final int Frac=31;\r
     public static final int HexDigit=24;\r
     public static final int Symbol=47;\r
-    public static final int T__65=65;\r
     public static final int OrderBy=56;\r
     public static final int Default=54;\r
     public static final int Argument=17;\r
+    public static final int On=57;\r
     public static final int Index=52;\r
     public static final int Module=5;\r
     public static final int Letter=23;\r
@@ -63,17 +63,17 @@ public class SilkSchemaLexer extends Lexer {
     public static final int Integer=30;\r
     public static final int Relation=51;\r
     public static final int Mixin=9;\r
-    public static final int WhiteSpace=62;\r
+    public static final int WhiteSpace=63;\r
     public static final int ClassDef=6;\r
     public static final int LineComment=20;\r
-    public static final int ModuleName=59;\r
+    public static final int ModuleName=60;\r
     public static final int Projection=55;\r
     public static final int BelongsTo=53;\r
-    public static final int SafeFirstLetter=57;\r
+    public static final int SafeFirstLetter=58;\r
     public static final int Star=43;\r
     public static final int Preamble=19;\r
     public static final int Exp=32;\r
-    public static final int QNameChar=63;\r
+    public static final int QNameChar=64;\r
     public static final int RParen=42;\r
     public static final int UnicodeChar=25;\r
     public static final int StringChar=27;\r
@@ -81,12 +81,12 @@ public class SilkSchemaLexer extends Lexer {
     public static final int Name=7;\r
     public static final int Function=16;\r
     public static final int LParen=41;\r
-    public static final int ModuleDef=61;\r
+    public static final int ModuleDef=62;\r
     public static final int String=29;\r
-    public static final int SafeLetter=58;\r
+    public static final int SafeLetter=59;\r
     public static final int LineBreakChar=18;\r
     public static final int IsArray=11;\r
-    public static final int QName=64;\r
+    public static final int QName=65;\r
     public static final int EOF=-1;\r
     public static final int StringChar_s=28;\r
     public static final int UnsafeUnicodeChar=44;\r
@@ -96,7 +96,7 @@ public class SilkSchemaLexer extends Lexer {
     public static final int RBracket=37;\r
     public static final int Parent=8;\r
     public static final int TypeName=12;\r
-    public static final int WhiteSpaces=60;\r
+    public static final int WhiteSpaces=61;\r
 \r
       \r
 \r
@@ -114,27 +114,6 @@ public class SilkSchemaLexer extends Lexer {
     }\r
     public String getGrammarFileName() { return "SilkSchema.g"; }\r
 \r
-    // $ANTLR start "T__65"\r
-    public final void mT__65() throws RecognitionException {\r
-        try {\r
-            int _type = T__65;\r
-            int _channel = DEFAULT_TOKEN_CHANNEL;\r
-            // SilkSchema.g:38:7: ( 'on' )\r
-            // SilkSchema.g:38:9: 'on'\r
-            {\r
-            match("on"); if (state.failed) return ;\r
-\r
-\r
-            }\r
-\r
-            state.type = _type;\r
-            state.channel = _channel;\r
-        }\r
-        finally {\r
-        }\r
-    }\r
-    // $ANTLR end "T__65"\r
-\r
     // $ANTLR start "Preamble"\r
     public final void mPreamble() throws RecognitionException {\r
         try {\r
@@ -674,9 +653,9 @@ public class SilkSchemaLexer extends Lexer {
             // SilkSchema.g:134:9: '\"' s= StringChar_s '\"'\r
             {\r
             match('\"'); if (state.failed) return ;\r
-            int sStart273 = getCharIndex();\r
+            int sStart264 = getCharIndex();\r
             mStringChar_s(); if (state.failed) return ;\r
-            s = new CommonToken(input, Token.INVALID_TOKEN_TYPE, Token.DEFAULT_CHANNEL, sStart273, getCharIndex()-1);\r
+            s = new CommonToken(input, Token.INVALID_TOKEN_TYPE, Token.DEFAULT_CHANNEL, sStart264, getCharIndex()-1);\r
             match('\"'); if (state.failed) return ;\r
             if ( state.backtracking==0 ) {\r
                setText((s!=null?s.getText():null)); \r
@@ -1299,9 +1278,9 @@ public class SilkSchemaLexer extends Lexer {
             // SilkSchema.g:163:9: ( ':' NonWhiteSpaceChar )=> ':' s= SymbolChars\r
             {\r
             match(':'); if (state.failed) return ;\r
-            int sStart588 = getCharIndex();\r
+            int sStart579 = getCharIndex();\r
             mSymbolChars(); if (state.failed) return ;\r
-            s = new CommonToken(input, Token.INVALID_TOKEN_TYPE, Token.DEFAULT_CHANNEL, sStart588, getCharIndex()-1);\r
+            s = new CommonToken(input, Token.INVALID_TOKEN_TYPE, Token.DEFAULT_CHANNEL, sStart579, getCharIndex()-1);\r
             if ( state.backtracking==0 ) {\r
                setText((s!=null?s.getText():null)); \r
             }\r
@@ -1505,10 +1484,31 @@ public class SilkSchemaLexer extends Lexer {
     }\r
     // $ANTLR end "OrderBy"\r
 \r
+    // $ANTLR start "On"\r
+    public final void mOn() throws RecognitionException {\r
+        try {\r
+            int _type = On;\r
+            int _channel = DEFAULT_TOKEN_CHANNEL;\r
+            // SilkSchema.g:174:3: ( 'on' )\r
+            // SilkSchema.g:174:5: 'on'\r
+            {\r
+            match("on"); if (state.failed) return ;\r
+\r
+\r
+            }\r
+\r
+            state.type = _type;\r
+            state.channel = _channel;\r
+        }\r
+        finally {\r
+        }\r
+    }\r
+    // $ANTLR end "On"\r
+\r
     // $ANTLR start "SafeFirstLetter"\r
     public final void mSafeFirstLetter() throws RecognitionException {\r
         try {\r
-            // SilkSchema.g:175:25: ( 'A' .. 'Z' | 'a' .. 'z' )\r
+            // SilkSchema.g:176:25: ( 'A' .. 'Z' | 'a' .. 'z' )\r
             // SilkSchema.g:\r
             {\r
             if ( (input.LA(1)>='A' && input.LA(1)<='Z')||(input.LA(1)>='a' && input.LA(1)<='z') ) {\r
@@ -1533,7 +1533,7 @@ public class SilkSchemaLexer extends Lexer {
     // $ANTLR start "SafeLetter"\r
     public final void mSafeLetter() throws RecognitionException {\r
         try {\r
-            // SilkSchema.g:176:20: ( SafeFirstLetter | '0' .. '9' | '-' | '_' )\r
+            // SilkSchema.g:177:20: ( SafeFirstLetter | '0' .. '9' | '-' | '_' )\r
             // SilkSchema.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
@@ -1558,11 +1558,11 @@ public class SilkSchemaLexer extends Lexer {
     // $ANTLR start "ModuleName"\r
     public final void mModuleName() throws RecognitionException {\r
         try {\r
-            // SilkSchema.g:178:20: ( SafeFirstLetter ( SafeLetter )* ( '.' SafeFirstLetter ( SafeLetter )* )* )\r
-            // SilkSchema.g:178:22: SafeFirstLetter ( SafeLetter )* ( '.' SafeFirstLetter ( SafeLetter )* )*\r
+            // SilkSchema.g:179:20: ( SafeFirstLetter ( SafeLetter )* ( '.' SafeFirstLetter ( SafeLetter )* )* )\r
+            // SilkSchema.g:179:22: SafeFirstLetter ( SafeLetter )* ( '.' SafeFirstLetter ( SafeLetter )* )*\r
             {\r
             mSafeFirstLetter(); if (state.failed) return ;\r
-            // SilkSchema.g:178:38: ( SafeLetter )*\r
+            // SilkSchema.g:179:38: ( SafeLetter )*\r
             loop16:\r
             do {\r
                 int alt16=2;\r
@@ -1575,7 +1575,7 @@ public class SilkSchemaLexer extends Lexer {
 \r
                 switch (alt16) {\r
                case 1 :\r
-                   // SilkSchema.g:178:38: SafeLetter\r
+                   // SilkSchema.g:179:38: SafeLetter\r
                    {\r
                    mSafeLetter(); if (state.failed) return ;\r
 \r
@@ -1587,7 +1587,7 @@ public class SilkSchemaLexer extends Lexer {
                 }\r
             } while (true);\r
 \r
-            // SilkSchema.g:178:50: ( '.' SafeFirstLetter ( SafeLetter )* )*\r
+            // SilkSchema.g:179:50: ( '.' SafeFirstLetter ( SafeLetter )* )*\r
             loop18:\r
             do {\r
                 int alt18=2;\r
@@ -1600,11 +1600,11 @@ public class SilkSchemaLexer extends Lexer {
 \r
                 switch (alt18) {\r
                case 1 :\r
-                   // SilkSchema.g:178:51: '.' SafeFirstLetter ( SafeLetter )*\r
+                   // SilkSchema.g:179:51: '.' SafeFirstLetter ( SafeLetter )*\r
                    {\r
                    match('.'); if (state.failed) return ;\r
                    mSafeFirstLetter(); if (state.failed) return ;\r
-                   // SilkSchema.g:178:71: ( SafeLetter )*\r
+                   // SilkSchema.g:179:71: ( SafeLetter )*\r
                    loop17:\r
                    do {\r
                        int alt17=2;\r
@@ -1617,7 +1617,7 @@ public class SilkSchemaLexer extends Lexer {
 \r
                        switch (alt17) {\r
                        case 1 :\r
-                           // SilkSchema.g:178:71: SafeLetter\r
+                           // SilkSchema.g:179:71: SafeLetter\r
                            {\r
                            mSafeLetter(); if (state.failed) return ;\r
 \r
@@ -1654,15 +1654,15 @@ public class SilkSchemaLexer extends Lexer {
             int _channel = DEFAULT_TOKEN_CHANNEL;\r
             Token s=null;\r
 \r
-            // SilkSchema.g:179:10: ( 'module' WhiteSpaces s= ModuleName )\r
-            // SilkSchema.g:179:12: 'module' WhiteSpaces s= ModuleName\r
+            // SilkSchema.g:180:10: ( 'module' WhiteSpaces s= ModuleName )\r
+            // SilkSchema.g:180:12: 'module' WhiteSpaces s= ModuleName\r
             {\r
             match("module"); if (state.failed) return ;\r
 \r
             mWhiteSpaces(); if (state.failed) return ;\r
-            int sStart738 = getCharIndex();\r
+            int sStart736 = getCharIndex();\r
             mModuleName(); if (state.failed) return ;\r
-            s = new CommonToken(input, Token.INVALID_TOKEN_TYPE, Token.DEFAULT_CHANNEL, sStart738, getCharIndex()-1);\r
+            s = new CommonToken(input, Token.INVALID_TOKEN_TYPE, Token.DEFAULT_CHANNEL, sStart736, getCharIndex()-1);\r
             if ( state.backtracking==0 ) {\r
                setText((s!=null?s.getText():null)); \r
             }\r
@@ -1680,8 +1680,8 @@ public class SilkSchemaLexer extends Lexer {
     // $ANTLR start "QNameChar"\r
     public final void mQNameChar() throws RecognitionException {\r
         try {\r
-            // SilkSchema.g:181:19: (~ ( LineBreakChar | UnsafeUnicodeChar | WhiteSpace ) )\r
-            // SilkSchema.g:181:21: ~ ( LineBreakChar | UnsafeUnicodeChar | WhiteSpace )\r
+            // SilkSchema.g:182:19: (~ ( LineBreakChar | UnsafeUnicodeChar | WhiteSpace ) )\r
+            // SilkSchema.g:182: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
@@ -1707,10 +1707,10 @@ public class SilkSchemaLexer extends Lexer {
         try {\r
             int _type = QName;\r
             int _channel = DEFAULT_TOKEN_CHANNEL;\r
-            // SilkSchema.g:182:6: ( ( QNameChar )+ ( Dot ( QNameChar )+ )* )\r
-            // SilkSchema.g:182:8: ( QNameChar )+ ( Dot ( QNameChar )+ )*\r
+            // SilkSchema.g:183:6: ( ( QNameChar )+ ( Dot ( QNameChar )+ )* )\r
+            // SilkSchema.g:183:8: ( QNameChar )+ ( Dot ( QNameChar )+ )*\r
             {\r
-            // SilkSchema.g:182:8: ( QNameChar )+\r
+            // SilkSchema.g:183:8: ( QNameChar )+\r
             int cnt19=0;\r
             loop19:\r
             do {\r
@@ -1724,7 +1724,7 @@ public class SilkSchemaLexer extends Lexer {
 \r
                 switch (alt19) {\r
                case 1 :\r
-                   // SilkSchema.g:182:8: QNameChar\r
+                   // SilkSchema.g:183:8: QNameChar\r
                    {\r
                    mQNameChar(); if (state.failed) return ;\r
 \r
@@ -1741,7 +1741,7 @@ public class SilkSchemaLexer extends Lexer {
                 cnt19++;\r
             } while (true);\r
 \r
-            // SilkSchema.g:182:19: ( Dot ( QNameChar )+ )*\r
+            // SilkSchema.g:183:19: ( Dot ( QNameChar )+ )*\r
             loop21:\r
             do {\r
                 int alt21=2;\r
@@ -1754,10 +1754,10 @@ public class SilkSchemaLexer extends Lexer {
 \r
                 switch (alt21) {\r
                case 1 :\r
-                   // SilkSchema.g:182:20: Dot ( QNameChar )+\r
+                   // SilkSchema.g:183:20: Dot ( QNameChar )+\r
                    {\r
                    mDot(); if (state.failed) return ;\r
-                   // SilkSchema.g:182:24: ( QNameChar )+\r
+                   // SilkSchema.g:183:24: ( QNameChar )+\r
                    int cnt20=0;\r
                    loop20:\r
                    do {\r
@@ -1771,7 +1771,7 @@ public class SilkSchemaLexer extends Lexer {
 \r
                        switch (alt20) {\r
                        case 1 :\r
-                           // SilkSchema.g:182:24: QNameChar\r
+                           // SilkSchema.g:183:24: QNameChar\r
                            {\r
                            mQNameChar(); if (state.failed) return ;\r
 \r
@@ -1811,7 +1811,7 @@ public class SilkSchemaLexer extends Lexer {
     // $ANTLR start "WhiteSpace"\r
     public final void mWhiteSpace() throws RecognitionException {\r
         try {\r
-            // SilkSchema.g:185:11: ( ' ' | '\\t' )\r
+            // SilkSchema.g:186:11: ( ' ' | '\\t' )\r
             // SilkSchema.g:\r
             {\r
             if ( input.LA(1)=='\t'||input.LA(1)==' ' ) {\r
@@ -1838,10 +1838,10 @@ public class SilkSchemaLexer extends Lexer {
         try {\r
             int _type = WhiteSpaces;\r
             int _channel = DEFAULT_TOKEN_CHANNEL;\r
-            // SilkSchema.g:187:12: ( ( WhiteSpace )+ )\r
-            // SilkSchema.g:187:14: ( WhiteSpace )+\r
+            // SilkSchema.g:188:12: ( ( WhiteSpace )+ )\r
+            // SilkSchema.g:188:14: ( WhiteSpace )+\r
             {\r
-            // SilkSchema.g:187:14: ( WhiteSpace )+\r
+            // SilkSchema.g:188:14: ( WhiteSpace )+\r
             int cnt22=0;\r
             loop22:\r
             do {\r
@@ -1855,7 +1855,7 @@ public class SilkSchemaLexer extends Lexer {
 \r
                 switch (alt22) {\r
                case 1 :\r
-                   // SilkSchema.g:187:14: WhiteSpace\r
+                   // SilkSchema.g:188:14: WhiteSpace\r
                    {\r
                    mWhiteSpace(); if (state.failed) return ;\r
 \r
@@ -1887,215 +1887,215 @@ public class SilkSchemaLexer extends Lexer {
     // $ANTLR end "WhiteSpaces"\r
 \r
     public void mTokens() throws RecognitionException {\r
-        // SilkSchema.g:1:8: ( T__65 | Preamble | LineComment | LineBreak | String | Integer | Double | LBrace | RBrace | LBracket | RBracket | Lt | Dot | Comma | LParen | RParen | Star | Symbol | Class | Includes | End | Relation | Index | BelongsTo | Default | Projection | OrderBy | ModuleDef | QName | WhiteSpaces )\r
+        // SilkSchema.g:1:8: ( Preamble | LineComment | LineBreak | String | Integer | Double | LBrace | RBrace | LBracket | RBracket | Lt | Dot | Comma | LParen | RParen | Star | Symbol | Class | Includes | End | Relation | Index | BelongsTo | Default | Projection | OrderBy | On | ModuleDef | QName | WhiteSpaces )\r
         int alt23=30;\r
         alt23 = dfa23.predict(input);\r
         switch (alt23) {\r
             case 1 :\r
-                // SilkSchema.g:1:10: T__65\r
+                // SilkSchema.g:1:10: Preamble\r
                 {\r
-                mT__65(); if (state.failed) return ;\r
+                mPreamble(); if (state.failed) return ;\r
 \r
                 }\r
                 break;\r
             case 2 :\r
-                // SilkSchema.g:1:16: Preamble\r
+                // SilkSchema.g:1:19: LineComment\r
                 {\r
-                mPreamble(); if (state.failed) return ;\r
+                mLineComment(); if (state.failed) return ;\r
 \r
                 }\r
                 break;\r
             case 3 :\r
-                // SilkSchema.g:1:25: LineComment\r
+                // SilkSchema.g:1:31: LineBreak\r
                 {\r
-                mLineComment(); if (state.failed) return ;\r
+                mLineBreak(); if (state.failed) return ;\r
 \r
                 }\r
                 break;\r
             case 4 :\r
-                // SilkSchema.g:1:37: LineBreak\r
+                // SilkSchema.g:1:41: String\r
                 {\r
-                mLineBreak(); if (state.failed) return ;\r
+                mString(); if (state.failed) return ;\r
 \r
                 }\r
                 break;\r
             case 5 :\r
-                // SilkSchema.g:1:47: String\r
+                // SilkSchema.g:1:48: Integer\r
                 {\r
-                mString(); if (state.failed) return ;\r
+                mInteger(); if (state.failed) return ;\r
 \r
                 }\r
                 break;\r
             case 6 :\r
-                // SilkSchema.g:1:54: Integer\r
+                // SilkSchema.g:1:56: Double\r
                 {\r
-                mInteger(); if (state.failed) return ;\r
+                mDouble(); if (state.failed) return ;\r
 \r
                 }\r
                 break;\r
             case 7 :\r
-                // SilkSchema.g:1:62: Double\r
+                // SilkSchema.g:1:63: LBrace\r
                 {\r
-                mDouble(); if (state.failed) return ;\r
+                mLBrace(); if (state.failed) return ;\r
 \r
                 }\r
                 break;\r
             case 8 :\r
-                // SilkSchema.g:1:69: LBrace\r
+                // SilkSchema.g:1:70: RBrace\r
                 {\r
-                mLBrace(); if (state.failed) return ;\r
+                mRBrace(); if (state.failed) return ;\r
 \r
                 }\r
                 break;\r
             case 9 :\r
-                // SilkSchema.g:1:76: RBrace\r
+                // SilkSchema.g:1:77: LBracket\r
                 {\r
-                mRBrace(); if (state.failed) return ;\r
+                mLBracket(); if (state.failed) return ;\r
 \r
                 }\r
                 break;\r
             case 10 :\r
-                // SilkSchema.g:1:83: LBracket\r
+                // SilkSchema.g:1:86: RBracket\r
                 {\r
-                mLBracket(); if (state.failed) return ;\r
+                mRBracket(); if (state.failed) return ;\r
 \r
                 }\r
                 break;\r
             case 11 :\r
-                // SilkSchema.g:1:92: RBracket\r
+                // SilkSchema.g:1:95: Lt\r
                 {\r
-                mRBracket(); if (state.failed) return ;\r
+                mLt(); if (state.failed) return ;\r
 \r
                 }\r
                 break;\r
             case 12 :\r
-                // SilkSchema.g:1:101: Lt\r
+                // SilkSchema.g:1:98: Dot\r
                 {\r
-                mLt(); if (state.failed) return ;\r
+                mDot(); if (state.failed) return ;\r
 \r
                 }\r
                 break;\r
             case 13 :\r
-                // SilkSchema.g:1:104: Dot\r
+                // SilkSchema.g:1:102: Comma\r
                 {\r
-                mDot(); if (state.failed) return ;\r
+                mComma(); if (state.failed) return ;\r
 \r
                 }\r
                 break;\r
             case 14 :\r
-                // SilkSchema.g:1:108: Comma\r
+                // SilkSchema.g:1:108: LParen\r
                 {\r
-                mComma(); if (state.failed) return ;\r
+                mLParen(); if (state.failed) return ;\r
 \r
                 }\r
                 break;\r
             case 15 :\r
-                // SilkSchema.g:1:114: LParen\r
+                // SilkSchema.g:1:115: RParen\r
                 {\r
-                mLParen(); if (state.failed) return ;\r
+                mRParen(); if (state.failed) return ;\r
 \r
                 }\r
                 break;\r
             case 16 :\r
-                // SilkSchema.g:1:121: RParen\r
+                // SilkSchema.g:1:122: Star\r
                 {\r
-                mRParen(); if (state.failed) return ;\r
+                mStar(); if (state.failed) return ;\r
 \r
                 }\r
                 break;\r
             case 17 :\r
-                // SilkSchema.g:1:128: Star\r
+                // SilkSchema.g:1:127: Symbol\r
                 {\r
-                mStar(); if (state.failed) return ;\r
+                mSymbol(); if (state.failed) return ;\r
 \r
                 }\r
                 break;\r
             case 18 :\r
-                // SilkSchema.g:1:133: Symbol\r
+                // SilkSchema.g:1:134: Class\r
                 {\r
-                mSymbol(); if (state.failed) return ;\r
+                mClass(); if (state.failed) return ;\r
 \r
                 }\r
                 break;\r
             case 19 :\r
-                // SilkSchema.g:1:140: Class\r
+                // SilkSchema.g:1:140: Includes\r
                 {\r
-                mClass(); if (state.failed) return ;\r
+                mIncludes(); if (state.failed) return ;\r
 \r
                 }\r
                 break;\r
             case 20 :\r
-                // SilkSchema.g:1:146: Includes\r
+                // SilkSchema.g:1:149: End\r
                 {\r
-                mIncludes(); if (state.failed) return ;\r
+                mEnd(); if (state.failed) return ;\r
 \r
                 }\r
                 break;\r
             case 21 :\r
-                // SilkSchema.g:1:155: End\r
+                // SilkSchema.g:1:153: Relation\r
                 {\r
-                mEnd(); if (state.failed) return ;\r
+                mRelation(); if (state.failed) return ;\r
 \r
                 }\r
                 break;\r
             case 22 :\r
-                // SilkSchema.g:1:159: Relation\r
+                // SilkSchema.g:1:162: Index\r
                 {\r
-                mRelation(); if (state.failed) return ;\r
+                mIndex(); if (state.failed) return ;\r
 \r
                 }\r
                 break;\r
             case 23 :\r
-                // SilkSchema.g:1:168: Index\r
+                // SilkSchema.g:1:168: BelongsTo\r
                 {\r
-                mIndex(); if (state.failed) return ;\r
+                mBelongsTo(); if (state.failed) return ;\r
 \r
                 }\r
                 break;\r
             case 24 :\r
-                // SilkSchema.g:1:174: BelongsTo\r
+                // SilkSchema.g:1:178: Default\r
                 {\r
-                mBelongsTo(); if (state.failed) return ;\r
+                mDefault(); if (state.failed) return ;\r
 \r
                 }\r
                 break;\r
             case 25 :\r
-                // SilkSchema.g:1:184: Default\r
+                // SilkSchema.g:1:186: Projection\r
                 {\r
-                mDefault(); if (state.failed) return ;\r
+                mProjection(); if (state.failed) return ;\r
 \r
                 }\r
                 break;\r
             case 26 :\r
-                // SilkSchema.g:1:192: Projection\r
+                // SilkSchema.g:1:197: OrderBy\r
                 {\r
-                mProjection(); if (state.failed) return ;\r
+                mOrderBy(); if (state.failed) return ;\r
 \r
                 }\r
                 break;\r
             case 27 :\r
-                // SilkSchema.g:1:203: OrderBy\r
+                // SilkSchema.g:1:205: On\r
                 {\r
-                mOrderBy(); if (state.failed) return ;\r
+                mOn(); if (state.failed) return ;\r
 \r
                 }\r
                 break;\r
             case 28 :\r
-                // SilkSchema.g:1:211: ModuleDef\r
+                // SilkSchema.g:1:208: ModuleDef\r
                 {\r
                 mModuleDef(); if (state.failed) return ;\r
 \r
                 }\r
                 break;\r
             case 29 :\r
-                // SilkSchema.g:1:221: QName\r
+                // SilkSchema.g:1:218: QName\r
                 {\r
                 mQName(); if (state.failed) return ;\r
 \r
                 }\r
                 break;\r
             case 30 :\r
-                // SilkSchema.g:1:227: WhiteSpaces\r
+                // SilkSchema.g:1:224: WhiteSpaces\r
                 {\r
                 mWhiteSpaces(); if (state.failed) return ;\r
 \r
@@ -2109,62 +2109,63 @@ public class SilkSchemaLexer extends Lexer {
 \r
     protected DFA23 dfa23 = new DFA23(this);\r
     static final String DFA23_eotS =\r
-        "\1\uffff\1\34\5\uffff\2\42\13\uffff\10\34\2\uffff\1\56\1\34\2\42"+\r
-        "\2\uffff\1\34\1\42\10\34\1\uffff\1\34\1\uffff\1\42\1\60\1\34\1\60"+\r
-        "\3\34\1\103\12\34\1\uffff\7\34\1\60\1\125\1\34\1\127\6\34\1\uffff"+\r
-        "\1\34\1\uffff\11\34\1\150\1\34\1\uffff\1\152\1\153\1\154\1\34\1"+\r
-        "\uffff\1\34\3\uffff\2\34\1\161\1\162\2\uffff";\r
+        "\6\uffff\2\40\13\uffff\11\34\2\uffff\2\40\2\uffff\1\34\1\40\10"+\r
+        "\34\1\74\1\34\1\uffff\1\40\1\56\1\34\1\56\3\34\1\102\5\34\1\uffff"+\r
+        "\5\34\1\uffff\7\34\1\56\1\124\1\34\1\126\6\34\1\uffff\1\34\1\uffff"+\r
+        "\11\34\1\147\2\34\1\uffff\1\152\1\153\1\34\1\uffff\1\34\1\156\2"+\r
+        "\uffff\2\34\1\uffff\1\161\1\162\2\uffff";\r
     static final String DFA23_eofS =\r
         "\163\uffff";\r
     static final String DFA23_minS =\r
-        "\1\0\1\156\4\uffff\1\60\2\0\13\uffff\1\154\2\156\3\145\1\162\1"+\r
-        "\157\2\uffff\1\0\1\144\2\56\1\uffff\1\0\1\53\1\0\1\141\1\143\1\144"+\r
-        "\2\154\1\146\1\157\1\144\1\uffff\1\145\1\uffff\1\56\1\0\1\60\1\0"+\r
-        "\1\163\1\154\1\145\1\0\1\141\1\157\1\141\1\152\1\165\1\162\1\53"+\r
-        "\1\163\1\165\1\170\1\uffff\1\164\1\156\1\165\1\145\1\154\1\137\1"+\r
-        "\60\2\0\1\144\1\0\1\151\1\147\1\154\1\143\1\145\1\142\1\uffff\1"+\r
-        "\145\1\uffff\1\157\1\163\2\164\1\11\1\171\1\163\1\156\1\137\1\0"+\r
-        "\1\151\1\uffff\3\0\1\164\1\uffff\1\157\3\uffff\1\157\1\156\2\0\2"+\r
-        "\uffff";\r
+        "\1\0\4\uffff\1\60\2\0\13\uffff\1\154\2\156\3\145\1\162\1\156\1"+\r
+        "\157\2\uffff\2\56\1\uffff\1\0\1\53\1\0\1\141\1\143\1\144\2\154\1"+\r
+        "\146\1\157\1\144\1\0\1\144\1\uffff\1\56\1\0\1\60\1\0\1\163\1\154"+\r
+        "\1\145\1\0\1\141\1\157\1\141\1\152\1\145\1\uffff\1\165\1\53\1\163"+\r
+        "\1\165\1\170\1\uffff\1\164\1\156\1\165\1\145\1\162\1\154\1\60\2"+\r
+        "\0\1\144\1\0\1\151\1\147\1\154\1\143\1\137\1\145\1\uffff\1\145\1"+\r
+        "\uffff\1\157\1\163\2\164\1\142\1\11\1\163\1\156\1\137\1\0\1\151"+\r
+        "\1\171\1\uffff\2\0\1\164\1\uffff\1\157\1\0\2\uffff\1\157\1\156\1"+\r
+        "\uffff\2\0\2\uffff";\r
     static final String DFA23_maxS =\r
-        "\1\uffff\1\162\4\uffff\1\71\2\uffff\13\uffff\1\154\2\156\3\145"+\r
-        "\1\162\1\157\2\uffff\1\uffff\1\144\2\145\1\uffff\1\uffff\1\71\1"+\r
-        "\uffff\1\141\2\144\2\154\1\146\1\157\1\144\1\uffff\1\145\1\uffff"+\r
-        "\1\145\1\uffff\1\71\1\uffff\1\163\1\154\1\145\1\uffff\1\141\1\157"+\r
-        "\1\141\1\152\1\165\1\162\1\71\1\163\1\165\1\170\1\uffff\1\164\1"+\r
-        "\156\1\165\1\145\1\154\1\137\1\71\2\uffff\1\144\1\uffff\1\151\1"+\r
-        "\147\1\154\1\143\1\145\1\142\1\uffff\1\145\1\uffff\1\157\1\163\2"+\r
-        "\164\1\40\1\171\1\163\1\156\1\137\1\uffff\1\151\1\uffff\3\uffff"+\r
-        "\1\164\1\uffff\1\157\3\uffff\1\157\1\156\2\uffff\2\uffff";\r
+        "\1\uffff\4\uffff\1\71\2\uffff\13\uffff\1\154\2\156\3\145\2\162"+\r
+        "\1\157\2\uffff\2\145\1\uffff\1\uffff\1\71\1\uffff\1\141\2\144\2"+\r
+        "\154\1\146\1\157\1\144\1\uffff\1\144\1\uffff\1\145\1\uffff\1\71"+\r
+        "\1\uffff\1\163\1\154\1\145\1\uffff\1\141\1\157\1\141\1\152\1\145"+\r
+        "\1\uffff\1\165\1\71\1\163\1\165\1\170\1\uffff\1\164\1\156\1\165"+\r
+        "\1\145\1\162\1\154\1\71\2\uffff\1\144\1\uffff\1\151\1\147\1\154"+\r
+        "\1\143\1\137\1\145\1\uffff\1\145\1\uffff\1\157\1\163\2\164\1\142"+\r
+        "\1\40\1\163\1\156\1\137\1\uffff\1\151\1\171\1\uffff\2\uffff\1\164"+\r
+        "\1\uffff\1\157\1\uffff\2\uffff\1\157\1\156\1\uffff\2\uffff\2\uffff";\r
     static final String DFA23_acceptS =\r
-        "\2\uffff\1\2\1\3\1\4\1\5\3\uffff\1\10\1\11\1\12\1\13\1\14\1\15"+\r
-        "\1\16\1\17\1\20\1\21\1\22\10\uffff\1\35\1\36\4\uffff\1\6\13\uffff"+\r
-        "\1\1\1\uffff\1\7\22\uffff\1\25\21\uffff\1\23\1\uffff\1\27\13\uffff"+\r
-        "\1\34\4\uffff\1\31\1\uffff\1\33\1\24\1\26\4\uffff\1\30\1\32";\r
+        "\1\uffff\1\1\1\2\1\3\1\4\3\uffff\1\7\1\10\1\11\1\12\1\13\1\14\1"+\r
+        "\15\1\16\1\17\1\20\1\21\11\uffff\1\35\1\36\2\uffff\1\5\15\uffff"+\r
+        "\1\6\15\uffff\1\33\5\uffff\1\24\21\uffff\1\22\1\uffff\1\26\14\uffff"+\r
+        "\1\34\3\uffff\1\30\2\uffff\1\23\1\25\2\uffff\1\32\2\uffff\1\27\1"+\r
+        "\31";\r
     static final String DFA23_specialS =\r
-        "\1\20\6\uffff\1\12\1\2\25\uffff\1\3\4\uffff\1\13\1\uffff\1\14\14"+\r
-        "\uffff\1\11\1\uffff\1\1\3\uffff\1\21\22\uffff\1\16\1\17\1\uffff"+\r
-        "\1\10\22\uffff\1\6\2\uffff\1\4\1\5\1\0\10\uffff\1\7\1\15\2\uffff}>";\r
+        "\1\10\5\uffff\1\1\1\17\31\uffff\1\20\1\uffff\1\16\10\uffff\1\11"+\r
+        "\3\uffff\1\15\1\uffff\1\4\3\uffff\1\12\23\uffff\1\5\1\7\1\uffff"+\r
+        "\1\13\22\uffff\1\0\3\uffff\1\3\1\2\3\uffff\1\14\5\uffff\1\6\1\21"+\r
+        "\2\uffff}>";\r
     static final String[] DFA23_transitionS = {\r
-            "\11\34\1\35\1\4\2\34\1\4\22\34\1\35\1\34\1\5\1\3\1\34\1\2\1"+\r
-            "\34\1\uffff\1\20\1\21\1\22\1\34\1\17\1\6\1\16\1\34\1\7\11\10"+\r
-            "\1\23\1\34\1\15\1\34\1\uffff\1\34\1\uffff\32\34\1\13\1\uffff"+\r
-            "\1\14\4\34\1\30\1\24\1\31\1\26\3\34\1\25\3\34\1\33\1\34\1\1"+\r
-            "\1\32\1\34\1\27\10\34\1\11\1\uffff\1\12\uff82\34",\r
-            "\1\36\3\uffff\1\37",\r
+            "\11\34\1\35\1\3\2\34\1\3\22\34\1\35\1\34\1\4\1\2\1\34\1\1\1"+\r
+            "\34\1\uffff\1\17\1\20\1\21\1\34\1\16\1\5\1\15\1\34\1\6\11\7"+\r
+            "\1\22\1\34\1\14\1\34\1\uffff\1\34\1\uffff\32\34\1\12\1\uffff"+\r
+            "\1\13\4\34\1\27\1\23\1\30\1\25\3\34\1\24\3\34\1\33\1\34\1\32"+\r
+            "\1\31\1\34\1\26\10\34\1\10\1\uffff\1\11\uff82\34",\r
             "",\r
             "",\r
             "",\r
             "",\r
-            "\1\40\11\41",\r
+            "\1\36\11\37",\r
             "\11\34\2\uffff\2\34\1\uffff\22\34\1\uffff\1\34\2\uffff\1\34"+\r
-            "\1\uffff\1\34\4\uffff\1\34\2\uffff\1\43\13\34\1\uffff\1\34\1"+\r
-            "\uffff\1\34\1\uffff\1\34\1\uffff\4\34\1\44\25\34\3\uffff\7\34"+\r
-            "\1\44\25\34\3\uffff\uff82\34",\r
+            "\1\uffff\1\34\4\uffff\1\34\2\uffff\1\41\13\34\1\uffff\1\34\1"+\r
+            "\uffff\1\34\1\uffff\1\34\1\uffff\4\34\1\42\25\34\3\uffff\7\34"+\r
+            "\1\42\25\34\3\uffff\uff82\34",\r
             "\11\34\2\uffff\2\34\1\uffff\22\34\1\uffff\1\34\2\uffff\1\34"+\r
-            "\1\uffff\1\34\4\uffff\1\34\2\uffff\1\43\1\34\12\45\1\uffff\1"+\r
-            "\34\1\uffff\1\34\1\uffff\1\34\1\uffff\4\34\1\44\25\34\3\uffff"+\r
-            "\7\34\1\44\25\34\3\uffff\uff82\34",\r
+            "\1\uffff\1\34\4\uffff\1\34\2\uffff\1\41\1\34\12\43\1\uffff\1"+\r
+            "\34\1\uffff\1\34\1\uffff\1\34\1\uffff\4\34\1\42\25\34\3\uffff"+\r
+            "\7\34\1\42\25\34\3\uffff\uff82\34",\r
             "",\r
             "",\r
             "",\r
@@ -2176,101 +2177,102 @@ public class SilkSchemaLexer extends Lexer {
             "",\r
             "",\r
             "",\r
+            "\1\44",\r
+            "\1\45",\r
             "\1\46",\r
             "\1\47",\r
             "\1\50",\r
             "\1\51",\r
             "\1\52",\r
-            "\1\53",\r
-            "\1\54",\r
+            "\1\54\3\uffff\1\53",\r
             "\1\55",\r
             "",\r
             "",\r
-            "\11\34\2\uffff\2\34\1\uffff\22\34\1\uffff\1\34\2\uffff\1\34"+\r
-            "\1\uffff\1\34\4\uffff\1\34\2\uffff\14\34\1\uffff\1\34\1\uffff"+\r
-            "\1\34\1\uffff\1\34\1\uffff\32\34\3\uffff\35\34\3\uffff\uff82"+\r
-            "\34",\r
-            "\1\57",\r
-            "\1\60\26\uffff\1\60\37\uffff\1\60",\r
-            "\1\60\1\uffff\12\61\13\uffff\1\60\37\uffff\1\60",\r
+            "\1\56\26\uffff\1\56\37\uffff\1\56",\r
+            "\1\56\1\uffff\12\57\13\uffff\1\56\37\uffff\1\56",\r
             "",\r
             "\11\34\2\uffff\2\34\1\uffff\22\34\1\uffff\1\34\2\uffff\1\34"+\r
-            "\1\uffff\1\34\4\uffff\1\34\3\uffff\1\34\12\62\1\uffff\1\34\1"+\r
+            "\1\uffff\1\34\4\uffff\1\34\3\uffff\1\34\12\60\1\uffff\1\34\1"+\r
             "\uffff\1\34\1\uffff\1\34\1\uffff\32\34\3\uffff\35\34\3\uffff"+\r
             "\uff82\34",\r
-            "\1\63\1\uffff\1\60\2\uffff\12\64",\r
+            "\1\61\1\uffff\1\56\2\uffff\12\62",\r
             "\11\34\2\uffff\2\34\1\uffff\22\34\1\uffff\1\34\2\uffff\1\34"+\r
-            "\1\uffff\1\34\4\uffff\1\34\2\uffff\1\43\1\34\12\45\1\uffff\1"+\r
-            "\34\1\uffff\1\34\1\uffff\1\34\1\uffff\4\34\1\44\25\34\3\uffff"+\r
-            "\7\34\1\44\25\34\3\uffff\uff82\34",\r
-            "\1\65",\r
-            "\1\66\1\67",\r
+            "\1\uffff\1\34\4\uffff\1\34\2\uffff\1\41\1\34\12\43\1\uffff\1"+\r
+            "\34\1\uffff\1\34\1\uffff\1\34\1\uffff\4\34\1\42\25\34\3\uffff"+\r
+            "\7\34\1\42\25\34\3\uffff\uff82\34",\r
+            "\1\63",\r
+            "\1\64\1\65",\r
+            "\1\66",\r
+            "\1\67",\r
             "\1\70",\r
             "\1\71",\r
             "\1\72",\r
             "\1\73",\r
-            "\1\74",\r
+            "\11\34\2\uffff\2\34\1\uffff\22\34\1\uffff\1\34\2\uffff\1\34"+\r
+            "\1\uffff\1\34\4\uffff\1\34\2\uffff\14\34\1\uffff\1\34\1\uffff"+\r
+            "\1\34\1\uffff\1\34\1\uffff\32\34\3\uffff\35\34\3\uffff\uff82"+\r
+            "\34",\r
             "\1\75",\r
             "",\r
-            "\1\76",\r
-            "",\r
-            "\1\60\1\uffff\12\61\13\uffff\1\60\37\uffff\1\60",\r
+            "\1\56\1\uffff\12\57\13\uffff\1\56\37\uffff\1\56",\r
             "\11\34\2\uffff\2\34\1\uffff\22\34\1\uffff\1\34\2\uffff\1\34"+\r
-            "\1\uffff\1\34\4\uffff\1\34\2\uffff\2\34\12\62\1\uffff\1\34\1"+\r
-            "\uffff\1\34\1\uffff\1\34\1\uffff\4\34\1\77\25\34\3\uffff\7\34"+\r
-            "\1\77\25\34\3\uffff\uff82\34",\r
-            "\12\64",\r
+            "\1\uffff\1\34\4\uffff\1\34\2\uffff\2\34\12\60\1\uffff\1\34\1"+\r
+            "\uffff\1\34\1\uffff\1\34\1\uffff\4\34\1\76\25\34\3\uffff\7\34"+\r
+            "\1\76\25\34\3\uffff\uff82\34",\r
+            "\12\62",\r
             "\11\34\2\uffff\2\34\1\uffff\22\34\1\uffff\1\34\2\uffff\1\34"+\r
-            "\1\uffff\1\34\4\uffff\1\34\2\uffff\2\34\12\64\1\uffff\1\34\1"+\r
+            "\1\uffff\1\34\4\uffff\1\34\2\uffff\2\34\12\62\1\uffff\1\34\1"+\r
             "\uffff\1\34\1\uffff\1\34\1\uffff\32\34\3\uffff\35\34\3\uffff"+\r
             "\uff82\34",\r
+            "\1\77",\r
             "\1\100",\r
             "\1\101",\r
-            "\1\102",\r
             "\11\34\2\uffff\2\34\1\uffff\22\34\1\uffff\1\34\2\uffff\1\34"+\r
             "\1\uffff\1\34\4\uffff\1\34\2\uffff\14\34\1\uffff\1\34\1\uffff"+\r
             "\1\34\1\uffff\1\34\1\uffff\32\34\3\uffff\35\34\3\uffff\uff82"+\r
             "\34",\r
+            "\1\103",\r
             "\1\104",\r
             "\1\105",\r
             "\1\106",\r
             "\1\107",\r
+            "",\r
             "\1\110",\r
-            "\1\111",\r
-            "\1\112\1\uffff\1\60\2\uffff\12\113",\r
+            "\1\111\1\uffff\1\56\2\uffff\12\112",\r
+            "\1\113",\r
             "\1\114",\r
             "\1\115",\r
-            "\1\116",\r
             "",\r
+            "\1\116",\r
             "\1\117",\r
             "\1\120",\r
             "\1\121",\r
             "\1\122",\r
             "\1\123",\r
-            "\1\124",\r
-            "\12\113",\r
+            "\12\112",\r
             "\11\34\2\uffff\2\34\1\uffff\22\34\1\uffff\1\34\2\uffff\1\34"+\r
-            "\1\uffff\1\34\4\uffff\1\34\2\uffff\2\34\12\113\1\uffff\1\34"+\r
+            "\1\uffff\1\34\4\uffff\1\34\2\uffff\2\34\12\112\1\uffff\1\34"+\r
             "\1\uffff\1\34\1\uffff\1\34\1\uffff\32\34\3\uffff\35\34\3\uffff"+\r
             "\uff82\34",\r
             "\11\34\2\uffff\2\34\1\uffff\22\34\1\uffff\1\34\2\uffff\1\34"+\r
             "\1\uffff\1\34\4\uffff\1\34\2\uffff\14\34\1\uffff\1\34\1\uffff"+\r
             "\1\34\1\uffff\1\34\1\uffff\32\34\3\uffff\35\34\3\uffff\uff82"+\r
             "\34",\r
-            "\1\126",\r
+            "\1\125",\r
             "\11\34\2\uffff\2\34\1\uffff\22\34\1\uffff\1\34\2\uffff\1\34"+\r
             "\1\uffff\1\34\4\uffff\1\34\2\uffff\14\34\1\uffff\1\34\1\uffff"+\r
             "\1\34\1\uffff\1\34\1\uffff\32\34\3\uffff\35\34\3\uffff\uff82"+\r
             "\34",\r
+            "\1\127",\r
             "\1\130",\r
             "\1\131",\r
             "\1\132",\r
             "\1\133",\r
             "\1\134",\r
+            "",\r
             "\1\135",\r
             "",\r
             "\1\136",\r
-            "",\r
             "\1\137",\r
             "\1\140",\r
             "\1\141",\r
@@ -2279,11 +2281,11 @@ public class SilkSchemaLexer extends Lexer {
             "\1\144",\r
             "\1\145",\r
             "\1\146",\r
-            "\1\147",\r
             "\11\34\2\uffff\2\34\1\uffff\22\34\1\uffff\1\34\2\uffff\1\34"+\r
             "\1\uffff\1\34\4\uffff\1\34\2\uffff\14\34\1\uffff\1\34\1\uffff"+\r
             "\1\34\1\uffff\1\34\1\uffff\32\34\3\uffff\35\34\3\uffff\uff82"+\r
             "\34",\r
+            "\1\150",\r
             "\1\151",\r
             "",\r
             "\11\34\2\uffff\2\34\1\uffff\22\34\1\uffff\1\34\2\uffff\1\34"+\r
@@ -2294,18 +2296,18 @@ public class SilkSchemaLexer extends Lexer {
             "\1\uffff\1\34\4\uffff\1\34\2\uffff\14\34\1\uffff\1\34\1\uffff"+\r
             "\1\34\1\uffff\1\34\1\uffff\32\34\3\uffff\35\34\3\uffff\uff82"+\r
             "\34",\r
+            "\1\154",\r
+            "",\r
+            "\1\155",\r
             "\11\34\2\uffff\2\34\1\uffff\22\34\1\uffff\1\34\2\uffff\1\34"+\r
             "\1\uffff\1\34\4\uffff\1\34\2\uffff\14\34\1\uffff\1\34\1\uffff"+\r
             "\1\34\1\uffff\1\34\1\uffff\32\34\3\uffff\35\34\3\uffff\uff82"+\r
             "\34",\r
-            "\1\155",\r
-            "",\r
-            "\1\156",\r
-            "",\r
             "",\r
             "",\r
             "\1\157",\r
             "\1\160",\r
+            "",\r
             "\11\34\2\uffff\2\34\1\uffff\22\34\1\uffff\1\34\2\uffff\1\34"+\r
             "\1\uffff\1\34\4\uffff\1\34\2\uffff\14\34\1\uffff\1\34\1\uffff"+\r
             "\1\34\1\uffff\1\34\1\uffff\32\34\3\uffff\35\34\3\uffff\uff82"+\r
@@ -2348,272 +2350,272 @@ public class SilkSchemaLexer extends Lexer {
             this.transition = DFA23_transition;\r
         }\r
         public String getDescription() {\r
-            return "1:1: Tokens : ( T__65 | Preamble | LineComment | LineBreak | String | Integer | Double | LBrace | RBrace | LBracket | RBracket | Lt | Dot | Comma | LParen | RParen | Star | Symbol | Class | Includes | End | Relation | Index | BelongsTo | Default | Projection | OrderBy | ModuleDef | QName | WhiteSpaces );";\r
+            return "1:1: Tokens : ( Preamble | LineComment | LineBreak | String | Integer | Double | LBrace | RBrace | LBracket | RBracket | Lt | Dot | Comma | LParen | RParen | Star | Symbol | Class | Includes | End | Relation | Index | BelongsTo | Default | Projection | OrderBy | On | ModuleDef | QName | WhiteSpaces );";\r
         }\r
         public int specialStateTransition(int s, IntStream _input) throws NoViableAltException {\r
             IntStream input = _input;\r
                int _s = s;\r
             switch ( s ) {\r
                     case 0 : \r
-                        int LA23_102 = input.LA(1);\r
+                        int LA23_96 = input.LA(1);\r
 \r
                         s = -1;\r
-                        if ( ((LA23_102>='\u0000' && LA23_102<='\b')||(LA23_102>='\u000B' && LA23_102<='\f')||(LA23_102>='\u000E' && LA23_102<='\u001F')||LA23_102=='!'||LA23_102=='$'||LA23_102=='&'||LA23_102=='+'||(LA23_102>='.' && LA23_102<='9')||LA23_102==';'||LA23_102=='='||LA23_102=='?'||(LA23_102>='A' && LA23_102<='Z')||(LA23_102>='^' && LA23_102<='z')||(LA23_102>='~' && LA23_102<='\uFFFF')) ) {s = 28;}\r
+                        if ( ((LA23_96>='\u0000' && LA23_96<='\b')||(LA23_96>='\u000B' && LA23_96<='\f')||(LA23_96>='\u000E' && LA23_96<='\u001F')||LA23_96=='!'||LA23_96=='$'||LA23_96=='&'||LA23_96=='+'||(LA23_96>='.' && LA23_96<='9')||LA23_96==';'||LA23_96=='='||LA23_96=='?'||(LA23_96>='A' && LA23_96<='Z')||(LA23_96>='^' && LA23_96<='z')||(LA23_96>='~' && LA23_96<='\uFFFF')) ) {s = 28;}\r
 \r
-                        else s = 108;\r
+                        else s = 103;\r
 \r
                         if ( s>=0 ) return s;\r
                         break;\r
                     case 1 : \r
-                        int LA23_52 = input.LA(1);\r
+                        int LA23_6 = input.LA(1);\r
 \r
                         s = -1;\r
-                        if ( ((LA23_52>='0' && LA23_52<='9')) ) {s = 52;}\r
+                        if ( (LA23_6=='.') ) {s = 33;}\r
+\r
+                        else if ( (LA23_6=='E'||LA23_6=='e') ) {s = 34;}\r
 \r
-                        else if ( ((LA23_52>='\u0000' && LA23_52<='\b')||(LA23_52>='\u000B' && LA23_52<='\f')||(LA23_52>='\u000E' && LA23_52<='\u001F')||LA23_52=='!'||LA23_52=='$'||LA23_52=='&'||LA23_52=='+'||(LA23_52>='.' && LA23_52<='/')||LA23_52==';'||LA23_52=='='||LA23_52=='?'||(LA23_52>='A' && LA23_52<='Z')||(LA23_52>='^' && LA23_52<='z')||(LA23_52>='~' && LA23_52<='\uFFFF')) ) {s = 28;}\r
+                        else if ( ((LA23_6>='\u0000' && LA23_6<='\b')||(LA23_6>='\u000B' && LA23_6<='\f')||(LA23_6>='\u000E' && LA23_6<='\u001F')||LA23_6=='!'||LA23_6=='$'||LA23_6=='&'||LA23_6=='+'||(LA23_6>='/' && LA23_6<='9')||LA23_6==';'||LA23_6=='='||LA23_6=='?'||(LA23_6>='A' && LA23_6<='D')||(LA23_6>='F' && LA23_6<='Z')||(LA23_6>='^' && LA23_6<='d')||(LA23_6>='f' && LA23_6<='z')||(LA23_6>='~' && LA23_6<='\uFFFF')) ) {s = 28;}\r
 \r
-                        else s = 48;\r
+                        else s = 32;\r
 \r
                         if ( s>=0 ) return s;\r
                         break;\r
                     case 2 : \r
-                        int LA23_8 = input.LA(1);\r
+                        int LA23_101 = input.LA(1);\r
 \r
                         s = -1;\r
-                        if ( ((LA23_8>='0' && LA23_8<='9')) ) {s = 37;}\r
-\r
-                        else if ( (LA23_8=='.') ) {s = 35;}\r
-\r
-                        else if ( (LA23_8=='E'||LA23_8=='e') ) {s = 36;}\r
-\r
-                        else if ( ((LA23_8>='\u0000' && LA23_8<='\b')||(LA23_8>='\u000B' && LA23_8<='\f')||(LA23_8>='\u000E' && LA23_8<='\u001F')||LA23_8=='!'||LA23_8=='$'||LA23_8=='&'||LA23_8=='+'||LA23_8=='/'||LA23_8==';'||LA23_8=='='||LA23_8=='?'||(LA23_8>='A' && LA23_8<='D')||(LA23_8>='F' && LA23_8<='Z')||(LA23_8>='^' && LA23_8<='d')||(LA23_8>='f' && LA23_8<='z')||(LA23_8>='~' && LA23_8<='\uFFFF')) ) {s = 28;}\r
+                        if ( ((LA23_101>='\u0000' && LA23_101<='\b')||(LA23_101>='\u000B' && LA23_101<='\f')||(LA23_101>='\u000E' && LA23_101<='\u001F')||LA23_101=='!'||LA23_101=='$'||LA23_101=='&'||LA23_101=='+'||(LA23_101>='.' && LA23_101<='9')||LA23_101==';'||LA23_101=='='||LA23_101=='?'||(LA23_101>='A' && LA23_101<='Z')||(LA23_101>='^' && LA23_101<='z')||(LA23_101>='~' && LA23_101<='\uFFFF')) ) {s = 28;}\r
 \r
-                        else s = 34;\r
+                        else s = 107;\r
 \r
                         if ( s>=0 ) return s;\r
                         break;\r
                     case 3 : \r
-                        int LA23_30 = input.LA(1);\r
+                        int LA23_100 = input.LA(1);\r
 \r
                         s = -1;\r
-                        if ( ((LA23_30>='\u0000' && LA23_30<='\b')||(LA23_30>='\u000B' && LA23_30<='\f')||(LA23_30>='\u000E' && LA23_30<='\u001F')||LA23_30=='!'||LA23_30=='$'||LA23_30=='&'||LA23_30=='+'||(LA23_30>='.' && LA23_30<='9')||LA23_30==';'||LA23_30=='='||LA23_30=='?'||(LA23_30>='A' && LA23_30<='Z')||(LA23_30>='^' && LA23_30<='z')||(LA23_30>='~' && LA23_30<='\uFFFF')) ) {s = 28;}\r
+                        if ( ((LA23_100>='\u0000' && LA23_100<='\b')||(LA23_100>='\u000B' && LA23_100<='\f')||(LA23_100>='\u000E' && LA23_100<='\u001F')||LA23_100=='!'||LA23_100=='$'||LA23_100=='&'||LA23_100=='+'||(LA23_100>='.' && LA23_100<='9')||LA23_100==';'||LA23_100=='='||LA23_100=='?'||(LA23_100>='A' && LA23_100<='Z')||(LA23_100>='^' && LA23_100<='z')||(LA23_100>='~' && LA23_100<='\uFFFF')) ) {s = 28;}\r
 \r
-                        else s = 46;\r
+                        else s = 106;\r
 \r
                         if ( s>=0 ) return s;\r
                         break;\r
                     case 4 : \r
-                        int LA23_100 = input.LA(1);\r
+                        int LA23_50 = input.LA(1);\r
 \r
                         s = -1;\r
-                        if ( ((LA23_100>='\u0000' && LA23_100<='\b')||(LA23_100>='\u000B' && LA23_100<='\f')||(LA23_100>='\u000E' && LA23_100<='\u001F')||LA23_100=='!'||LA23_100=='$'||LA23_100=='&'||LA23_100=='+'||(LA23_100>='.' && LA23_100<='9')||LA23_100==';'||LA23_100=='='||LA23_100=='?'||(LA23_100>='A' && LA23_100<='Z')||(LA23_100>='^' && LA23_100<='z')||(LA23_100>='~' && LA23_100<='\uFFFF')) ) {s = 28;}\r
+                        if ( ((LA23_50>='0' && LA23_50<='9')) ) {s = 50;}\r
 \r
-                        else s = 106;\r
+                        else if ( ((LA23_50>='\u0000' && LA23_50<='\b')||(LA23_50>='\u000B' && LA23_50<='\f')||(LA23_50>='\u000E' && LA23_50<='\u001F')||LA23_50=='!'||LA23_50=='$'||LA23_50=='&'||LA23_50=='+'||(LA23_50>='.' && LA23_50<='/')||LA23_50==';'||LA23_50=='='||LA23_50=='?'||(LA23_50>='A' && LA23_50<='Z')||(LA23_50>='^' && LA23_50<='z')||(LA23_50>='~' && LA23_50<='\uFFFF')) ) {s = 28;}\r
+\r
+                        else s = 46;\r
 \r
                         if ( s>=0 ) return s;\r
                         break;\r
                     case 5 : \r
-                        int LA23_101 = input.LA(1);\r
+                        int LA23_74 = input.LA(1);\r
 \r
                         s = -1;\r
-                        if ( ((LA23_101>='\u0000' && LA23_101<='\b')||(LA23_101>='\u000B' && LA23_101<='\f')||(LA23_101>='\u000E' && LA23_101<='\u001F')||LA23_101=='!'||LA23_101=='$'||LA23_101=='&'||LA23_101=='+'||(LA23_101>='.' && LA23_101<='9')||LA23_101==';'||LA23_101=='='||LA23_101=='?'||(LA23_101>='A' && LA23_101<='Z')||(LA23_101>='^' && LA23_101<='z')||(LA23_101>='~' && LA23_101<='\uFFFF')) ) {s = 28;}\r
+                        if ( ((LA23_74>='\u0000' && LA23_74<='\b')||(LA23_74>='\u000B' && LA23_74<='\f')||(LA23_74>='\u000E' && LA23_74<='\u001F')||LA23_74=='!'||LA23_74=='$'||LA23_74=='&'||LA23_74=='+'||(LA23_74>='.' && LA23_74<='/')||LA23_74==';'||LA23_74=='='||LA23_74=='?'||(LA23_74>='A' && LA23_74<='Z')||(LA23_74>='^' && LA23_74<='z')||(LA23_74>='~' && LA23_74<='\uFFFF')) ) {s = 28;}\r
 \r
-                        else s = 107;\r
+                        else if ( ((LA23_74>='0' && LA23_74<='9')) ) {s = 74;}\r
+\r
+                        else s = 46;\r
 \r
                         if ( s>=0 ) return s;\r
                         break;\r
                     case 6 : \r
-                        int LA23_97 = input.LA(1);\r
+                        int LA23_111 = input.LA(1);\r
 \r
                         s = -1;\r
-                        if ( ((LA23_97>='\u0000' && LA23_97<='\b')||(LA23_97>='\u000B' && LA23_97<='\f')||(LA23_97>='\u000E' && LA23_97<='\u001F')||LA23_97=='!'||LA23_97=='$'||LA23_97=='&'||LA23_97=='+'||(LA23_97>='.' && LA23_97<='9')||LA23_97==';'||LA23_97=='='||LA23_97=='?'||(LA23_97>='A' && LA23_97<='Z')||(LA23_97>='^' && LA23_97<='z')||(LA23_97>='~' && LA23_97<='\uFFFF')) ) {s = 28;}\r
+                        if ( ((LA23_111>='\u0000' && LA23_111<='\b')||(LA23_111>='\u000B' && LA23_111<='\f')||(LA23_111>='\u000E' && LA23_111<='\u001F')||LA23_111=='!'||LA23_111=='$'||LA23_111=='&'||LA23_111=='+'||(LA23_111>='.' && LA23_111<='9')||LA23_111==';'||LA23_111=='='||LA23_111=='?'||(LA23_111>='A' && LA23_111<='Z')||(LA23_111>='^' && LA23_111<='z')||(LA23_111>='~' && LA23_111<='\uFFFF')) ) {s = 28;}\r
 \r
-                        else s = 104;\r
+                        else s = 113;\r
 \r
                         if ( s>=0 ) return s;\r
                         break;\r
                     case 7 : \r
-                        int LA23_111 = input.LA(1);\r
+                        int LA23_75 = input.LA(1);\r
 \r
                         s = -1;\r
-                        if ( ((LA23_111>='\u0000' && LA23_111<='\b')||(LA23_111>='\u000B' && LA23_111<='\f')||(LA23_111>='\u000E' && LA23_111<='\u001F')||LA23_111=='!'||LA23_111=='$'||LA23_111=='&'||LA23_111=='+'||(LA23_111>='.' && LA23_111<='9')||LA23_111==';'||LA23_111=='='||LA23_111=='?'||(LA23_111>='A' && LA23_111<='Z')||(LA23_111>='^' && LA23_111<='z')||(LA23_111>='~' && LA23_111<='\uFFFF')) ) {s = 28;}\r
+                        if ( ((LA23_75>='\u0000' && LA23_75<='\b')||(LA23_75>='\u000B' && LA23_75<='\f')||(LA23_75>='\u000E' && LA23_75<='\u001F')||LA23_75=='!'||LA23_75=='$'||LA23_75=='&'||LA23_75=='+'||(LA23_75>='.' && LA23_75<='9')||LA23_75==';'||LA23_75=='='||LA23_75=='?'||(LA23_75>='A' && LA23_75<='Z')||(LA23_75>='^' && LA23_75<='z')||(LA23_75>='~' && LA23_75<='\uFFFF')) ) {s = 28;}\r
 \r
-                        else s = 113;\r
+                        else s = 84;\r
 \r
                         if ( s>=0 ) return s;\r
                         break;\r
                     case 8 : \r
-                        int LA23_78 = input.LA(1);\r
+                        int LA23_0 = input.LA(1);\r
 \r
+                         \r
+                        int index23_0 = input.index();\r
+                        input.rewind();\r
                         s = -1;\r
-                        if ( ((LA23_78>='\u0000' && LA23_78<='\b')||(LA23_78>='\u000B' && LA23_78<='\f')||(LA23_78>='\u000E' && LA23_78<='\u001F')||LA23_78=='!'||LA23_78=='$'||LA23_78=='&'||LA23_78=='+'||(LA23_78>='.' && LA23_78<='9')||LA23_78==';'||LA23_78=='='||LA23_78=='?'||(LA23_78>='A' && LA23_78<='Z')||(LA23_78>='^' && LA23_78<='z')||(LA23_78>='~' && LA23_78<='\uFFFF')) ) {s = 28;}\r
+                        if ( (LA23_0=='%') && (( getCharPositionInLine() == 0 ))) {s = 1;}\r
 \r
-                        else s = 87;\r
+                        else if ( (LA23_0=='#') ) {s = 2;}\r
 \r
-                        if ( s>=0 ) return s;\r
-                        break;\r
-                    case 9 : \r
-                        int LA23_50 = input.LA(1);\r
+                        else if ( (LA23_0=='\n'||LA23_0=='\r') ) {s = 3;}\r
 \r
-                        s = -1;\r
-                        if ( ((LA23_50>='\u0000' && LA23_50<='\b')||(LA23_50>='\u000B' && LA23_50<='\f')||(LA23_50>='\u000E' && LA23_50<='\u001F')||LA23_50=='!'||LA23_50=='$'||LA23_50=='&'||LA23_50=='+'||(LA23_50>='.' && LA23_50<='/')||LA23_50==';'||LA23_50=='='||LA23_50=='?'||(LA23_50>='A' && LA23_50<='D')||(LA23_50>='F' && LA23_50<='Z')||(LA23_50>='^' && LA23_50<='d')||(LA23_50>='f' && LA23_50<='z')||(LA23_50>='~' && LA23_50<='\uFFFF')) ) {s = 28;}\r
+                        else if ( (LA23_0=='\"') ) {s = 4;}\r
 \r
-                        else if ( (LA23_50=='E'||LA23_50=='e') ) {s = 63;}\r
+                        else if ( (LA23_0=='-') ) {s = 5;}\r
 \r
-                        else if ( ((LA23_50>='0' && LA23_50<='9')) ) {s = 50;}\r
+                        else if ( (LA23_0=='0') ) {s = 6;}\r
 \r
-                        else s = 48;\r
+                        else if ( ((LA23_0>='1' && LA23_0<='9')) ) {s = 7;}\r
 \r
-                        if ( s>=0 ) return s;\r
-                        break;\r
-                    case 10 : \r
-                        int LA23_7 = input.LA(1);\r
+                        else if ( (LA23_0=='{') ) {s = 8;}\r
 \r
-                        s = -1;\r
-                        if ( (LA23_7=='.') ) {s = 35;}\r
+                        else if ( (LA23_0=='}') ) {s = 9;}\r
 \r
-                        else if ( (LA23_7=='E'||LA23_7=='e') ) {s = 36;}\r
+                        else if ( (LA23_0=='[') ) {s = 10;}\r
 \r
-                        else if ( ((LA23_7>='\u0000' && LA23_7<='\b')||(LA23_7>='\u000B' && LA23_7<='\f')||(LA23_7>='\u000E' && LA23_7<='\u001F')||LA23_7=='!'||LA23_7=='$'||LA23_7=='&'||LA23_7=='+'||(LA23_7>='/' && LA23_7<='9')||LA23_7==';'||LA23_7=='='||LA23_7=='?'||(LA23_7>='A' && LA23_7<='D')||(LA23_7>='F' && LA23_7<='Z')||(LA23_7>='^' && LA23_7<='d')||(LA23_7>='f' && LA23_7<='z')||(LA23_7>='~' && LA23_7<='\uFFFF')) ) {s = 28;}\r
+                        else if ( (LA23_0==']') ) {s = 11;}\r
 \r
-                        else s = 34;\r
+                        else if ( (LA23_0=='<') ) {s = 12;}\r
 \r
-                        if ( s>=0 ) return s;\r
-                        break;\r
-                    case 11 : \r
-                        int LA23_35 = input.LA(1);\r
+                        else if ( (LA23_0=='.') ) {s = 13;}\r
 \r
-                        s = -1;\r
-                        if ( ((LA23_35>='0' && LA23_35<='9')) ) {s = 50;}\r
+                        else if ( (LA23_0==',') ) {s = 14;}\r
 \r
-                        else if ( ((LA23_35>='\u0000' && LA23_35<='\b')||(LA23_35>='\u000B' && LA23_35<='\f')||(LA23_35>='\u000E' && LA23_35<='\u001F')||LA23_35=='!'||LA23_35=='$'||LA23_35=='&'||LA23_35=='+'||LA23_35=='/'||LA23_35==';'||LA23_35=='='||LA23_35=='?'||(LA23_35>='A' && LA23_35<='Z')||(LA23_35>='^' && LA23_35<='z')||(LA23_35>='~' && LA23_35<='\uFFFF')) ) {s = 28;}\r
+                        else if ( (LA23_0=='(') ) {s = 15;}\r
 \r
-                        if ( s>=0 ) return s;\r
-                        break;\r
-                    case 12 : \r
-                        int LA23_37 = input.LA(1);\r
+                        else if ( (LA23_0==')') ) {s = 16;}\r
 \r
-                        s = -1;\r
-                        if ( (LA23_37=='.') ) {s = 35;}\r
+                        else if ( (LA23_0=='*') ) {s = 17;}\r
 \r
-                        else if ( (LA23_37=='E'||LA23_37=='e') ) {s = 36;}\r
+                        else if ( (LA23_0==':') ) {s = 18;}\r
 \r
-                        else if ( ((LA23_37>='0' && LA23_37<='9')) ) {s = 37;}\r
+                        else if ( (LA23_0=='c') ) {s = 19;}\r
 \r
-                        else if ( ((LA23_37>='\u0000' && LA23_37<='\b')||(LA23_37>='\u000B' && LA23_37<='\f')||(LA23_37>='\u000E' && LA23_37<='\u001F')||LA23_37=='!'||LA23_37=='$'||LA23_37=='&'||LA23_37=='+'||LA23_37=='/'||LA23_37==';'||LA23_37=='='||LA23_37=='?'||(LA23_37>='A' && LA23_37<='D')||(LA23_37>='F' && LA23_37<='Z')||(LA23_37>='^' && LA23_37<='d')||(LA23_37>='f' && LA23_37<='z')||(LA23_37>='~' && LA23_37<='\uFFFF')) ) {s = 28;}\r
+                        else if ( (LA23_0=='i') ) {s = 20;}\r
 \r
-                        else s = 34;\r
+                        else if ( (LA23_0=='e') ) {s = 21;}\r
 \r
-                        if ( s>=0 ) return s;\r
-                        break;\r
-                    case 13 : \r
-                        int LA23_112 = input.LA(1);\r
+                        else if ( (LA23_0=='r') ) {s = 22;}\r
 \r
-                        s = -1;\r
-                        if ( ((LA23_112>='\u0000' && LA23_112<='\b')||(LA23_112>='\u000B' && LA23_112<='\f')||(LA23_112>='\u000E' && LA23_112<='\u001F')||LA23_112=='!'||LA23_112=='$'||LA23_112=='&'||LA23_112=='+'||(LA23_112>='.' && LA23_112<='9')||LA23_112==';'||LA23_112=='='||LA23_112=='?'||(LA23_112>='A' && LA23_112<='Z')||(LA23_112>='^' && LA23_112<='z')||(LA23_112>='~' && LA23_112<='\uFFFF')) ) {s = 28;}\r
+                        else if ( (LA23_0=='b') ) {s = 23;}\r
 \r
-                        else s = 114;\r
+                        else if ( (LA23_0=='d') ) {s = 24;}\r
 \r
-                        if ( s>=0 ) return s;\r
-                        break;\r
-                    case 14 : \r
-                        int LA23_75 = input.LA(1);\r
+                        else if ( (LA23_0=='p') ) {s = 25;}\r
 \r
-                        s = -1;\r
-                        if ( ((LA23_75>='\u0000' && LA23_75<='\b')||(LA23_75>='\u000B' && LA23_75<='\f')||(LA23_75>='\u000E' && LA23_75<='\u001F')||LA23_75=='!'||LA23_75=='$'||LA23_75=='&'||LA23_75=='+'||(LA23_75>='.' && LA23_75<='/')||LA23_75==';'||LA23_75=='='||LA23_75=='?'||(LA23_75>='A' && LA23_75<='Z')||(LA23_75>='^' && LA23_75<='z')||(LA23_75>='~' && LA23_75<='\uFFFF')) ) {s = 28;}\r
+                        else if ( (LA23_0=='o') ) {s = 26;}\r
 \r
-                        else if ( ((LA23_75>='0' && LA23_75<='9')) ) {s = 75;}\r
+                        else if ( (LA23_0=='m') ) {s = 27;}\r
+\r
+                        else if ( ((LA23_0>='\u0000' && LA23_0<='\b')||(LA23_0>='\u000B' && LA23_0<='\f')||(LA23_0>='\u000E' && LA23_0<='\u001F')||LA23_0=='!'||LA23_0=='$'||LA23_0=='&'||LA23_0=='+'||LA23_0=='/'||LA23_0==';'||LA23_0=='='||LA23_0=='?'||(LA23_0>='A' && LA23_0<='Z')||(LA23_0>='^' && LA23_0<='a')||(LA23_0>='f' && LA23_0<='h')||(LA23_0>='j' && LA23_0<='l')||LA23_0=='n'||LA23_0=='q'||(LA23_0>='s' && LA23_0<='z')||(LA23_0>='~' && LA23_0<='\uFFFF')) ) {s = 28;}\r
 \r
-                        else s = 48;\r
+                        else if ( (LA23_0=='\t'||LA23_0==' ') ) {s = 29;}\r
 \r
+                         \r
+                        input.seek(index23_0);\r
                         if ( s>=0 ) return s;\r
                         break;\r
-                    case 15 : \r
-                        int LA23_76 = input.LA(1);\r
+                    case 9 : \r
+                        int LA23_44 = input.LA(1);\r
 \r
                         s = -1;\r
-                        if ( ((LA23_76>='\u0000' && LA23_76<='\b')||(LA23_76>='\u000B' && LA23_76<='\f')||(LA23_76>='\u000E' && LA23_76<='\u001F')||LA23_76=='!'||LA23_76=='$'||LA23_76=='&'||LA23_76=='+'||(LA23_76>='.' && LA23_76<='9')||LA23_76==';'||LA23_76=='='||LA23_76=='?'||(LA23_76>='A' && LA23_76<='Z')||(LA23_76>='^' && LA23_76<='z')||(LA23_76>='~' && LA23_76<='\uFFFF')) ) {s = 28;}\r
+                        if ( ((LA23_44>='\u0000' && LA23_44<='\b')||(LA23_44>='\u000B' && LA23_44<='\f')||(LA23_44>='\u000E' && LA23_44<='\u001F')||LA23_44=='!'||LA23_44=='$'||LA23_44=='&'||LA23_44=='+'||(LA23_44>='.' && LA23_44<='9')||LA23_44==';'||LA23_44=='='||LA23_44=='?'||(LA23_44>='A' && LA23_44<='Z')||(LA23_44>='^' && LA23_44<='z')||(LA23_44>='~' && LA23_44<='\uFFFF')) ) {s = 28;}\r
 \r
-                        else s = 85;\r
+                        else s = 60;\r
 \r
                         if ( s>=0 ) return s;\r
                         break;\r
-                    case 16 : \r
-                        int LA23_0 = input.LA(1);\r
+                    case 10 : \r
+                        int LA23_54 = input.LA(1);\r
 \r
-                         \r
-                        int index23_0 = input.index();\r
-                        input.rewind();\r
                         s = -1;\r
-                        if ( (LA23_0=='o') ) {s = 1;}\r
+                        if ( ((LA23_54>='\u0000' && LA23_54<='\b')||(LA23_54>='\u000B' && LA23_54<='\f')||(LA23_54>='\u000E' && LA23_54<='\u001F')||LA23_54=='!'||LA23_54=='$'||LA23_54=='&'||LA23_54=='+'||(LA23_54>='.' && LA23_54<='9')||LA23_54==';'||LA23_54=='='||LA23_54=='?'||(LA23_54>='A' && LA23_54<='Z')||(LA23_54>='^' && LA23_54<='z')||(LA23_54>='~' && LA23_54<='\uFFFF')) ) {s = 28;}\r
 \r
-                        else if ( (LA23_0=='%') && (( getCharPositionInLine() == 0 ))) {s = 2;}\r
+                        else s = 66;\r
 \r
-                        else if ( (LA23_0=='#') ) {s = 3;}\r
-\r
-                        else if ( (LA23_0=='\n'||LA23_0=='\r') ) {s = 4;}\r
+                        if ( s>=0 ) return s;\r
+                        break;\r
+                    case 11 : \r
+                        int LA23_77 = input.LA(1);\r
 \r
-                        else if ( (LA23_0=='\"') ) {s = 5;}\r
+                        s = -1;\r
+                        if ( ((LA23_77>='\u0000' && LA23_77<='\b')||(LA23_77>='\u000B' && LA23_77<='\f')||(LA23_77>='\u000E' && LA23_77<='\u001F')||LA23_77=='!'||LA23_77=='$'||LA23_77=='&'||LA23_77=='+'||(LA23_77>='.' && LA23_77<='9')||LA23_77==';'||LA23_77=='='||LA23_77=='?'||(LA23_77>='A' && LA23_77<='Z')||(LA23_77>='^' && LA23_77<='z')||(LA23_77>='~' && LA23_77<='\uFFFF')) ) {s = 28;}\r
 \r
-                        else if ( (LA23_0=='-') ) {s = 6;}\r
+                        else s = 86;\r
 \r
-                        else if ( (LA23_0=='0') ) {s = 7;}\r
+                        if ( s>=0 ) return s;\r
+                        break;\r
+                    case 12 : \r
+                        int LA23_105 = input.LA(1);\r
 \r
-                        else if ( ((LA23_0>='1' && LA23_0<='9')) ) {s = 8;}\r
+                        s = -1;\r
+                        if ( ((LA23_105>='\u0000' && LA23_105<='\b')||(LA23_105>='\u000B' && LA23_105<='\f')||(LA23_105>='\u000E' && LA23_105<='\u001F')||LA23_105=='!'||LA23_105=='$'||LA23_105=='&'||LA23_105=='+'||(LA23_105>='.' && LA23_105<='9')||LA23_105==';'||LA23_105=='='||LA23_105=='?'||(LA23_105>='A' && LA23_105<='Z')||(LA23_105>='^' && LA23_105<='z')||(LA23_105>='~' && LA23_105<='\uFFFF')) ) {s = 28;}\r
 \r
-                        else if ( (LA23_0=='{') ) {s = 9;}\r
+                        else s = 110;\r
 \r
-                        else if ( (LA23_0=='}') ) {s = 10;}\r
+                        if ( s>=0 ) return s;\r
+                        break;\r
+                    case 13 : \r
+                        int LA23_48 = input.LA(1);\r
 \r
-                        else if ( (LA23_0=='[') ) {s = 11;}\r
+                        s = -1;\r
+                        if ( ((LA23_48>='\u0000' && LA23_48<='\b')||(LA23_48>='\u000B' && LA23_48<='\f')||(LA23_48>='\u000E' && LA23_48<='\u001F')||LA23_48=='!'||LA23_48=='$'||LA23_48=='&'||LA23_48=='+'||(LA23_48>='.' && LA23_48<='/')||LA23_48==';'||LA23_48=='='||LA23_48=='?'||(LA23_48>='A' && LA23_48<='D')||(LA23_48>='F' && LA23_48<='Z')||(LA23_48>='^' && LA23_48<='d')||(LA23_48>='f' && LA23_48<='z')||(LA23_48>='~' && LA23_48<='\uFFFF')) ) {s = 28;}\r
 \r
-                        else if ( (LA23_0==']') ) {s = 12;}\r
+                        else if ( (LA23_48=='E'||LA23_48=='e') ) {s = 62;}\r
 \r
-                        else if ( (LA23_0=='<') ) {s = 13;}\r
+                        else if ( ((LA23_48>='0' && LA23_48<='9')) ) {s = 48;}\r
 \r
-                        else if ( (LA23_0=='.') ) {s = 14;}\r
+                        else s = 46;\r
 \r
-                        else if ( (LA23_0==',') ) {s = 15;}\r
+                        if ( s>=0 ) return s;\r
+                        break;\r
+                    case 14 : \r
+                        int LA23_35 = input.LA(1);\r
 \r
-                        else if ( (LA23_0=='(') ) {s = 16;}\r
+                        s = -1;\r
+                        if ( ((LA23_35>='0' && LA23_35<='9')) ) {s = 35;}\r
 \r
-                        else if ( (LA23_0==')') ) {s = 17;}\r
+                        else if ( (LA23_35=='.') ) {s = 33;}\r
 \r
-                        else if ( (LA23_0=='*') ) {s = 18;}\r
+                        else if ( (LA23_35=='E'||LA23_35=='e') ) {s = 34;}\r
 \r
-                        else if ( (LA23_0==':') ) {s = 19;}\r
+                        else if ( ((LA23_35>='\u0000' && LA23_35<='\b')||(LA23_35>='\u000B' && LA23_35<='\f')||(LA23_35>='\u000E' && LA23_35<='\u001F')||LA23_35=='!'||LA23_35=='$'||LA23_35=='&'||LA23_35=='+'||LA23_35=='/'||LA23_35==';'||LA23_35=='='||LA23_35=='?'||(LA23_35>='A' && LA23_35<='D')||(LA23_35>='F' && LA23_35<='Z')||(LA23_35>='^' && LA23_35<='d')||(LA23_35>='f' && LA23_35<='z')||(LA23_35>='~' && LA23_35<='\uFFFF')) ) {s = 28;}\r
 \r
-                        else if ( (LA23_0=='c') ) {s = 20;}\r
+                        else s = 32;\r
 \r
-                        else if ( (LA23_0=='i') ) {s = 21;}\r
+                        if ( s>=0 ) return s;\r
+                        break;\r
+                    case 15 : \r
+                        int LA23_7 = input.LA(1);\r
 \r
-                        else if ( (LA23_0=='e') ) {s = 22;}\r
+                        s = -1;\r
+                        if ( ((LA23_7>='0' && LA23_7<='9')) ) {s = 35;}\r
 \r
-                        else if ( (LA23_0=='r') ) {s = 23;}\r
+                        else if ( (LA23_7=='.') ) {s = 33;}\r
 \r
-                        else if ( (LA23_0=='b') ) {s = 24;}\r
+                        else if ( (LA23_7=='E'||LA23_7=='e') ) {s = 34;}\r
 \r
-                        else if ( (LA23_0=='d') ) {s = 25;}\r
+                        else if ( ((LA23_7>='\u0000' && LA23_7<='\b')||(LA23_7>='\u000B' && LA23_7<='\f')||(LA23_7>='\u000E' && LA23_7<='\u001F')||LA23_7=='!'||LA23_7=='$'||LA23_7=='&'||LA23_7=='+'||LA23_7=='/'||LA23_7==';'||LA23_7=='='||LA23_7=='?'||(LA23_7>='A' && LA23_7<='D')||(LA23_7>='F' && LA23_7<='Z')||(LA23_7>='^' && LA23_7<='d')||(LA23_7>='f' && LA23_7<='z')||(LA23_7>='~' && LA23_7<='\uFFFF')) ) {s = 28;}\r
 \r
-                        else if ( (LA23_0=='p') ) {s = 26;}\r
+                        else s = 32;\r
 \r
-                        else if ( (LA23_0=='m') ) {s = 27;}\r
+                        if ( s>=0 ) return s;\r
+                        break;\r
+                    case 16 : \r
+                        int LA23_33 = input.LA(1);\r
 \r
-                        else if ( ((LA23_0>='\u0000' && LA23_0<='\b')||(LA23_0>='\u000B' && LA23_0<='\f')||(LA23_0>='\u000E' && LA23_0<='\u001F')||LA23_0=='!'||LA23_0=='$'||LA23_0=='&'||LA23_0=='+'||LA23_0=='/'||LA23_0==';'||LA23_0=='='||LA23_0=='?'||(LA23_0>='A' && LA23_0<='Z')||(LA23_0>='^' && LA23_0<='a')||(LA23_0>='f' && LA23_0<='h')||(LA23_0>='j' && LA23_0<='l')||LA23_0=='n'||LA23_0=='q'||(LA23_0>='s' && LA23_0<='z')||(LA23_0>='~' && LA23_0<='\uFFFF')) ) {s = 28;}\r
+                        s = -1;\r
+                        if ( ((LA23_33>='0' && LA23_33<='9')) ) {s = 48;}\r
 \r
-                        else if ( (LA23_0=='\t'||LA23_0==' ') ) {s = 29;}\r
+                        else if ( ((LA23_33>='\u0000' && LA23_33<='\b')||(LA23_33>='\u000B' && LA23_33<='\f')||(LA23_33>='\u000E' && LA23_33<='\u001F')||LA23_33=='!'||LA23_33=='$'||LA23_33=='&'||LA23_33=='+'||LA23_33=='/'||LA23_33==';'||LA23_33=='='||LA23_33=='?'||(LA23_33>='A' && LA23_33<='Z')||(LA23_33>='^' && LA23_33<='z')||(LA23_33>='~' && LA23_33<='\uFFFF')) ) {s = 28;}\r
 \r
-                         \r
-                        input.seek(index23_0);\r
                         if ( s>=0 ) return s;\r
                         break;\r
                     case 17 : \r
-                        int LA23_56 = input.LA(1);\r
+                        int LA23_112 = input.LA(1);\r
 \r
                         s = -1;\r
-                        if ( ((LA23_56>='\u0000' && LA23_56<='\b')||(LA23_56>='\u000B' && LA23_56<='\f')||(LA23_56>='\u000E' && LA23_56<='\u001F')||LA23_56=='!'||LA23_56=='$'||LA23_56=='&'||LA23_56=='+'||(LA23_56>='.' && LA23_56<='9')||LA23_56==';'||LA23_56=='='||LA23_56=='?'||(LA23_56>='A' && LA23_56<='Z')||(LA23_56>='^' && LA23_56<='z')||(LA23_56>='~' && LA23_56<='\uFFFF')) ) {s = 28;}\r
+                        if ( ((LA23_112>='\u0000' && LA23_112<='\b')||(LA23_112>='\u000B' && LA23_112<='\f')||(LA23_112>='\u000E' && LA23_112<='\u001F')||LA23_112=='!'||LA23_112=='$'||LA23_112=='&'||LA23_112=='+'||(LA23_112>='.' && LA23_112<='9')||LA23_112==';'||LA23_112=='='||LA23_112=='?'||(LA23_112>='A' && LA23_112<='Z')||(LA23_112>='^' && LA23_112<='z')||(LA23_112>='~' && LA23_112<='\uFFFF')) ) {s = 28;}\r
 \r
-                        else s = 67;\r
+                        else s = 114;\r
 \r
                         if ( s>=0 ) return s;\r
                         break;\r
index 63a2193..91b0bf0 100644 (file)
@@ -1,4 +1,4 @@
-// $ANTLR 3.1.3 Mar 17, 2009 19:23:44 SilkSchema.g 2009-07-08 15:38:41\r
+// $ANTLR 3.1.3 Mar 17, 2009 19:23:44 SilkSchema.g 2009-07-08 19:54:25\r
 \r
 /*--------------------------------------------------------------------------\r
  *  Copyright 2009 Taro L. Saito\r
@@ -35,7 +35,7 @@ import org.antlr.runtime.tree.*;
 \r
 public class SilkSchemaParser extends Parser {\r
     public static final String[] tokenNames = new String[] {\r
-        "<invalid>", "<EOR>", "<DOWN>", "<UP>", "Schema", "Module", "ClassDef", "Name", "Parent", "Mixin", "Attribute", "IsArray", "TypeName", "DefaultValue", "AllIncluded", "TargetClass", "Function", "Argument", "LineBreakChar", "Preamble", "LineComment", "LineBreak", "Digit", "Letter", "HexDigit", "UnicodeChar", "EscapeSequence", "StringChar", "StringChar_s", "String", "Integer", "Frac", "Exp", "Double", "LBrace", "RBrace", "LBracket", "RBracket", "Lt", "Dot", "Comma", "LParen", "RParen", "Star", "UnsafeUnicodeChar", "NonWhiteSpaceChar", "SymbolChars", "Symbol", "Class", "Includes", "End", "Relation", "Index", "BelongsTo", "Default", "Projection", "OrderBy", "SafeFirstLetter", "SafeLetter", "ModuleName", "WhiteSpaces", "ModuleDef", "WhiteSpace", "QNameChar", "QName", "'on'"\r
+        "<invalid>", "<EOR>", "<DOWN>", "<UP>", "Schema", "Module", "ClassDef", "Name", "Parent", "Mixin", "Attribute", "IsArray", "TypeName", "DefaultValue", "AllIncluded", "TargetClass", "Function", "Argument", "LineBreakChar", "Preamble", "LineComment", "LineBreak", "Digit", "Letter", "HexDigit", "UnicodeChar", "EscapeSequence", "StringChar", "StringChar_s", "String", "Integer", "Frac", "Exp", "Double", "LBrace", "RBrace", "LBracket", "RBracket", "Lt", "Dot", "Comma", "LParen", "RParen", "Star", "UnsafeUnicodeChar", "NonWhiteSpaceChar", "SymbolChars", "Symbol", "Class", "Includes", "End", "Relation", "Index", "BelongsTo", "Default", "Projection", "OrderBy", "On", "SafeFirstLetter", "SafeLetter", "ModuleName", "WhiteSpaces", "ModuleDef", "WhiteSpace", "QNameChar", "QName"\r
     };\r
     public static final int TargetClass=15;\r
     public static final int Includes=49;\r
@@ -50,9 +50,9 @@ public class SilkSchemaParser extends Parser {
     public static final int HexDigit=24;\r
     public static final int Symbol=47;\r
     public static final int OrderBy=56;\r
-    public static final int T__65=65;\r
     public static final int Default=54;\r
     public static final int Argument=17;\r
+    public static final int On=57;\r
     public static final int Index=52;\r
     public static final int Module=5;\r
     public static final int Letter=23;\r
@@ -66,30 +66,30 @@ public class SilkSchemaParser extends Parser {
     public static final int Integer=30;\r
     public static final int Relation=51;\r
     public static final int Mixin=9;\r
-    public static final int WhiteSpace=62;\r
+    public static final int WhiteSpace=63;\r
     public static final int ClassDef=6;\r
     public static final int LineComment=20;\r
-    public static final int ModuleName=59;\r
+    public static final int ModuleName=60;\r
     public static final int Projection=55;\r
     public static final int BelongsTo=53;\r
-    public static final int SafeFirstLetter=57;\r
+    public static final int SafeFirstLetter=58;\r
     public static final int Star=43;\r
     public static final int Preamble=19;\r
     public static final int Exp=32;\r
-    public static final int QNameChar=63;\r
+    public static final int QNameChar=64;\r
     public static final int RParen=42;\r
     public static final int UnicodeChar=25;\r
     public static final int StringChar=27;\r
     public static final int LineBreak=21;\r
     public static final int Function=16;\r
     public static final int Name=7;\r
-    public static final int ModuleDef=61;\r
+    public static final int ModuleDef=62;\r
     public static final int LParen=41;\r
     public static final int String=29;\r
-    public static final int SafeLetter=58;\r
+    public static final int SafeLetter=59;\r
     public static final int LineBreakChar=18;\r
     public static final int IsArray=11;\r
-    public static final int QName=64;\r
+    public static final int QName=65;\r
     public static final int EOF=-1;\r
     public static final int StringChar_s=28;\r
     public static final int UnsafeUnicodeChar=44;\r
@@ -99,7 +99,7 @@ public class SilkSchemaParser extends Parser {
     public static final int Lt=38;\r
     public static final int Parent=8;\r
     public static final int TypeName=12;\r
-    public static final int WhiteSpaces=60;\r
+    public static final int WhiteSpaces=61;\r
 \r
     // delegates\r
     // delegators\r
@@ -132,7 +132,7 @@ public class SilkSchemaParser extends Parser {
     };\r
 \r
     // $ANTLR start "schema"\r
-    // SilkSchema.g:192:1: schema : ( Preamble )? ( schemaElement )* -> ^( Schema ( Preamble )? ( schemaElement )* ) ;\r
+    // SilkSchema.g:193:1: schema : ( Preamble )? ( schemaElement )* -> ^( Schema ( Preamble )? ( schemaElement )* ) ;\r
     public final SilkSchemaParser.schema_return schema() throws RecognitionException {\r
         SilkSchemaParser.schema_return retval = new SilkSchemaParser.schema_return();\r
         retval.start = input.LT(1);\r
@@ -147,10 +147,10 @@ public class SilkSchemaParser extends Parser {
         RewriteRuleTokenStream stream_Preamble=new RewriteRuleTokenStream(adaptor,"token Preamble");\r
         RewriteRuleSubtreeStream stream_schemaElement=new RewriteRuleSubtreeStream(adaptor,"rule schemaElement");\r
         try {\r
-            // SilkSchema.g:192:7: ( ( Preamble )? ( schemaElement )* -> ^( Schema ( Preamble )? ( schemaElement )* ) )\r
-            // SilkSchema.g:192:10: ( Preamble )? ( schemaElement )*\r
+            // SilkSchema.g:193:7: ( ( Preamble )? ( schemaElement )* -> ^( Schema ( Preamble )? ( schemaElement )* ) )\r
+            // SilkSchema.g:193:10: ( Preamble )? ( schemaElement )*\r
             {\r
-            // SilkSchema.g:192:10: ( Preamble )?\r
+            // SilkSchema.g:193:10: ( Preamble )?\r
             int alt1=2;\r
             int LA1_0 = input.LA(1);\r
 \r
@@ -159,9 +159,9 @@ public class SilkSchemaParser extends Parser {
             }\r
             switch (alt1) {\r
                 case 1 :\r
-                    // SilkSchema.g:192:10: Preamble\r
+                    // SilkSchema.g:193:10: Preamble\r
                     {\r
-                    Preamble1=(Token)match(input,Preamble,FOLLOW_Preamble_in_schema873);  \r
+                    Preamble1=(Token)match(input,Preamble,FOLLOW_Preamble_in_schema879);  \r
                     stream_Preamble.add(Preamble1);\r
 \r
 \r
@@ -170,7 +170,7 @@ public class SilkSchemaParser extends Parser {
 \r
             }\r
 \r
-            // SilkSchema.g:192:20: ( schemaElement )*\r
+            // SilkSchema.g:193:20: ( schemaElement )*\r
             loop2:\r
             do {\r
                 int alt2=2;\r
@@ -183,9 +183,9 @@ public class SilkSchemaParser extends Parser {
 \r
                 switch (alt2) {\r
                case 1 :\r
-                   // SilkSchema.g:192:20: schemaElement\r
+                   // SilkSchema.g:193:20: schemaElement\r
                    {\r
-                   pushFollow(FOLLOW_schemaElement_in_schema876);\r
+                   pushFollow(FOLLOW_schemaElement_in_schema882);\r
                    schemaElement2=schemaElement();\r
 \r
                    state._fsp--;\r
@@ -203,7 +203,7 @@ public class SilkSchemaParser extends Parser {
 \r
 \r
             // AST REWRITE\r
-            // elements: Preamble, schemaElement\r
+            // elements: schemaElement, Preamble\r
             // token labels: \r
             // rule labels: retval\r
             // token list labels: \r
@@ -213,20 +213,20 @@ public class SilkSchemaParser extends Parser {
             RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"rule retval",retval!=null?retval.tree:null);\r
 \r
             root_0 = (Object)adaptor.nil();\r
-            // 192:36: -> ^( Schema ( Preamble )? ( schemaElement )* )\r
+            // 193:36: -> ^( Schema ( Preamble )? ( schemaElement )* )\r
             {\r
-                // SilkSchema.g:192:39: ^( Schema ( Preamble )? ( schemaElement )* )\r
+                // SilkSchema.g:193:39: ^( Schema ( Preamble )? ( schemaElement )* )\r
                 {\r
                 Object root_1 = (Object)adaptor.nil();\r
                 root_1 = (Object)adaptor.becomeRoot((Object)adaptor.create(Schema, "Schema"), root_1);\r
 \r
-                // SilkSchema.g:192:48: ( Preamble )?\r
+                // SilkSchema.g:193:48: ( Preamble )?\r
                 if ( stream_Preamble.hasNext() ) {\r
                     adaptor.addChild(root_1, stream_Preamble.nextNode());\r
 \r
                 }\r
                 stream_Preamble.reset();\r
-                // SilkSchema.g:192:58: ( schemaElement )*\r
+                // SilkSchema.g:193:58: ( schemaElement )*\r
                 while ( stream_schemaElement.hasNext() ) {\r
                     adaptor.addChild(root_1, stream_schemaElement.nextTree());\r
 \r
@@ -265,7 +265,7 @@ public class SilkSchemaParser extends Parser {
     };\r
 \r
     // $ANTLR start "schemaElement"\r
-    // SilkSchema.g:195:1: schemaElement : ( classDefinition | projectionDef | moduleDefinition );\r
+    // SilkSchema.g:196:1: schemaElement : ( classDefinition | projectionDef | moduleDefinition );\r
     public final SilkSchemaParser.schemaElement_return schemaElement() throws RecognitionException {\r
         SilkSchemaParser.schemaElement_return retval = new SilkSchemaParser.schemaElement_return();\r
         retval.start = input.LT(1);\r
@@ -281,7 +281,7 @@ public class SilkSchemaParser extends Parser {
 \r
 \r
         try {\r
-            // SilkSchema.g:196:3: ( classDefinition | projectionDef | moduleDefinition )\r
+            // SilkSchema.g:197:3: ( classDefinition | projectionDef | moduleDefinition )\r
             int alt3=3;\r
             switch ( input.LA(1) ) {\r
             case Class:\r
@@ -309,11 +309,11 @@ public class SilkSchemaParser extends Parser {
 \r
             switch (alt3) {\r
                 case 1 :\r
-                    // SilkSchema.g:196:5: classDefinition\r
+                    // SilkSchema.g:197:5: classDefinition\r
                     {\r
                     root_0 = (Object)adaptor.nil();\r
 \r
-                    pushFollow(FOLLOW_classDefinition_in_schemaElement904);\r
+                    pushFollow(FOLLOW_classDefinition_in_schemaElement910);\r
                     classDefinition3=classDefinition();\r
 \r
                     state._fsp--;\r
@@ -323,11 +323,11 @@ public class SilkSchemaParser extends Parser {
                     }\r
                     break;\r
                 case 2 :\r
-                    // SilkSchema.g:197:5: projectionDef\r
+                    // SilkSchema.g:198:5: projectionDef\r
                     {\r
                     root_0 = (Object)adaptor.nil();\r
 \r
-                    pushFollow(FOLLOW_projectionDef_in_schemaElement911);\r
+                    pushFollow(FOLLOW_projectionDef_in_schemaElement917);\r
                     projectionDef4=projectionDef();\r
 \r
                     state._fsp--;\r
@@ -337,11 +337,11 @@ public class SilkSchemaParser extends Parser {
                     }\r
                     break;\r
                 case 3 :\r
-                    // SilkSchema.g:198:5: moduleDefinition\r
+                    // SilkSchema.g:199:5: moduleDefinition\r
                     {\r
                     root_0 = (Object)adaptor.nil();\r
 \r
-                    pushFollow(FOLLOW_moduleDefinition_in_schemaElement917);\r
+                    pushFollow(FOLLOW_moduleDefinition_in_schemaElement923);\r
                     moduleDefinition5=moduleDefinition();\r
 \r
                     state._fsp--;\r
@@ -376,7 +376,7 @@ public class SilkSchemaParser extends Parser {
     };\r
 \r
     // $ANTLR start "moduleDefinition"\r
-    // SilkSchema.g:202:1: moduleDefinition : ModuleDef ( schemaElement )* End -> ^( Module Name[$ModuleDef.text] ( schemaElement )* ) ;\r
+    // SilkSchema.g:203:1: moduleDefinition : ModuleDef ( schemaElement )* End -> ^( Module Name[$ModuleDef.text] ( schemaElement )* ) ;\r
     public final SilkSchemaParser.moduleDefinition_return moduleDefinition() throws RecognitionException {\r
         SilkSchemaParser.moduleDefinition_return retval = new SilkSchemaParser.moduleDefinition_return();\r
         retval.start = input.LT(1);\r
@@ -394,13 +394,13 @@ public class SilkSchemaParser extends Parser {
         RewriteRuleTokenStream stream_ModuleDef=new RewriteRuleTokenStream(adaptor,"token ModuleDef");\r
         RewriteRuleSubtreeStream stream_schemaElement=new RewriteRuleSubtreeStream(adaptor,"rule schemaElement");\r
         try {\r
-            // SilkSchema.g:202:17: ( ModuleDef ( schemaElement )* End -> ^( Module Name[$ModuleDef.text] ( schemaElement )* ) )\r
-            // SilkSchema.g:203:2: ModuleDef ( schemaElement )* End\r
+            // SilkSchema.g:203:17: ( ModuleDef ( schemaElement )* End -> ^( Module Name[$ModuleDef.text] ( schemaElement )* ) )\r
+            // SilkSchema.g:204:2: ModuleDef ( schemaElement )* End\r
             {\r
-            ModuleDef6=(Token)match(input,ModuleDef,FOLLOW_ModuleDef_in_moduleDefinition929);  \r
+            ModuleDef6=(Token)match(input,ModuleDef,FOLLOW_ModuleDef_in_moduleDefinition935);  \r
             stream_ModuleDef.add(ModuleDef6);\r
 \r
-            // SilkSchema.g:203:12: ( schemaElement )*\r
+            // SilkSchema.g:204:12: ( schemaElement )*\r
             loop4:\r
             do {\r
                 int alt4=2;\r
@@ -413,9 +413,9 @@ public class SilkSchemaParser extends Parser {
 \r
                 switch (alt4) {\r
                case 1 :\r
-                   // SilkSchema.g:203:12: schemaElement\r
+                   // SilkSchema.g:204:12: schemaElement\r
                    {\r
-                   pushFollow(FOLLOW_schemaElement_in_moduleDefinition931);\r
+                   pushFollow(FOLLOW_schemaElement_in_moduleDefinition937);\r
                    schemaElement7=schemaElement();\r
 \r
                    state._fsp--;\r
@@ -430,7 +430,7 @@ public class SilkSchemaParser extends Parser {
                 }\r
             } while (true);\r
 \r
-            End8=(Token)match(input,End,FOLLOW_End_in_moduleDefinition934);  \r
+            End8=(Token)match(input,End,FOLLOW_End_in_moduleDefinition940);  \r
             stream_End.add(End8);\r
 \r
 \r
@@ -446,15 +446,15 @@ public class SilkSchemaParser extends Parser {
             RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"rule retval",retval!=null?retval.tree:null);\r
 \r
             root_0 = (Object)adaptor.nil();\r
-            // 204:2: -> ^( Module Name[$ModuleDef.text] ( schemaElement )* )\r
+            // 205:2: -> ^( Module Name[$ModuleDef.text] ( schemaElement )* )\r
             {\r
-                // SilkSchema.g:204:5: ^( Module Name[$ModuleDef.text] ( schemaElement )* )\r
+                // SilkSchema.g:205:5: ^( Module Name[$ModuleDef.text] ( schemaElement )* )\r
                 {\r
                 Object root_1 = (Object)adaptor.nil();\r
                 root_1 = (Object)adaptor.becomeRoot((Object)adaptor.create(Module, "Module"), root_1);\r
 \r
                 adaptor.addChild(root_1, (Object)adaptor.create(Name, (ModuleDef6!=null?ModuleDef6.getText():null)));\r
-                // SilkSchema.g:204:36: ( schemaElement )*\r
+                // SilkSchema.g:205:36: ( schemaElement )*\r
                 while ( stream_schemaElement.hasNext() ) {\r
                     adaptor.addChild(root_1, stream_schemaElement.nextTree());\r
 \r
@@ -493,7 +493,7 @@ public class SilkSchemaParser extends Parser {
     };\r
 \r
     // $ANTLR start "classDefinition"\r
-    // SilkSchema.g:207:1: classDefinition : ( Class QName ( inheritance )? ( classBody )? End -> ^( ClassDef Name[$QName.text] ( inheritance )? ( classBody )? ) | Relation QName ( inheritance )? ( classBody )? End -> ^( Relation Name[$QName.text] ( inheritance )? ( classBody )? ) );\r
+    // SilkSchema.g:208:1: classDefinition : ( Class QName ( inheritance )? ( classBody )? End -> ^( ClassDef Name[$QName.text] ( inheritance )? ( classBody )? ) | Relation QName ( inheritance )? ( classBody )? End -> ^( Relation Name[$QName.text] ( inheritance )? ( classBody )? ) );\r
     public final SilkSchemaParser.classDefinition_return classDefinition() throws RecognitionException {\r
         SilkSchemaParser.classDefinition_return retval = new SilkSchemaParser.classDefinition_return();\r
         retval.start = input.LT(1);\r
@@ -528,7 +528,7 @@ public class SilkSchemaParser extends Parser {
         RewriteRuleSubtreeStream stream_classBody=new RewriteRuleSubtreeStream(adaptor,"rule classBody");\r
         RewriteRuleSubtreeStream stream_inheritance=new RewriteRuleSubtreeStream(adaptor,"rule inheritance");\r
         try {\r
-            // SilkSchema.g:208:3: ( Class QName ( inheritance )? ( classBody )? End -> ^( ClassDef Name[$QName.text] ( inheritance )? ( classBody )? ) | Relation QName ( inheritance )? ( classBody )? End -> ^( Relation Name[$QName.text] ( inheritance )? ( classBody )? ) )\r
+            // SilkSchema.g:209:3: ( Class QName ( inheritance )? ( classBody )? End -> ^( ClassDef Name[$QName.text] ( inheritance )? ( classBody )? ) | Relation QName ( inheritance )? ( classBody )? End -> ^( Relation Name[$QName.text] ( inheritance )? ( classBody )? ) )\r
             int alt9=2;\r
             int LA9_0 = input.LA(1);\r
 \r
@@ -546,15 +546,15 @@ public class SilkSchemaParser extends Parser {
             }\r
             switch (alt9) {\r
                 case 1 :\r
-                    // SilkSchema.g:208:5: Class QName ( inheritance )? ( classBody )? End\r
+                    // SilkSchema.g:209:5: Class QName ( inheritance )? ( classBody )? End\r
                     {\r
-                    Class9=(Token)match(input,Class,FOLLOW_Class_in_classDefinition966);  \r
+                    Class9=(Token)match(input,Class,FOLLOW_Class_in_classDefinition972);  \r
                     stream_Class.add(Class9);\r
 \r
-                    QName10=(Token)match(input,QName,FOLLOW_QName_in_classDefinition968);  \r
+                    QName10=(Token)match(input,QName,FOLLOW_QName_in_classDefinition974);  \r
                     stream_QName.add(QName10);\r
 \r
-                    // SilkSchema.g:208:17: ( inheritance )?\r
+                    // SilkSchema.g:209:17: ( inheritance )?\r
                     int alt5=2;\r
                     int LA5_0 = input.LA(1);\r
 \r
@@ -563,9 +563,9 @@ public class SilkSchemaParser extends Parser {
                     }\r
                     switch (alt5) {\r
                         case 1 :\r
-                            // SilkSchema.g:208:17: inheritance\r
+                            // SilkSchema.g:209:17: inheritance\r
                             {\r
-                            pushFollow(FOLLOW_inheritance_in_classDefinition970);\r
+                            pushFollow(FOLLOW_inheritance_in_classDefinition976);\r
                             inheritance11=inheritance();\r
 \r
                             state._fsp--;\r
@@ -577,7 +577,7 @@ public class SilkSchemaParser extends Parser {
 \r
                     }\r
 \r
-                    // SilkSchema.g:208:30: ( classBody )?\r
+                    // SilkSchema.g:209:30: ( classBody )?\r
                     int alt6=2;\r
                     int LA6_0 = input.LA(1);\r
 \r
@@ -586,9 +586,9 @@ public class SilkSchemaParser extends Parser {
                     }\r
                     switch (alt6) {\r
                         case 1 :\r
-                            // SilkSchema.g:208:30: classBody\r
+                            // SilkSchema.g:209:30: classBody\r
                             {\r
-                            pushFollow(FOLLOW_classBody_in_classDefinition973);\r
+                            pushFollow(FOLLOW_classBody_in_classDefinition979);\r
                             classBody12=classBody();\r
 \r
                             state._fsp--;\r
@@ -600,7 +600,7 @@ public class SilkSchemaParser extends Parser {
 \r
                     }\r
 \r
-                    End13=(Token)match(input,End,FOLLOW_End_in_classDefinition976);  \r
+                    End13=(Token)match(input,End,FOLLOW_End_in_classDefinition982);  \r
                     stream_End.add(End13);\r
 \r
 \r
@@ -616,21 +616,21 @@ public class SilkSchemaParser extends Parser {
                     RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"rule retval",retval!=null?retval.tree:null);\r
 \r
                     root_0 = (Object)adaptor.nil();\r
-                    // 208:45: -> ^( ClassDef Name[$QName.text] ( inheritance )? ( classBody )? )\r
+                    // 209:45: -> ^( ClassDef Name[$QName.text] ( inheritance )? ( classBody )? )\r
                     {\r
-                        // SilkSchema.g:208:48: ^( ClassDef Name[$QName.text] ( inheritance )? ( classBody )? )\r
+                        // SilkSchema.g:209:48: ^( ClassDef Name[$QName.text] ( inheritance )? ( classBody )? )\r
                         {\r
                         Object root_1 = (Object)adaptor.nil();\r
                         root_1 = (Object)adaptor.becomeRoot((Object)adaptor.create(ClassDef, "ClassDef"), root_1);\r
 \r
                         adaptor.addChild(root_1, (Object)adaptor.create(Name, (QName10!=null?QName10.getText():null)));\r
-                        // SilkSchema.g:208:77: ( inheritance )?\r
+                        // SilkSchema.g:209:77: ( inheritance )?\r
                         if ( stream_inheritance.hasNext() ) {\r
                             adaptor.addChild(root_1, stream_inheritance.nextTree());\r
 \r
                         }\r
                         stream_inheritance.reset();\r
-                        // SilkSchema.g:208:90: ( classBody )?\r
+                        // SilkSchema.g:209:90: ( classBody )?\r
                         if ( stream_classBody.hasNext() ) {\r
                             adaptor.addChild(root_1, stream_classBody.nextTree());\r
 \r
@@ -646,15 +646,15 @@ public class SilkSchemaParser extends Parser {
                     }\r
                     break;\r
                 case 2 :\r
-                    // SilkSchema.g:209:7: Relation QName ( inheritance )? ( classBody )? End\r
+                    // SilkSchema.g:210:7: Relation QName ( inheritance )? ( classBody )? End\r
                     {\r
-                    Relation14=(Token)match(input,Relation,FOLLOW_Relation_in_classDefinition999);  \r
+                    Relation14=(Token)match(input,Relation,FOLLOW_Relation_in_classDefinition1005);  \r
                     stream_Relation.add(Relation14);\r
 \r
-                    QName15=(Token)match(input,QName,FOLLOW_QName_in_classDefinition1001);  \r
+                    QName15=(Token)match(input,QName,FOLLOW_QName_in_classDefinition1007);  \r
                     stream_QName.add(QName15);\r
 \r
-                    // SilkSchema.g:209:22: ( inheritance )?\r
+                    // SilkSchema.g:210:22: ( inheritance )?\r
                     int alt7=2;\r
                     int LA7_0 = input.LA(1);\r
 \r
@@ -663,9 +663,9 @@ public class SilkSchemaParser extends Parser {
                     }\r
                     switch (alt7) {\r
                         case 1 :\r
-                            // SilkSchema.g:209:22: inheritance\r
+                            // SilkSchema.g:210:22: inheritance\r
                             {\r
-                            pushFollow(FOLLOW_inheritance_in_classDefinition1003);\r
+                            pushFollow(FOLLOW_inheritance_in_classDefinition1009);\r
                             inheritance16=inheritance();\r
 \r
                             state._fsp--;\r
@@ -677,7 +677,7 @@ public class SilkSchemaParser extends Parser {
 \r
                     }\r
 \r
-                    // SilkSchema.g:209:35: ( classBody )?\r
+                    // SilkSchema.g:210:35: ( classBody )?\r
                     int alt8=2;\r
                     int LA8_0 = input.LA(1);\r
 \r
@@ -686,9 +686,9 @@ public class SilkSchemaParser extends Parser {
                     }\r
                     switch (alt8) {\r
                         case 1 :\r
-                            // SilkSchema.g:209:35: classBody\r
+                            // SilkSchema.g:210:35: classBody\r
                             {\r
-                            pushFollow(FOLLOW_classBody_in_classDefinition1006);\r
+                            pushFollow(FOLLOW_classBody_in_classDefinition1012);\r
                             classBody17=classBody();\r
 \r
                             state._fsp--;\r
@@ -700,7 +700,7 @@ public class SilkSchemaParser extends Parser {
 \r
                     }\r
 \r
-                    End18=(Token)match(input,End,FOLLOW_End_in_classDefinition1009);  \r
+                    End18=(Token)match(input,End,FOLLOW_End_in_classDefinition1015);  \r
                     stream_End.add(End18);\r
 \r
 \r
@@ -716,21 +716,21 @@ public class SilkSchemaParser extends Parser {
                     RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"rule retval",retval!=null?retval.tree:null);\r
 \r
                     root_0 = (Object)adaptor.nil();\r
-                    // 209:50: -> ^( Relation Name[$QName.text] ( inheritance )? ( classBody )? )\r
+                    // 210:50: -> ^( Relation Name[$QName.text] ( inheritance )? ( classBody )? )\r
                     {\r
-                        // SilkSchema.g:209:53: ^( Relation Name[$QName.text] ( inheritance )? ( classBody )? )\r
+                        // SilkSchema.g:210:53: ^( Relation Name[$QName.text] ( inheritance )? ( classBody )? )\r
                         {\r
                         Object root_1 = (Object)adaptor.nil();\r
                         root_1 = (Object)adaptor.becomeRoot(stream_Relation.nextNode(), root_1);\r
 \r
                         adaptor.addChild(root_1, (Object)adaptor.create(Name, (QName15!=null?QName15.getText():null)));\r
-                        // SilkSchema.g:209:82: ( inheritance )?\r
+                        // SilkSchema.g:210:82: ( inheritance )?\r
                         if ( stream_inheritance.hasNext() ) {\r
                             adaptor.addChild(root_1, stream_inheritance.nextTree());\r
 \r
                         }\r
                         stream_inheritance.reset();\r
-                        // SilkSchema.g:209:95: ( classBody )?\r
+                        // SilkSchema.g:210:95: ( classBody )?\r
                         if ( stream_classBody.hasNext() ) {\r
                             adaptor.addChild(root_1, stream_classBody.nextTree());\r
 \r
@@ -771,7 +771,7 @@ public class SilkSchemaParser extends Parser {
     };\r
 \r
     // $ANTLR start "classBody"\r
-    // SilkSchema.g:212:1: classBody : ( belongsToStatement | includeStatement | attributes | indexStatement )+ ;\r
+    // SilkSchema.g:213:1: classBody : ( belongsToStatement | includeStatement | attributes | indexStatement )+ ;\r
     public final SilkSchemaParser.classBody_return classBody() throws RecognitionException {\r
         SilkSchemaParser.classBody_return retval = new SilkSchemaParser.classBody_return();\r
         retval.start = input.LT(1);\r
@@ -789,12 +789,12 @@ public class SilkSchemaParser extends Parser {
 \r
 \r
         try {\r
-            // SilkSchema.g:212:10: ( ( belongsToStatement | includeStatement | attributes | indexStatement )+ )\r
-            // SilkSchema.g:212:12: ( belongsToStatement | includeStatement | attributes | indexStatement )+\r
+            // SilkSchema.g:213:10: ( ( belongsToStatement | includeStatement | attributes | indexStatement )+ )\r
+            // SilkSchema.g:213:12: ( belongsToStatement | includeStatement | attributes | indexStatement )+\r
             {\r
             root_0 = (Object)adaptor.nil();\r
 \r
-            // SilkSchema.g:212:12: ( belongsToStatement | includeStatement | attributes | indexStatement )+\r
+            // SilkSchema.g:213:12: ( belongsToStatement | includeStatement | attributes | indexStatement )+\r
             int cnt10=0;\r
             loop10:\r
             do {\r
@@ -825,9 +825,9 @@ public class SilkSchemaParser extends Parser {
 \r
                 switch (alt10) {\r
                case 1 :\r
-                   // SilkSchema.g:212:13: belongsToStatement\r
+                   // SilkSchema.g:213:13: belongsToStatement\r
                    {\r
-                   pushFollow(FOLLOW_belongsToStatement_in_classBody1038);\r
+                   pushFollow(FOLLOW_belongsToStatement_in_classBody1044);\r
                    belongsToStatement19=belongsToStatement();\r
 \r
                    state._fsp--;\r
@@ -837,9 +837,9 @@ public class SilkSchemaParser extends Parser {
                    }\r
                    break;\r
                case 2 :\r
-                   // SilkSchema.g:212:34: includeStatement\r
+                   // SilkSchema.g:213:34: includeStatement\r
                    {\r
-                   pushFollow(FOLLOW_includeStatement_in_classBody1042);\r
+                   pushFollow(FOLLOW_includeStatement_in_classBody1048);\r
                    includeStatement20=includeStatement();\r
 \r
                    state._fsp--;\r
@@ -849,9 +849,9 @@ public class SilkSchemaParser extends Parser {
                    }\r
                    break;\r
                case 3 :\r
-                   // SilkSchema.g:212:53: attributes\r
+                   // SilkSchema.g:213:53: attributes\r
                    {\r
-                   pushFollow(FOLLOW_attributes_in_classBody1046);\r
+                   pushFollow(FOLLOW_attributes_in_classBody1052);\r
                    attributes21=attributes();\r
 \r
                    state._fsp--;\r
@@ -861,9 +861,9 @@ public class SilkSchemaParser extends Parser {
                    }\r
                    break;\r
                case 4 :\r
-                   // SilkSchema.g:212:66: indexStatement\r
+                   // SilkSchema.g:213:66: indexStatement\r
                    {\r
-                   pushFollow(FOLLOW_indexStatement_in_classBody1050);\r
+                   pushFollow(FOLLOW_indexStatement_in_classBody1056);\r
                    indexStatement22=indexStatement();\r
 \r
                    state._fsp--;\r
@@ -909,7 +909,7 @@ public class SilkSchemaParser extends Parser {
     };\r
 \r
     // $ANTLR start "projectionDef"\r
-    // SilkSchema.g:215:1: projectionDef : Projection c= QName 'on' t= QName ( projectColumn ( ( Comma )? projectColumn )* ) ( orderByColumns )? End -> ^( Projection Name[$c.text] TargetClass[$t.text] ( projectColumn )+ ( orderByColumns )? ) ;\r
+    // SilkSchema.g:216:1: projectionDef : Projection c= QName 'on' t= QName ( projectColumn ( ( Comma )? projectColumn )* ) ( orderByColumns )? End -> ^( Projection Name[$c.text] TargetClass[$t.text] ( projectColumn )+ ( orderByColumns )? ) ;\r
     public final SilkSchemaParser.projectionDef_return projectionDef() throws RecognitionException {\r
         SilkSchemaParser.projectionDef_return retval = new SilkSchemaParser.projectionDef_return();\r
         retval.start = input.LT(1);\r
@@ -935,39 +935,39 @@ public class SilkSchemaParser extends Parser {
         Object string_literal24_tree=null;\r
         Object Comma26_tree=null;\r
         Object End29_tree=null;\r
-        RewriteRuleTokenStream stream_65=new RewriteRuleTokenStream(adaptor,"token 65");\r
         RewriteRuleTokenStream stream_Projection=new RewriteRuleTokenStream(adaptor,"token Projection");\r
         RewriteRuleTokenStream stream_Comma=new RewriteRuleTokenStream(adaptor,"token Comma");\r
         RewriteRuleTokenStream stream_End=new RewriteRuleTokenStream(adaptor,"token End");\r
         RewriteRuleTokenStream stream_QName=new RewriteRuleTokenStream(adaptor,"token QName");\r
+        RewriteRuleTokenStream stream_On=new RewriteRuleTokenStream(adaptor,"token On");\r
         RewriteRuleSubtreeStream stream_projectColumn=new RewriteRuleSubtreeStream(adaptor,"rule projectColumn");\r
         RewriteRuleSubtreeStream stream_orderByColumns=new RewriteRuleSubtreeStream(adaptor,"rule orderByColumns");\r
         try {\r
-            // SilkSchema.g:215:14: ( Projection c= QName 'on' t= QName ( projectColumn ( ( Comma )? projectColumn )* ) ( orderByColumns )? End -> ^( Projection Name[$c.text] TargetClass[$t.text] ( projectColumn )+ ( orderByColumns )? ) )\r
-            // SilkSchema.g:215:16: Projection c= QName 'on' t= QName ( projectColumn ( ( Comma )? projectColumn )* ) ( orderByColumns )? End\r
+            // SilkSchema.g:216:14: ( Projection c= QName 'on' t= QName ( projectColumn ( ( Comma )? projectColumn )* ) ( orderByColumns )? End -> ^( Projection Name[$c.text] TargetClass[$t.text] ( projectColumn )+ ( orderByColumns )? ) )\r
+            // SilkSchema.g:216:16: Projection c= QName 'on' t= QName ( projectColumn ( ( Comma )? projectColumn )* ) ( orderByColumns )? End\r
             {\r
-            Projection23=(Token)match(input,Projection,FOLLOW_Projection_in_projectionDef1060);  \r
+            Projection23=(Token)match(input,Projection,FOLLOW_Projection_in_projectionDef1066);  \r
             stream_Projection.add(Projection23);\r
 \r
-            c=(Token)match(input,QName,FOLLOW_QName_in_projectionDef1064);  \r
+            c=(Token)match(input,QName,FOLLOW_QName_in_projectionDef1070);  \r
             stream_QName.add(c);\r
 \r
-            string_literal24=(Token)match(input,65,FOLLOW_65_in_projectionDef1066);  \r
-            stream_65.add(string_literal24);\r
+            string_literal24=(Token)match(input,On,FOLLOW_On_in_projectionDef1072);  \r
+            stream_On.add(string_literal24);\r
 \r
-            t=(Token)match(input,QName,FOLLOW_QName_in_projectionDef1070);  \r
+            t=(Token)match(input,QName,FOLLOW_QName_in_projectionDef1076);  \r
             stream_QName.add(t);\r
 \r
-            // SilkSchema.g:215:48: ( projectColumn ( ( Comma )? projectColumn )* )\r
-            // SilkSchema.g:215:49: projectColumn ( ( Comma )? projectColumn )*\r
+            // SilkSchema.g:216:48: ( projectColumn ( ( Comma )? projectColumn )* )\r
+            // SilkSchema.g:216:49: projectColumn ( ( Comma )? projectColumn )*\r
             {\r
-            pushFollow(FOLLOW_projectColumn_in_projectionDef1073);\r
+            pushFollow(FOLLOW_projectColumn_in_projectionDef1079);\r
             projectColumn25=projectColumn();\r
 \r
             state._fsp--;\r
 \r
             stream_projectColumn.add(projectColumn25.getTree());\r
-            // SilkSchema.g:215:63: ( ( Comma )? projectColumn )*\r
+            // SilkSchema.g:216:63: ( ( Comma )? projectColumn )*\r
             loop12:\r
             do {\r
                 int alt12=2;\r
@@ -980,9 +980,9 @@ public class SilkSchemaParser extends Parser {
 \r
                 switch (alt12) {\r
                case 1 :\r
-                   // SilkSchema.g:215:64: ( Comma )? projectColumn\r
+                   // SilkSchema.g:216:64: ( Comma )? projectColumn\r
                    {\r
-                   // SilkSchema.g:215:64: ( Comma )?\r
+                   // SilkSchema.g:216:64: ( Comma )?\r
                    int alt11=2;\r
                    int LA11_0 = input.LA(1);\r
 \r
@@ -991,9 +991,9 @@ public class SilkSchemaParser extends Parser {
                    }\r
                    switch (alt11) {\r
                        case 1 :\r
-                           // SilkSchema.g:215:64: Comma\r
+                           // SilkSchema.g:216:64: Comma\r
                            {\r
-                           Comma26=(Token)match(input,Comma,FOLLOW_Comma_in_projectionDef1076);  \r
+                           Comma26=(Token)match(input,Comma,FOLLOW_Comma_in_projectionDef1082);  \r
                            stream_Comma.add(Comma26);\r
 \r
 \r
@@ -1002,7 +1002,7 @@ public class SilkSchemaParser extends Parser {
 \r
                    }\r
 \r
-                   pushFollow(FOLLOW_projectColumn_in_projectionDef1079);\r
+                   pushFollow(FOLLOW_projectColumn_in_projectionDef1085);\r
                    projectColumn27=projectColumn();\r
 \r
                    state._fsp--;\r
@@ -1020,7 +1020,7 @@ public class SilkSchemaParser extends Parser {
 \r
             }\r
 \r
-            // SilkSchema.g:215:88: ( orderByColumns )?\r
+            // SilkSchema.g:216:88: ( orderByColumns )?\r
             int alt13=2;\r
             int LA13_0 = input.LA(1);\r
 \r
@@ -1029,9 +1029,9 @@ public class SilkSchemaParser extends Parser {
             }\r
             switch (alt13) {\r
                 case 1 :\r
-                    // SilkSchema.g:215:88: orderByColumns\r
+                    // SilkSchema.g:216:88: orderByColumns\r
                     {\r
-                    pushFollow(FOLLOW_orderByColumns_in_projectionDef1084);\r
+                    pushFollow(FOLLOW_orderByColumns_in_projectionDef1090);\r
                     orderByColumns28=orderByColumns();\r
 \r
                     state._fsp--;\r
@@ -1043,13 +1043,13 @@ public class SilkSchemaParser extends Parser {
 \r
             }\r
 \r
-            End29=(Token)match(input,End,FOLLOW_End_in_projectionDef1087);  \r
+            End29=(Token)match(input,End,FOLLOW_End_in_projectionDef1093);  \r
             stream_End.add(End29);\r
 \r
 \r
 \r
             // AST REWRITE\r
-            // elements: Projection, orderByColumns, projectColumn\r
+            // elements: orderByColumns, Projection, projectColumn\r
             // token labels: \r
             // rule labels: retval\r
             // token list labels: \r
@@ -1059,9 +1059,9 @@ public class SilkSchemaParser extends Parser {
             RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"rule retval",retval!=null?retval.tree:null);\r
 \r
             root_0 = (Object)adaptor.nil();\r
-            // 216:2: -> ^( Projection Name[$c.text] TargetClass[$t.text] ( projectColumn )+ ( orderByColumns )? )\r
+            // 217:2: -> ^( Projection Name[$c.text] TargetClass[$t.text] ( projectColumn )+ ( orderByColumns )? )\r
             {\r
-                // SilkSchema.g:216:5: ^( Projection Name[$c.text] TargetClass[$t.text] ( projectColumn )+ ( orderByColumns )? )\r
+                // SilkSchema.g:217:5: ^( Projection Name[$c.text] TargetClass[$t.text] ( projectColumn )+ ( orderByColumns )? )\r
                 {\r
                 Object root_1 = (Object)adaptor.nil();\r
                 root_1 = (Object)adaptor.becomeRoot(stream_Projection.nextNode(), root_1);\r
@@ -1076,7 +1076,7 @@ public class SilkSchemaParser extends Parser {
 \r
                 }\r
                 stream_projectColumn.reset();\r
-                // SilkSchema.g:216:68: ( orderByColumns )?\r
+                // SilkSchema.g:217:68: ( orderByColumns )?\r
                 if ( stream_orderByColumns.hasNext() ) {\r
                     adaptor.addChild(root_1, stream_orderByColumns.nextTree());\r
 \r
@@ -1115,7 +1115,7 @@ public class SilkSchemaParser extends Parser {
     };\r
 \r
     // $ANTLR start "projectColumn"\r
-    // SilkSchema.g:218:1: fragment projectColumn : ( QName -> Attribute[$QName.text] | Star -> AllIncluded[\"true\"] | Symbol -> Attribute[$Symbol.text] );\r
+    // SilkSchema.g:219:1: fragment projectColumn : ( QName -> Attribute[$QName.text] | Star -> AllIncluded[\"true\"] | Symbol -> Attribute[$Symbol.text] );\r
     public final SilkSchemaParser.projectColumn_return projectColumn() throws RecognitionException {\r
         SilkSchemaParser.projectColumn_return retval = new SilkSchemaParser.projectColumn_return();\r
         retval.start = input.LT(1);\r
@@ -1134,7 +1134,7 @@ public class SilkSchemaParser extends Parser {
         RewriteRuleTokenStream stream_QName=new RewriteRuleTokenStream(adaptor,"token QName");\r
 \r
         try {\r
-            // SilkSchema.g:220:3: ( QName -> Attribute[$QName.text] | Star -> AllIncluded[\"true\"] | Symbol -> Attribute[$Symbol.text] )\r
+            // SilkSchema.g:221:3: ( QName -> Attribute[$QName.text] | Star -> AllIncluded[\"true\"] | Symbol -> Attribute[$Symbol.text] )\r
             int alt14=3;\r
             switch ( input.LA(1) ) {\r
             case QName:\r
@@ -1161,9 +1161,9 @@ public class SilkSchemaParser extends Parser {
 \r
             switch (alt14) {\r
                 case 1 :\r
-                    // SilkSchema.g:220:5: QName\r
+                    // SilkSchema.g:221:5: QName\r
                     {\r
-                    QName30=(Token)match(input,QName,FOLLOW_QName_in_projectColumn1119);  \r
+                    QName30=(Token)match(input,QName,FOLLOW_QName_in_projectColumn1125);  \r
                     stream_QName.add(QName30);\r
 \r
 \r
@@ -1179,7 +1179,7 @@ public class SilkSchemaParser extends Parser {
                     RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"rule retval",retval!=null?retval.tree:null);\r
 \r
                     root_0 = (Object)adaptor.nil();\r
-                    // 220:12: -> Attribute[$QName.text]\r
+                    // 221:12: -> Attribute[$QName.text]\r
                     {\r
                         adaptor.addChild(root_0, (Object)adaptor.create(Attribute, (QName30!=null?QName30.getText():null)));\r
 \r
@@ -1189,9 +1189,9 @@ public class SilkSchemaParser extends Parser {
                     }\r
                     break;\r
                 case 2 :\r
-                    // SilkSchema.g:221:5: Star\r
+                    // SilkSchema.g:222:5: Star\r
                     {\r
-                    Star31=(Token)match(input,Star,FOLLOW_Star_in_projectColumn1131);  \r
+                    Star31=(Token)match(input,Star,FOLLOW_Star_in_projectColumn1137);  \r
                     stream_Star.add(Star31);\r
 \r
 \r
@@ -1207,7 +1207,7 @@ public class SilkSchemaParser extends Parser {
                     RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"rule retval",retval!=null?retval.tree:null);\r
 \r
                     root_0 = (Object)adaptor.nil();\r
-                    // 221:10: -> AllIncluded[\"true\"]\r
+                    // 222:10: -> AllIncluded[\"true\"]\r
                     {\r
                         adaptor.addChild(root_0, (Object)adaptor.create(AllIncluded, "true"));\r
 \r
@@ -1217,9 +1217,9 @@ public class SilkSchemaParser extends Parser {
                     }\r
                     break;\r
                 case 3 :\r
-                    // SilkSchema.g:222:5: Symbol\r
+                    // SilkSchema.g:223:5: Symbol\r
                     {\r
-                    Symbol32=(Token)match(input,Symbol,FOLLOW_Symbol_in_projectColumn1143);  \r
+                    Symbol32=(Token)match(input,Symbol,FOLLOW_Symbol_in_projectColumn1149);  \r
                     stream_Symbol.add(Symbol32);\r
 \r
 \r
@@ -1235,7 +1235,7 @@ public class SilkSchemaParser extends Parser {
                     RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"rule retval",retval!=null?retval.tree:null);\r
 \r
                     root_0 = (Object)adaptor.nil();\r
-                    // 222:12: -> Attribute[$Symbol.text]\r
+                    // 223:12: -> Attribute[$Symbol.text]\r
                     {\r
                         adaptor.addChild(root_0, (Object)adaptor.create(Attribute, (Symbol32!=null?Symbol32.getText():null)));\r
 \r
@@ -1270,7 +1270,7 @@ public class SilkSchemaParser extends Parser {
     };\r
 \r
     // $ANTLR start "orderByColumns"\r
-    // SilkSchema.g:225:1: fragment orderByColumns : OrderBy orderByItem ( Comma orderByItem )* -> ( orderByItem )+ ;\r
+    // SilkSchema.g:226:1: fragment orderByColumns : OrderBy orderByItem ( Comma orderByItem )* -> ( orderByItem )+ ;\r
     public final SilkSchemaParser.orderByColumns_return orderByColumns() throws RecognitionException {\r
         SilkSchemaParser.orderByColumns_return retval = new SilkSchemaParser.orderByColumns_return();\r
         retval.start = input.LT(1);\r
@@ -1290,19 +1290,19 @@ public class SilkSchemaParser extends Parser {
         RewriteRuleTokenStream stream_Comma=new RewriteRuleTokenStream(adaptor,"token Comma");\r
         RewriteRuleSubtreeStream stream_orderByItem=new RewriteRuleSubtreeStream(adaptor,"rule orderByItem");\r
         try {\r
-            // SilkSchema.g:227:3: ( OrderBy orderByItem ( Comma orderByItem )* -> ( orderByItem )+ )\r
-            // SilkSchema.g:227:5: OrderBy orderByItem ( Comma orderByItem )*\r
+            // SilkSchema.g:228:3: ( OrderBy orderByItem ( Comma orderByItem )* -> ( orderByItem )+ )\r
+            // SilkSchema.g:228:5: OrderBy orderByItem ( Comma orderByItem )*\r
             {\r
-            OrderBy33=(Token)match(input,OrderBy,FOLLOW_OrderBy_in_orderByColumns1161);  \r
+            OrderBy33=(Token)match(input,OrderBy,FOLLOW_OrderBy_in_orderByColumns1167);  \r
             stream_OrderBy.add(OrderBy33);\r
 \r
-            pushFollow(FOLLOW_orderByItem_in_orderByColumns1163);\r
+            pushFollow(FOLLOW_orderByItem_in_orderByColumns1169);\r
             orderByItem34=orderByItem();\r
 \r
             state._fsp--;\r
 \r
             stream_orderByItem.add(orderByItem34.getTree());\r
-            // SilkSchema.g:227:25: ( Comma orderByItem )*\r
+            // SilkSchema.g:228:25: ( Comma orderByItem )*\r
             loop15:\r
             do {\r
                 int alt15=2;\r
@@ -1315,12 +1315,12 @@ public class SilkSchemaParser extends Parser {
 \r
                 switch (alt15) {\r
                case 1 :\r
-                   // SilkSchema.g:227:26: Comma orderByItem\r
+                   // SilkSchema.g:228:26: Comma orderByItem\r
                    {\r
-                   Comma35=(Token)match(input,Comma,FOLLOW_Comma_in_orderByColumns1166);  \r
+                   Comma35=(Token)match(input,Comma,FOLLOW_Comma_in_orderByColumns1172);  \r
                    stream_Comma.add(Comma35);\r
 \r
-                   pushFollow(FOLLOW_orderByItem_in_orderByColumns1168);\r
+                   pushFollow(FOLLOW_orderByItem_in_orderByColumns1174);\r
                    orderByItem36=orderByItem();\r
 \r
                    state._fsp--;\r
@@ -1348,7 +1348,7 @@ public class SilkSchemaParser extends Parser {
             RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"rule retval",retval!=null?retval.tree:null);\r
 \r
             root_0 = (Object)adaptor.nil();\r
-            // 227:46: -> ( orderByItem )+\r
+            // 228:46: -> ( orderByItem )+\r
             {\r
                 if ( !(stream_orderByItem.hasNext()) ) {\r
                     throw new RewriteEarlyExitException();\r
@@ -1388,7 +1388,7 @@ public class SilkSchemaParser extends Parser {
     };\r
 \r
     // $ANTLR start "orderByItem"\r
-    // SilkSchema.g:230:1: fragment orderByItem : ( QName -> OrderBy[$QName.text] | Symbol -> OrderBy[$Symbol.text] );\r
+    // SilkSchema.g:231:1: fragment orderByItem : ( QName -> OrderBy[$QName.text] | Symbol -> OrderBy[$Symbol.text] );\r
     public final SilkSchemaParser.orderByItem_return orderByItem() throws RecognitionException {\r
         SilkSchemaParser.orderByItem_return retval = new SilkSchemaParser.orderByItem_return();\r
         retval.start = input.LT(1);\r
@@ -1404,7 +1404,7 @@ public class SilkSchemaParser extends Parser {
         RewriteRuleTokenStream stream_QName=new RewriteRuleTokenStream(adaptor,"token QName");\r
 \r
         try {\r
-            // SilkSchema.g:232:3: ( QName -> OrderBy[$QName.text] | Symbol -> OrderBy[$Symbol.text] )\r
+            // SilkSchema.g:233:3: ( QName -> OrderBy[$QName.text] | Symbol -> OrderBy[$Symbol.text] )\r
             int alt16=2;\r
             int LA16_0 = input.LA(1);\r
 \r
@@ -1422,9 +1422,9 @@ public class SilkSchemaParser extends Parser {
             }\r
             switch (alt16) {\r
                 case 1 :\r
-                    // SilkSchema.g:232:5: QName\r
+                    // SilkSchema.g:233:5: QName\r
                     {\r
-                    QName37=(Token)match(input,QName,FOLLOW_QName_in_orderByItem1188);  \r
+                    QName37=(Token)match(input,QName,FOLLOW_QName_in_orderByItem1194);  \r
                     stream_QName.add(QName37);\r
 \r
 \r
@@ -1440,7 +1440,7 @@ public class SilkSchemaParser extends Parser {
                     RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"rule retval",retval!=null?retval.tree:null);\r
 \r
                     root_0 = (Object)adaptor.nil();\r
-                    // 232:11: -> OrderBy[$QName.text]\r
+                    // 233:11: -> OrderBy[$QName.text]\r
                     {\r
                         adaptor.addChild(root_0, (Object)adaptor.create(OrderBy, (QName37!=null?QName37.getText():null)));\r
 \r
@@ -1450,9 +1450,9 @@ public class SilkSchemaParser extends Parser {
                     }\r
                     break;\r
                 case 2 :\r
-                    // SilkSchema.g:233:5: Symbol\r
+                    // SilkSchema.g:234:5: Symbol\r
                     {\r
-                    Symbol38=(Token)match(input,Symbol,FOLLOW_Symbol_in_orderByItem1200);  \r
+                    Symbol38=(Token)match(input,Symbol,FOLLOW_Symbol_in_orderByItem1206);  \r
                     stream_Symbol.add(Symbol38);\r
 \r
 \r
@@ -1468,7 +1468,7 @@ public class SilkSchemaParser extends Parser {
                     RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"rule retval",retval!=null?retval.tree:null);\r
 \r
                     root_0 = (Object)adaptor.nil();\r
-                    // 233:12: -> OrderBy[$Symbol.text]\r
+                    // 234:12: -> OrderBy[$Symbol.text]\r
                     {\r
                         adaptor.addChild(root_0, (Object)adaptor.create(OrderBy, (Symbol38!=null?Symbol38.getText():null)));\r
 \r
@@ -1503,7 +1503,7 @@ public class SilkSchemaParser extends Parser {
     };\r
 \r
     // $ANTLR start "functionArg"\r
-    // SilkSchema.g:237:1: fragment functionArg : Symbol -> Argument[$Symbol.text] ;\r
+    // SilkSchema.g:238:1: fragment functionArg : Symbol -> Argument[$Symbol.text] ;\r
     public final SilkSchemaParser.functionArg_return functionArg() throws RecognitionException {\r
         SilkSchemaParser.functionArg_return retval = new SilkSchemaParser.functionArg_return();\r
         retval.start = input.LT(1);\r
@@ -1516,10 +1516,10 @@ public class SilkSchemaParser extends Parser {
         RewriteRuleTokenStream stream_Symbol=new RewriteRuleTokenStream(adaptor,"token Symbol");\r
 \r
         try {\r
-            // SilkSchema.g:238:12: ( Symbol -> Argument[$Symbol.text] )\r
-            // SilkSchema.g:238:14: Symbol\r
+            // SilkSchema.g:239:12: ( Symbol -> Argument[$Symbol.text] )\r
+            // SilkSchema.g:239:14: Symbol\r
             {\r
-            Symbol39=(Token)match(input,Symbol,FOLLOW_Symbol_in_functionArg1216);  \r
+            Symbol39=(Token)match(input,Symbol,FOLLOW_Symbol_in_functionArg1222);  \r
             stream_Symbol.add(Symbol39);\r
 \r
 \r
@@ -1535,7 +1535,7 @@ public class SilkSchemaParser extends Parser {
             RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"rule retval",retval!=null?retval.tree:null);\r
 \r
             root_0 = (Object)adaptor.nil();\r
-            // 238:21: -> Argument[$Symbol.text]\r
+            // 239:21: -> Argument[$Symbol.text]\r
             {\r
                 adaptor.addChild(root_0, (Object)adaptor.create(Argument, (Symbol39!=null?Symbol39.getText():null)));\r
 \r
@@ -1568,7 +1568,7 @@ public class SilkSchemaParser extends Parser {
     };\r
 \r
     // $ANTLR start "belongsToStatement"\r
-    // SilkSchema.g:241:1: fragment belongsToStatement : BelongsTo QName -> BelongsTo[$QName.text] ;\r
+    // SilkSchema.g:242:1: fragment belongsToStatement : BelongsTo QName -> BelongsTo[$QName.text] ;\r
     public final SilkSchemaParser.belongsToStatement_return belongsToStatement() throws RecognitionException {\r
         SilkSchemaParser.belongsToStatement_return retval = new SilkSchemaParser.belongsToStatement_return();\r
         retval.start = input.LT(1);\r
@@ -1584,13 +1584,13 @@ public class SilkSchemaParser extends Parser {
         RewriteRuleTokenStream stream_QName=new RewriteRuleTokenStream(adaptor,"token QName");\r
 \r
         try {\r
-            // SilkSchema.g:242:19: ( BelongsTo QName -> BelongsTo[$QName.text] )\r
-            // SilkSchema.g:242:21: BelongsTo QName\r
+            // SilkSchema.g:243:19: ( BelongsTo QName -> BelongsTo[$QName.text] )\r
+            // SilkSchema.g:243:21: BelongsTo QName\r
             {\r
-            BelongsTo40=(Token)match(input,BelongsTo,FOLLOW_BelongsTo_in_belongsToStatement1232);  \r
+            BelongsTo40=(Token)match(input,BelongsTo,FOLLOW_BelongsTo_in_belongsToStatement1238);  \r
             stream_BelongsTo.add(BelongsTo40);\r
 \r
-            QName41=(Token)match(input,QName,FOLLOW_QName_in_belongsToStatement1234);  \r
+            QName41=(Token)match(input,QName,FOLLOW_QName_in_belongsToStatement1240);  \r
             stream_QName.add(QName41);\r
 \r
 \r
@@ -1606,7 +1606,7 @@ public class SilkSchemaParser extends Parser {
             RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"rule retval",retval!=null?retval.tree:null);\r
 \r
             root_0 = (Object)adaptor.nil();\r
-            // 242:37: -> BelongsTo[$QName.text]\r
+            // 243:37: -> BelongsTo[$QName.text]\r
             {\r
                 adaptor.addChild(root_0, (Object)adaptor.create(BelongsTo, (QName41!=null?QName41.getText():null)));\r
 \r
@@ -1639,7 +1639,7 @@ public class SilkSchemaParser extends Parser {
     };\r
 \r
     // $ANTLR start "inheritance"\r
-    // SilkSchema.g:244:1: fragment inheritance : Lt QName -> Parent[$QName.text] ;\r
+    // SilkSchema.g:245:1: fragment inheritance : Lt QName -> Parent[$QName.text] ;\r
     public final SilkSchemaParser.inheritance_return inheritance() throws RecognitionException {\r
         SilkSchemaParser.inheritance_return retval = new SilkSchemaParser.inheritance_return();\r
         retval.start = input.LT(1);\r
@@ -1655,13 +1655,13 @@ public class SilkSchemaParser extends Parser {
         RewriteRuleTokenStream stream_QName=new RewriteRuleTokenStream(adaptor,"token QName");\r
 \r
         try {\r
-            // SilkSchema.g:245:12: ( Lt QName -> Parent[$QName.text] )\r
-            // SilkSchema.g:245:14: Lt QName\r
+            // SilkSchema.g:246:12: ( Lt QName -> Parent[$QName.text] )\r
+            // SilkSchema.g:246:14: Lt QName\r
             {\r
-            Lt42=(Token)match(input,Lt,FOLLOW_Lt_in_inheritance1252);  \r
+            Lt42=(Token)match(input,Lt,FOLLOW_Lt_in_inheritance1258);  \r
             stream_Lt.add(Lt42);\r
 \r
-            QName43=(Token)match(input,QName,FOLLOW_QName_in_inheritance1254);  \r
+            QName43=(Token)match(input,QName,FOLLOW_QName_in_inheritance1260);  \r
             stream_QName.add(QName43);\r
 \r
 \r
@@ -1677,7 +1677,7 @@ public class SilkSchemaParser extends Parser {
             RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"rule retval",retval!=null?retval.tree:null);\r
 \r
             root_0 = (Object)adaptor.nil();\r
-            // 245:23: -> Parent[$QName.text]\r
+            // 246:23: -> Parent[$QName.text]\r
             {\r
                 adaptor.addChild(root_0, (Object)adaptor.create(Parent, (QName43!=null?QName43.getText():null)));\r
 \r
@@ -1710,7 +1710,7 @@ public class SilkSchemaParser extends Parser {
     };\r
 \r
     // $ANTLR start "includeStatement"\r
-    // SilkSchema.g:247:1: fragment includeStatement : Includes includeItem ( Comma includeItem )* -> ( includeItem )+ ;\r
+    // SilkSchema.g:248:1: fragment includeStatement : Includes includeItem ( Comma includeItem )* -> ( includeItem )+ ;\r
     public final SilkSchemaParser.includeStatement_return includeStatement() throws RecognitionException {\r
         SilkSchemaParser.includeStatement_return retval = new SilkSchemaParser.includeStatement_return();\r
         retval.start = input.LT(1);\r
@@ -1730,19 +1730,19 @@ public class SilkSchemaParser extends Parser {
         RewriteRuleTokenStream stream_Comma=new RewriteRuleTokenStream(adaptor,"token Comma");\r
         RewriteRuleSubtreeStream stream_includeItem=new RewriteRuleSubtreeStream(adaptor,"rule includeItem");\r
         try {\r
-            // SilkSchema.g:248:17: ( Includes includeItem ( Comma includeItem )* -> ( includeItem )+ )\r
-            // SilkSchema.g:248:19: Includes includeItem ( Comma includeItem )*\r
+            // SilkSchema.g:249:17: ( Includes includeItem ( Comma includeItem )* -> ( includeItem )+ )\r
+            // SilkSchema.g:249:19: Includes includeItem ( Comma includeItem )*\r
             {\r
-            Includes44=(Token)match(input,Includes,FOLLOW_Includes_in_includeStatement1271);  \r
+            Includes44=(Token)match(input,Includes,FOLLOW_Includes_in_includeStatement1277);  \r
             stream_Includes.add(Includes44);\r
 \r
-            pushFollow(FOLLOW_includeItem_in_includeStatement1273);\r
+            pushFollow(FOLLOW_includeItem_in_includeStatement1279);\r
             includeItem45=includeItem();\r
 \r
             state._fsp--;\r
 \r
             stream_includeItem.add(includeItem45.getTree());\r
-            // SilkSchema.g:248:40: ( Comma includeItem )*\r
+            // SilkSchema.g:249:40: ( Comma includeItem )*\r
             loop17:\r
             do {\r
                 int alt17=2;\r
@@ -1755,12 +1755,12 @@ public class SilkSchemaParser extends Parser {
 \r
                 switch (alt17) {\r
                case 1 :\r
-                   // SilkSchema.g:248:41: Comma includeItem\r
+                   // SilkSchema.g:249:41: Comma includeItem\r
                    {\r
-                   Comma46=(Token)match(input,Comma,FOLLOW_Comma_in_includeStatement1276);  \r
+                   Comma46=(Token)match(input,Comma,FOLLOW_Comma_in_includeStatement1282);  \r
                    stream_Comma.add(Comma46);\r
 \r
-                   pushFollow(FOLLOW_includeItem_in_includeStatement1278);\r
+                   pushFollow(FOLLOW_includeItem_in_includeStatement1284);\r
                    includeItem47=includeItem();\r
 \r
                    state._fsp--;\r
@@ -1788,7 +1788,7 @@ public class SilkSchemaParser extends Parser {
             RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"rule retval",retval!=null?retval.tree:null);\r
 \r
             root_0 = (Object)adaptor.nil();\r
-            // 248:61: -> ( includeItem )+\r
+            // 249:61: -> ( includeItem )+\r
             {\r
                 if ( !(stream_includeItem.hasNext()) ) {\r
                     throw new RewriteEarlyExitException();\r
@@ -1828,7 +1828,7 @@ public class SilkSchemaParser extends Parser {
     };\r
 \r
     // $ANTLR start "includeItem"\r
-    // SilkSchema.g:250:1: fragment includeItem : QName -> Mixin[$QName.text] ;\r
+    // SilkSchema.g:251:1: fragment includeItem : QName -> Mixin[$QName.text] ;\r
     public final SilkSchemaParser.includeItem_return includeItem() throws RecognitionException {\r
         SilkSchemaParser.includeItem_return retval = new SilkSchemaParser.includeItem_return();\r
         retval.start = input.LT(1);\r
@@ -1841,10 +1841,10 @@ public class SilkSchemaParser extends Parser {
         RewriteRuleTokenStream stream_QName=new RewriteRuleTokenStream(adaptor,"token QName");\r
 \r
         try {\r
-            // SilkSchema.g:251:12: ( QName -> Mixin[$QName.text] )\r
-            // SilkSchema.g:251:14: QName\r
+            // SilkSchema.g:252:12: ( QName -> Mixin[$QName.text] )\r
+            // SilkSchema.g:252:14: QName\r
             {\r
-            QName48=(Token)match(input,QName,FOLLOW_QName_in_includeItem1295);  \r
+            QName48=(Token)match(input,QName,FOLLOW_QName_in_includeItem1301);  \r
             stream_QName.add(QName48);\r
 \r
 \r
@@ -1860,7 +1860,7 @@ public class SilkSchemaParser extends Parser {
             RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"rule retval",retval!=null?retval.tree:null);\r
 \r
             root_0 = (Object)adaptor.nil();\r
-            // 251:20: -> Mixin[$QName.text]\r
+            // 252:20: -> Mixin[$QName.text]\r
             {\r
                 adaptor.addChild(root_0, (Object)adaptor.create(Mixin, (QName48!=null?QName48.getText():null)));\r
 \r
@@ -1893,7 +1893,7 @@ public class SilkSchemaParser extends Parser {
     };\r
 \r
     // $ANTLR start "indexStatement"\r
-    // SilkSchema.g:253:1: fragment indexStatement : Index QName indexTarget ( Comma indexTarget )* -> ^( Index TypeName[$QName.text] ( indexTarget )+ ) ;\r
+    // SilkSchema.g:254:1: fragment indexStatement : Index QName On indexTarget ( Comma indexTarget )* -> ^( Index TypeName[$QName.text] ( indexTarget )+ ) ;\r
     public final SilkSchemaParser.indexStatement_return indexStatement() throws RecognitionException {\r
         SilkSchemaParser.indexStatement_return retval = new SilkSchemaParser.indexStatement_return();\r
         retval.start = input.LT(1);\r
@@ -1902,36 +1902,42 @@ public class SilkSchemaParser extends Parser {
 \r
         Token Index49=null;\r
         Token QName50=null;\r
-        Token Comma52=null;\r
-        SilkSchemaParser.indexTarget_return indexTarget51 = null;\r
+        Token On51=null;\r
+        Token Comma53=null;\r
+        SilkSchemaParser.indexTarget_return indexTarget52 = null;\r
 \r
-        SilkSchemaParser.indexTarget_return indexTarget53 = null;\r
+        SilkSchemaParser.indexTarget_return indexTarget54 = null;\r
 \r
 \r
         Object Index49_tree=null;\r
         Object QName50_tree=null;\r
-        Object Comma52_tree=null;\r
+        Object On51_tree=null;\r
+        Object Comma53_tree=null;\r
         RewriteRuleTokenStream stream_Index=new RewriteRuleTokenStream(adaptor,"token Index");\r
         RewriteRuleTokenStream stream_Comma=new RewriteRuleTokenStream(adaptor,"token Comma");\r
         RewriteRuleTokenStream stream_QName=new RewriteRuleTokenStream(adaptor,"token QName");\r
+        RewriteRuleTokenStream stream_On=new RewriteRuleTokenStream(adaptor,"token On");\r
         RewriteRuleSubtreeStream stream_indexTarget=new RewriteRuleSubtreeStream(adaptor,"rule indexTarget");\r
         try {\r
-            // SilkSchema.g:254:15: ( Index QName indexTarget ( Comma indexTarget )* -> ^( Index TypeName[$QName.text] ( indexTarget )+ ) )\r
-            // SilkSchema.g:254:17: Index QName indexTarget ( Comma indexTarget )*\r
+            // SilkSchema.g:255:15: ( Index QName On indexTarget ( Comma indexTarget )* -> ^( Index TypeName[$QName.text] ( indexTarget )+ ) )\r
+            // SilkSchema.g:255:17: Index QName On indexTarget ( Comma indexTarget )*\r
             {\r
-            Index49=(Token)match(input,Index,FOLLOW_Index_in_indexStatement1310);  \r
+            Index49=(Token)match(input,Index,FOLLOW_Index_in_indexStatement1316);  \r
             stream_Index.add(Index49);\r
 \r
-            QName50=(Token)match(input,QName,FOLLOW_QName_in_indexStatement1312);  \r
+            QName50=(Token)match(input,QName,FOLLOW_QName_in_indexStatement1318);  \r
             stream_QName.add(QName50);\r
 \r
-            pushFollow(FOLLOW_indexTarget_in_indexStatement1314);\r
-            indexTarget51=indexTarget();\r
+            On51=(Token)match(input,On,FOLLOW_On_in_indexStatement1320);  \r
+            stream_On.add(On51);\r
+\r
+            pushFollow(FOLLOW_indexTarget_in_indexStatement1322);\r
+            indexTarget52=indexTarget();\r
 \r
             state._fsp--;\r
 \r
-            stream_indexTarget.add(indexTarget51.getTree());\r
-            // SilkSchema.g:254:41: ( Comma indexTarget )*\r
+            stream_indexTarget.add(indexTarget52.getTree());\r
+            // SilkSchema.g:255:44: ( Comma indexTarget )*\r
             loop18:\r
             do {\r
                 int alt18=2;\r
@@ -1944,17 +1950,17 @@ public class SilkSchemaParser extends Parser {
 \r
                 switch (alt18) {\r
                case 1 :\r
-                   // SilkSchema.g:254:42: Comma indexTarget\r
+                   // SilkSchema.g:255:45: Comma indexTarget\r
                    {\r
-                   Comma52=(Token)match(input,Comma,FOLLOW_Comma_in_indexStatement1317);  \r
-                   stream_Comma.add(Comma52);\r
+                   Comma53=(Token)match(input,Comma,FOLLOW_Comma_in_indexStatement1325);  \r
+                   stream_Comma.add(Comma53);\r
 \r
-                   pushFollow(FOLLOW_indexTarget_in_indexStatement1319);\r
-                   indexTarget53=indexTarget();\r
+                   pushFollow(FOLLOW_indexTarget_in_indexStatement1327);\r
+                   indexTarget54=indexTarget();\r
 \r
                    state._fsp--;\r
 \r
-                   stream_indexTarget.add(indexTarget53.getTree());\r
+                   stream_indexTarget.add(indexTarget54.getTree());\r
 \r
                    }\r
                    break;\r
@@ -1977,9 +1983,9 @@ public class SilkSchemaParser extends Parser {
             RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"rule retval",retval!=null?retval.tree:null);\r
 \r
             root_0 = (Object)adaptor.nil();\r
-            // 255:3: -> ^( Index TypeName[$QName.text] ( indexTarget )+ )\r
+            // 256:3: -> ^( Index TypeName[$QName.text] ( indexTarget )+ )\r
             {\r
-                // SilkSchema.g:255:6: ^( Index TypeName[$QName.text] ( indexTarget )+ )\r
+                // SilkSchema.g:256:6: ^( Index TypeName[$QName.text] ( indexTarget )+ )\r
                 {\r
                 Object root_1 = (Object)adaptor.nil();\r
                 root_1 = (Object)adaptor.becomeRoot(stream_Index.nextNode(), root_1);\r
@@ -2026,24 +2032,24 @@ public class SilkSchemaParser extends Parser {
     };\r
 \r
     // $ANTLR start "indexTarget"\r
-    // SilkSchema.g:258:1: fragment indexTarget : Symbol -> Attribute[$Symbol.text] ;\r
+    // SilkSchema.g:259:1: fragment indexTarget : Symbol -> Attribute[$Symbol.text] ;\r
     public final SilkSchemaParser.indexTarget_return indexTarget() throws RecognitionException {\r
         SilkSchemaParser.indexTarget_return retval = new SilkSchemaParser.indexTarget_return();\r
         retval.start = input.LT(1);\r
 \r
         Object root_0 = null;\r
 \r
-        Token Symbol54=null;\r
+        Token Symbol55=null;\r
 \r
-        Object Symbol54_tree=null;\r
+        Object Symbol55_tree=null;\r
         RewriteRuleTokenStream stream_Symbol=new RewriteRuleTokenStream(adaptor,"token Symbol");\r
 \r
         try {\r
-            // SilkSchema.g:259:12: ( Symbol -> Attribute[$Symbol.text] )\r
-            // SilkSchema.g:259:14: Symbol\r
+            // SilkSchema.g:260:12: ( Symbol -> Attribute[$Symbol.text] )\r
+            // SilkSchema.g:260:14: Symbol\r
             {\r
-            Symbol54=(Token)match(input,Symbol,FOLLOW_Symbol_in_indexTarget1347);  \r
-            stream_Symbol.add(Symbol54);\r
+            Symbol55=(Token)match(input,Symbol,FOLLOW_Symbol_in_indexTarget1355);  \r
+            stream_Symbol.add(Symbol55);\r
 \r
 \r
 \r
@@ -2058,9 +2064,9 @@ public class SilkSchemaParser extends Parser {
             RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"rule retval",retval!=null?retval.tree:null);\r
 \r
             root_0 = (Object)adaptor.nil();\r
-            // 259:21: -> Attribute[$Symbol.text]\r
+            // 260:21: -> Attribute[$Symbol.text]\r
             {\r
-                adaptor.addChild(root_0, (Object)adaptor.create(Attribute, (Symbol54!=null?Symbol54.getText():null)));\r
+                adaptor.addChild(root_0, (Object)adaptor.create(Attribute, (Symbol55!=null?Symbol55.getText():null)));\r
 \r
             }\r
 \r
@@ -2091,33 +2097,33 @@ public class SilkSchemaParser extends Parser {
     };\r
 \r
     // $ANTLR start "attributes"\r
-    // SilkSchema.g:263:1: fragment attributes : attribute ( Comma attribute )* -> ( attribute )+ ;\r
+    // SilkSchema.g:264:1: fragment attributes : attribute ( Comma attribute )* -> ( attribute )+ ;\r
     public final SilkSchemaParser.attributes_return attributes() throws RecognitionException {\r
         SilkSchemaParser.attributes_return retval = new SilkSchemaParser.attributes_return();\r
         retval.start = input.LT(1);\r
 \r
         Object root_0 = null;\r
 \r
-        Token Comma56=null;\r
-        SilkSchemaParser.attribute_return attribute55 = null;\r
+        Token Comma57=null;\r
+        SilkSchemaParser.attribute_return attribute56 = null;\r
 \r
-        SilkSchemaParser.attribute_return attribute57 = null;\r
+        SilkSchemaParser.attribute_return attribute58 = null;\r
 \r
 \r
-        Object Comma56_tree=null;\r
+        Object Comma57_tree=null;\r
         RewriteRuleTokenStream stream_Comma=new RewriteRuleTokenStream(adaptor,"token Comma");\r
         RewriteRuleSubtreeStream stream_attribute=new RewriteRuleSubtreeStream(adaptor,"rule attribute");\r
         try {\r
-            // SilkSchema.g:264:11: ( attribute ( Comma attribute )* -> ( attribute )+ )\r
-            // SilkSchema.g:264:13: attribute ( Comma attribute )*\r
+            // SilkSchema.g:265:11: ( attribute ( Comma attribute )* -> ( attribute )+ )\r
+            // SilkSchema.g:265:13: attribute ( Comma attribute )*\r
             {\r
-            pushFollow(FOLLOW_attribute_in_attributes1367);\r
-            attribute55=attribute();\r
+            pushFollow(FOLLOW_attribute_in_attributes1375);\r
+            attribute56=attribute();\r
 \r
             state._fsp--;\r
 \r
-            stream_attribute.add(attribute55.getTree());\r
-            // SilkSchema.g:264:23: ( Comma attribute )*\r
+            stream_attribute.add(attribute56.getTree());\r
+            // SilkSchema.g:265:23: ( Comma attribute )*\r
             loop19:\r
             do {\r
                 int alt19=2;\r
@@ -2130,17 +2136,17 @@ public class SilkSchemaParser extends Parser {
 \r
                 switch (alt19) {\r
                case 1 :\r
-                   // SilkSchema.g:264:24: Comma attribute\r
+                   // SilkSchema.g:265:24: Comma attribute\r
                    {\r
-                   Comma56=(Token)match(input,Comma,FOLLOW_Comma_in_attributes1370);  \r
-                   stream_Comma.add(Comma56);\r
+                   Comma57=(Token)match(input,Comma,FOLLOW_Comma_in_attributes1378);  \r
+                   stream_Comma.add(Comma57);\r
 \r
-                   pushFollow(FOLLOW_attribute_in_attributes1372);\r
-                   attribute57=attribute();\r
+                   pushFollow(FOLLOW_attribute_in_attributes1380);\r
+                   attribute58=attribute();\r
 \r
                    state._fsp--;\r
 \r
-                   stream_attribute.add(attribute57.getTree());\r
+                   stream_attribute.add(attribute58.getTree());\r
 \r
                    }\r
                    break;\r
@@ -2163,7 +2169,7 @@ public class SilkSchemaParser extends Parser {
             RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"rule retval",retval!=null?retval.tree:null);\r
 \r
             root_0 = (Object)adaptor.nil();\r
-            // 265:3: -> ( attribute )+\r
+            // 266:3: -> ( attribute )+\r
             {\r
                 if ( !(stream_attribute.hasNext()) ) {\r
                     throw new RewriteEarlyExitException();\r
@@ -2203,34 +2209,34 @@ public class SilkSchemaParser extends Parser {
     };\r
 \r
     // $ANTLR start "attribute"\r
-    // SilkSchema.g:268:1: fragment attribute : Symbol ( attributeType )? ( Default attributeValue )? -> ^( Attribute Name[$Symbol.text] ( attributeType )? ( attributeValue )? ) ;\r
+    // SilkSchema.g:269:1: fragment attribute : Symbol ( attributeType )? ( Default attributeValue )? -> ^( Attribute Name[$Symbol.text] ( attributeType )? ( attributeValue )? ) ;\r
     public final SilkSchemaParser.attribute_return attribute() throws RecognitionException {\r
         SilkSchemaParser.attribute_return retval = new SilkSchemaParser.attribute_return();\r
         retval.start = input.LT(1);\r
 \r
         Object root_0 = null;\r
 \r
-        Token Symbol58=null;\r
-        Token Default60=null;\r
-        SilkSchemaParser.attributeType_return attributeType59 = null;\r
+        Token Symbol59=null;\r
+        Token Default61=null;\r
+        SilkSchemaParser.attributeType_return attributeType60 = null;\r
 \r
-        SilkSchemaParser.attributeValue_return attributeValue61 = null;\r
+        SilkSchemaParser.attributeValue_return attributeValue62 = null;\r
 \r
 \r
-        Object Symbol58_tree=null;\r
-        Object Default60_tree=null;\r
+        Object Symbol59_tree=null;\r
+        Object Default61_tree=null;\r
         RewriteRuleTokenStream stream_Symbol=new RewriteRuleTokenStream(adaptor,"token Symbol");\r
         RewriteRuleTokenStream stream_Default=new RewriteRuleTokenStream(adaptor,"token Default");\r
         RewriteRuleSubtreeStream stream_attributeValue=new RewriteRuleSubtreeStream(adaptor,"rule attributeValue");\r
         RewriteRuleSubtreeStream stream_attributeType=new RewriteRuleSubtreeStream(adaptor,"rule attributeType");\r
         try {\r
-            // SilkSchema.g:269:10: ( Symbol ( attributeType )? ( Default attributeValue )? -> ^( Attribute Name[$Symbol.text] ( attributeType )? ( attributeValue )? ) )\r
-            // SilkSchema.g:270:3: Symbol ( attributeType )? ( Default attributeValue )?\r
+            // SilkSchema.g:270:10: ( Symbol ( attributeType )? ( Default attributeValue )? -> ^( Attribute Name[$Symbol.text] ( attributeType )? ( attributeValue )? ) )\r
+            // SilkSchema.g:271:3: Symbol ( attributeType )? ( Default attributeValue )?\r
             {\r
-            Symbol58=(Token)match(input,Symbol,FOLLOW_Symbol_in_attribute1399);  \r
-            stream_Symbol.add(Symbol58);\r
+            Symbol59=(Token)match(input,Symbol,FOLLOW_Symbol_in_attribute1407);  \r
+            stream_Symbol.add(Symbol59);\r
 \r
-            // SilkSchema.g:270:10: ( attributeType )?\r
+            // SilkSchema.g:271:10: ( attributeType )?\r
             int alt20=2;\r
             int LA20_0 = input.LA(1);\r
 \r
@@ -2239,21 +2245,21 @@ public class SilkSchemaParser extends Parser {
             }\r
             switch (alt20) {\r
                 case 1 :\r
-                    // SilkSchema.g:270:10: attributeType\r
+                    // SilkSchema.g:271:10: attributeType\r
                     {\r
-                    pushFollow(FOLLOW_attributeType_in_attribute1401);\r
-                    attributeType59=attributeType();\r
+                    pushFollow(FOLLOW_attributeType_in_attribute1409);\r
+                    attributeType60=attributeType();\r
 \r
                     state._fsp--;\r
 \r
-                    stream_attributeType.add(attributeType59.getTree());\r
+                    stream_attributeType.add(attributeType60.getTree());\r
 \r
                     }\r
                     break;\r
 \r
             }\r
 \r
-            // SilkSchema.g:270:25: ( Default attributeValue )?\r
+            // SilkSchema.g:271:25: ( Default attributeValue )?\r
             int alt21=2;\r
             int LA21_0 = input.LA(1);\r
 \r
@@ -2262,17 +2268,17 @@ public class SilkSchemaParser extends Parser {
             }\r
             switch (alt21) {\r
                 case 1 :\r
-                    // SilkSchema.g:270:26: Default attributeValue\r
+                    // SilkSchema.g:271:26: Default attributeValue\r
                     {\r
-                    Default60=(Token)match(input,Default,FOLLOW_Default_in_attribute1405);  \r
-                    stream_Default.add(Default60);\r
+                    Default61=(Token)match(input,Default,FOLLOW_Default_in_attribute1413);  \r
+                    stream_Default.add(Default61);\r
 \r
-                    pushFollow(FOLLOW_attributeValue_in_attribute1407);\r
-                    attributeValue61=attributeValue();\r
+                    pushFollow(FOLLOW_attributeValue_in_attribute1415);\r
+                    attributeValue62=attributeValue();\r
 \r
                     state._fsp--;\r
 \r
-                    stream_attributeValue.add(attributeValue61.getTree());\r
+                    stream_attributeValue.add(attributeValue62.getTree());\r
 \r
                     }\r
                     break;\r
@@ -2292,21 +2298,21 @@ public class SilkSchemaParser extends Parser {
             RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"rule retval",retval!=null?retval.tree:null);\r
 \r
             root_0 = (Object)adaptor.nil();\r
-            // 271:3: -> ^( Attribute Name[$Symbol.text] ( attributeType )? ( attributeValue )? )\r
+            // 272:3: -> ^( Attribute Name[$Symbol.text] ( attributeType )? ( attributeValue )? )\r
             {\r
-                // SilkSchema.g:271:6: ^( Attribute Name[$Symbol.text] ( attributeType )? ( attributeValue )? )\r
+                // SilkSchema.g:272:6: ^( Attribute Name[$Symbol.text] ( attributeType )? ( attributeValue )? )\r
                 {\r
                 Object root_1 = (Object)adaptor.nil();\r
                 root_1 = (Object)adaptor.becomeRoot((Object)adaptor.create(Attribute, "Attribute"), root_1);\r
 \r
-                adaptor.addChild(root_1, (Object)adaptor.create(Name, (Symbol58!=null?Symbol58.getText():null)));\r
-                // SilkSchema.g:271:37: ( attributeType )?\r
+                adaptor.addChild(root_1, (Object)adaptor.create(Name, (Symbol59!=null?Symbol59.getText():null)));\r
+                // SilkSchema.g:272:37: ( attributeType )?\r
                 if ( stream_attributeType.hasNext() ) {\r
                     adaptor.addChild(root_1, stream_attributeType.nextTree());\r
 \r
                 }\r
                 stream_attributeType.reset();\r
-                // SilkSchema.g:271:52: ( attributeValue )?\r
+                // SilkSchema.g:272:52: ( attributeValue )?\r
                 if ( stream_attributeValue.hasNext() ) {\r
                     adaptor.addChild(root_1, stream_attributeValue.nextTree());\r
 \r
@@ -2345,29 +2351,29 @@ public class SilkSchemaParser extends Parser {
     };\r
 \r
     // $ANTLR start "attributeValue"\r
-    // SilkSchema.g:274:1: attributeValue : ( String | Double | Integer ) -> DefaultValue[$attributeValue.text] ;\r
+    // SilkSchema.g:275:1: attributeValue : ( String | Double | Integer ) -> DefaultValue[$attributeValue.text] ;\r
     public final SilkSchemaParser.attributeValue_return attributeValue() throws RecognitionException {\r
         SilkSchemaParser.attributeValue_return retval = new SilkSchemaParser.attributeValue_return();\r
         retval.start = input.LT(1);\r
 \r
         Object root_0 = null;\r
 \r
-        Token String62=null;\r
-        Token Double63=null;\r
-        Token Integer64=null;\r
+        Token String63=null;\r
+        Token Double64=null;\r
+        Token Integer65=null;\r
 \r
-        Object String62_tree=null;\r
-        Object Double63_tree=null;\r
-        Object Integer64_tree=null;\r
+        Object String63_tree=null;\r
+        Object Double64_tree=null;\r
+        Object Integer65_tree=null;\r
         RewriteRuleTokenStream stream_String=new RewriteRuleTokenStream(adaptor,"token String");\r
         RewriteRuleTokenStream stream_Integer=new RewriteRuleTokenStream(adaptor,"token Integer");\r
         RewriteRuleTokenStream stream_Double=new RewriteRuleTokenStream(adaptor,"token Double");\r
 \r
         try {\r
-            // SilkSchema.g:275:3: ( ( String | Double | Integer ) -> DefaultValue[$attributeValue.text] )\r
-            // SilkSchema.g:275:5: ( String | Double | Integer )\r
+            // SilkSchema.g:276:3: ( ( String | Double | Integer ) -> DefaultValue[$attributeValue.text] )\r
+            // SilkSchema.g:276:5: ( String | Double | Integer )\r
             {\r
-            // SilkSchema.g:275:5: ( String | Double | Integer )\r
+            // SilkSchema.g:276:5: ( String | Double | Integer )\r
             int alt22=3;\r
             switch ( input.LA(1) ) {\r
             case String:\r
@@ -2394,28 +2400,28 @@ public class SilkSchemaParser extends Parser {
 \r
             switch (alt22) {\r
                 case 1 :\r
-                    // SilkSchema.g:275:6: String\r
+                    // SilkSchema.g:276:6: String\r
                     {\r
-                    String62=(Token)match(input,String,FOLLOW_String_in_attributeValue1445);  \r
-                    stream_String.add(String62);\r
+                    String63=(Token)match(input,String,FOLLOW_String_in_attributeValue1453);  \r
+                    stream_String.add(String63);\r
 \r
 \r
                     }\r
                     break;\r
                 case 2 :\r
-                    // SilkSchema.g:275:15: Double\r
+                    // SilkSchema.g:276:15: Double\r
                     {\r
-                    Double63=(Token)match(input,Double,FOLLOW_Double_in_attributeValue1449);  \r
-                    stream_Double.add(Double63);\r
+                    Double64=(Token)match(input,Double,FOLLOW_Double_in_attributeValue1457);  \r
+                    stream_Double.add(Double64);\r
 \r
 \r
                     }\r
                     break;\r
                 case 3 :\r
-                    // SilkSchema.g:275:24: Integer\r
+                    // SilkSchema.g:276:24: Integer\r
                     {\r
-                    Integer64=(Token)match(input,Integer,FOLLOW_Integer_in_attributeValue1453);  \r
-                    stream_Integer.add(Integer64);\r
+                    Integer65=(Token)match(input,Integer,FOLLOW_Integer_in_attributeValue1461);  \r
+                    stream_Integer.add(Integer65);\r
 \r
 \r
                     }\r
@@ -2436,7 +2442,7 @@ public class SilkSchemaParser extends Parser {
             RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"rule retval",retval!=null?retval.tree:null);\r
 \r
             root_0 = (Object)adaptor.nil();\r
-            // 275:33: -> DefaultValue[$attributeValue.text]\r
+            // 276:33: -> DefaultValue[$attributeValue.text]\r
             {\r
                 adaptor.addChild(root_0, (Object)adaptor.create(DefaultValue, input.toString(retval.start,input.LT(-1))));\r
 \r
@@ -2469,25 +2475,25 @@ public class SilkSchemaParser extends Parser {
     };\r
 \r
     // $ANTLR start "attributeType"\r
-    // SilkSchema.g:277:10: fragment attributeType : ( QName -> TypeName[$QName.text] | QName Star -> TypeName[$QName.text] IsArray[\"true\"] );\r
+    // SilkSchema.g:278:10: fragment attributeType : ( QName -> TypeName[$QName.text] | QName Star -> TypeName[$QName.text] IsArray[\"true\"] );\r
     public final SilkSchemaParser.attributeType_return attributeType() throws RecognitionException {\r
         SilkSchemaParser.attributeType_return retval = new SilkSchemaParser.attributeType_return();\r
         retval.start = input.LT(1);\r
 \r
         Object root_0 = null;\r
 \r
-        Token QName65=null;\r
         Token QName66=null;\r
-        Token Star67=null;\r
+        Token QName67=null;\r
+        Token Star68=null;\r
 \r
-        Object QName65_tree=null;\r
         Object QName66_tree=null;\r
-        Object Star67_tree=null;\r
+        Object QName67_tree=null;\r
+        Object Star68_tree=null;\r
         RewriteRuleTokenStream stream_Star=new RewriteRuleTokenStream(adaptor,"token Star");\r
         RewriteRuleTokenStream stream_QName=new RewriteRuleTokenStream(adaptor,"token QName");\r
 \r
         try {\r
-            // SilkSchema.g:278:3: ( QName -> TypeName[$QName.text] | QName Star -> TypeName[$QName.text] IsArray[\"true\"] )\r
+            // SilkSchema.g:279:3: ( QName -> TypeName[$QName.text] | QName Star -> TypeName[$QName.text] IsArray[\"true\"] )\r
             int alt23=2;\r
             int LA23_0 = input.LA(1);\r
 \r
@@ -2515,10 +2521,10 @@ public class SilkSchemaParser extends Parser {
             }\r
             switch (alt23) {\r
                 case 1 :\r
-                    // SilkSchema.g:278:5: QName\r
+                    // SilkSchema.g:279:5: QName\r
                     {\r
-                    QName65=(Token)match(input,QName,FOLLOW_QName_in_attributeType1474);  \r
-                    stream_QName.add(QName65);\r
+                    QName66=(Token)match(input,QName,FOLLOW_QName_in_attributeType1482);  \r
+                    stream_QName.add(QName66);\r
 \r
 \r
 \r
@@ -2533,9 +2539,9 @@ public class SilkSchemaParser extends Parser {
                     RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"rule retval",retval!=null?retval.tree:null);\r
 \r
                     root_0 = (Object)adaptor.nil();\r
-                    // 278:11: -> TypeName[$QName.text]\r
+                    // 279:11: -> TypeName[$QName.text]\r
                     {\r
-                        adaptor.addChild(root_0, (Object)adaptor.create(TypeName, (QName65!=null?QName65.getText():null)));\r
+                        adaptor.addChild(root_0, (Object)adaptor.create(TypeName, (QName66!=null?QName66.getText():null)));\r
 \r
                     }\r
 \r
@@ -2543,13 +2549,13 @@ public class SilkSchemaParser extends Parser {
                     }\r
                     break;\r
                 case 2 :\r
-                    // SilkSchema.g:279:5: QName Star\r
+                    // SilkSchema.g:280:5: QName Star\r
                     {\r
-                    QName66=(Token)match(input,QName,FOLLOW_QName_in_attributeType1486);  \r
-                    stream_QName.add(QName66);\r
+                    QName67=(Token)match(input,QName,FOLLOW_QName_in_attributeType1494);  \r
+                    stream_QName.add(QName67);\r
 \r
-                    Star67=(Token)match(input,Star,FOLLOW_Star_in_attributeType1488);  \r
-                    stream_Star.add(Star67);\r
+                    Star68=(Token)match(input,Star,FOLLOW_Star_in_attributeType1496);  \r
+                    stream_Star.add(Star68);\r
 \r
 \r
 \r
@@ -2564,9 +2570,9 @@ public class SilkSchemaParser extends Parser {
                     RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"rule retval",retval!=null?retval.tree:null);\r
 \r
                     root_0 = (Object)adaptor.nil();\r
-                    // 279:16: -> TypeName[$QName.text] IsArray[\"true\"]\r
+                    // 280:16: -> TypeName[$QName.text] IsArray[\"true\"]\r
                     {\r
-                        adaptor.addChild(root_0, (Object)adaptor.create(TypeName, (QName66!=null?QName66.getText():null)));\r
+                        adaptor.addChild(root_0, (Object)adaptor.create(TypeName, (QName67!=null?QName67.getText():null)));\r
                         adaptor.addChild(root_0, (Object)adaptor.create(IsArray, "true"));\r
 \r
                     }\r
@@ -2599,74 +2605,75 @@ public class SilkSchemaParser extends Parser {
 \r
  \r
 \r
-    public static final BitSet FOLLOW_Preamble_in_schema873 = new BitSet(new long[]{0x2089000000000002L});\r
-    public static final BitSet FOLLOW_schemaElement_in_schema876 = new BitSet(new long[]{0x2089000000000002L});\r
-    public static final BitSet FOLLOW_classDefinition_in_schemaElement904 = new BitSet(new long[]{0x0000000000000002L});\r
-    public static final BitSet FOLLOW_projectionDef_in_schemaElement911 = new BitSet(new long[]{0x0000000000000002L});\r
-    public static final BitSet FOLLOW_moduleDefinition_in_schemaElement917 = new BitSet(new long[]{0x0000000000000002L});\r
-    public static final BitSet FOLLOW_ModuleDef_in_moduleDefinition929 = new BitSet(new long[]{0x208D000000000000L});\r
-    public static final BitSet FOLLOW_schemaElement_in_moduleDefinition931 = new BitSet(new long[]{0x208D000000000000L});\r
-    public static final BitSet FOLLOW_End_in_moduleDefinition934 = new BitSet(new long[]{0x0000000000000002L});\r
-    public static final BitSet FOLLOW_Class_in_classDefinition966 = new BitSet(new long[]{0x0000000000000000L,0x0000000000000001L});\r
-    public static final BitSet FOLLOW_QName_in_classDefinition968 = new BitSet(new long[]{0x0036804000000000L});\r
-    public static final BitSet FOLLOW_inheritance_in_classDefinition970 = new BitSet(new long[]{0x0036800000000000L});\r
-    public static final BitSet FOLLOW_classBody_in_classDefinition973 = new BitSet(new long[]{0x0004000000000000L});\r
-    public static final BitSet FOLLOW_End_in_classDefinition976 = new BitSet(new long[]{0x0000000000000002L});\r
-    public static final BitSet FOLLOW_Relation_in_classDefinition999 = new BitSet(new long[]{0x0000000000000000L,0x0000000000000001L});\r
-    public static final BitSet FOLLOW_QName_in_classDefinition1001 = new BitSet(new long[]{0x0036804000000000L});\r
-    public static final BitSet FOLLOW_inheritance_in_classDefinition1003 = new BitSet(new long[]{0x0036800000000000L});\r
-    public static final BitSet FOLLOW_classBody_in_classDefinition1006 = new BitSet(new long[]{0x0004000000000000L});\r
-    public static final BitSet FOLLOW_End_in_classDefinition1009 = new BitSet(new long[]{0x0000000000000002L});\r
-    public static final BitSet FOLLOW_belongsToStatement_in_classBody1038 = new BitSet(new long[]{0x0032800000000002L});\r
-    public static final BitSet FOLLOW_includeStatement_in_classBody1042 = new BitSet(new long[]{0x0032800000000002L});\r
-    public static final BitSet FOLLOW_attributes_in_classBody1046 = new BitSet(new long[]{0x0032800000000002L});\r
-    public static final BitSet FOLLOW_indexStatement_in_classBody1050 = new BitSet(new long[]{0x0032800000000002L});\r
-    public static final BitSet FOLLOW_Projection_in_projectionDef1060 = new BitSet(new long[]{0x0000000000000000L,0x0000000000000001L});\r
-    public static final BitSet FOLLOW_QName_in_projectionDef1064 = new BitSet(new long[]{0x0000000000000000L,0x0000000000000002L});\r
-    public static final BitSet FOLLOW_65_in_projectionDef1066 = new BitSet(new long[]{0x0000000000000000L,0x0000000000000001L});\r
-    public static final BitSet FOLLOW_QName_in_projectionDef1070 = new BitSet(new long[]{0x0000880000000000L,0x0000000000000001L});\r
-    public static final BitSet FOLLOW_projectColumn_in_projectionDef1073 = new BitSet(new long[]{0x0104890000000000L,0x0000000000000001L});\r
-    public static final BitSet FOLLOW_Comma_in_projectionDef1076 = new BitSet(new long[]{0x0000880000000000L,0x0000000000000001L});\r
-    public static final BitSet FOLLOW_projectColumn_in_projectionDef1079 = new BitSet(new long[]{0x0104890000000000L,0x0000000000000001L});\r
-    public static final BitSet FOLLOW_orderByColumns_in_projectionDef1084 = new BitSet(new long[]{0x0004000000000000L});\r
-    public static final BitSet FOLLOW_End_in_projectionDef1087 = new BitSet(new long[]{0x0000000000000002L});\r
-    public static final BitSet FOLLOW_QName_in_projectColumn1119 = new BitSet(new long[]{0x0000000000000002L});\r
-    public static final BitSet FOLLOW_Star_in_projectColumn1131 = new BitSet(new long[]{0x0000000000000002L});\r
-    public static final BitSet FOLLOW_Symbol_in_projectColumn1143 = new BitSet(new long[]{0x0000000000000002L});\r
-    public static final BitSet FOLLOW_OrderBy_in_orderByColumns1161 = new BitSet(new long[]{0x0000800000000000L,0x0000000000000001L});\r
-    public static final BitSet FOLLOW_orderByItem_in_orderByColumns1163 = new BitSet(new long[]{0x0000010000000002L});\r
-    public static final BitSet FOLLOW_Comma_in_orderByColumns1166 = new BitSet(new long[]{0x0000800000000000L,0x0000000000000001L});\r
-    public static final BitSet FOLLOW_orderByItem_in_orderByColumns1168 = new BitSet(new long[]{0x0000010000000002L});\r
-    public static final BitSet FOLLOW_QName_in_orderByItem1188 = new BitSet(new long[]{0x0000000000000002L});\r
-    public static final BitSet FOLLOW_Symbol_in_orderByItem1200 = new BitSet(new long[]{0x0000000000000002L});\r
-    public static final BitSet FOLLOW_Symbol_in_functionArg1216 = new BitSet(new long[]{0x0000000000000002L});\r
-    public static final BitSet FOLLOW_BelongsTo_in_belongsToStatement1232 = new BitSet(new long[]{0x0000000000000000L,0x0000000000000001L});\r
-    public static final BitSet FOLLOW_QName_in_belongsToStatement1234 = new BitSet(new long[]{0x0000000000000002L});\r
-    public static final BitSet FOLLOW_Lt_in_inheritance1252 = new BitSet(new long[]{0x0000000000000000L,0x0000000000000001L});\r
-    public static final BitSet FOLLOW_QName_in_inheritance1254 = new BitSet(new long[]{0x0000000000000002L});\r
-    public static final BitSet FOLLOW_Includes_in_includeStatement1271 = new BitSet(new long[]{0x0000000000000000L,0x0000000000000001L});\r
-    public static final BitSet FOLLOW_includeItem_in_includeStatement1273 = new BitSet(new long[]{0x0000010000000002L});\r
-    public static final BitSet FOLLOW_Comma_in_includeStatement1276 = new BitSet(new long[]{0x0000000000000000L,0x0000000000000001L});\r
-    public static final BitSet FOLLOW_includeItem_in_includeStatement1278 = new BitSet(new long[]{0x0000010000000002L});\r
-    public static final BitSet FOLLOW_QName_in_includeItem1295 = new BitSet(new long[]{0x0000000000000002L});\r
-    public static final BitSet FOLLOW_Index_in_indexStatement1310 = new BitSet(new long[]{0x0000000000000000L,0x0000000000000001L});\r
-    public static final BitSet FOLLOW_QName_in_indexStatement1312 = new BitSet(new long[]{0x0000800000000000L});\r
-    public static final BitSet FOLLOW_indexTarget_in_indexStatement1314 = new BitSet(new long[]{0x0000010000000002L});\r
-    public static final BitSet FOLLOW_Comma_in_indexStatement1317 = new BitSet(new long[]{0x0000800000000000L});\r
-    public static final BitSet FOLLOW_indexTarget_in_indexStatement1319 = new BitSet(new long[]{0x0000010000000002L});\r
-    public static final BitSet FOLLOW_Symbol_in_indexTarget1347 = new BitSet(new long[]{0x0000000000000002L});\r
-    public static final BitSet FOLLOW_attribute_in_attributes1367 = new BitSet(new long[]{0x0000010000000002L});\r
-    public static final BitSet FOLLOW_Comma_in_attributes1370 = new BitSet(new long[]{0x0000800000000000L});\r
-    public static final BitSet FOLLOW_attribute_in_attributes1372 = new BitSet(new long[]{0x0000010000000002L});\r
-    public static final BitSet FOLLOW_Symbol_in_attribute1399 = new BitSet(new long[]{0x0040000000000002L,0x0000000000000001L});\r
-    public static final BitSet FOLLOW_attributeType_in_attribute1401 = new BitSet(new long[]{0x0040000000000002L});\r
-    public static final BitSet FOLLOW_Default_in_attribute1405 = new BitSet(new long[]{0x0000000260000000L});\r
-    public static final BitSet FOLLOW_attributeValue_in_attribute1407 = new BitSet(new long[]{0x0000000000000002L});\r
-    public static final BitSet FOLLOW_String_in_attributeValue1445 = new BitSet(new long[]{0x0000000000000002L});\r
-    public static final BitSet FOLLOW_Double_in_attributeValue1449 = new BitSet(new long[]{0x0000000000000002L});\r
-    public static final BitSet FOLLOW_Integer_in_attributeValue1453 = new BitSet(new long[]{0x0000000000000002L});\r
-    public static final BitSet FOLLOW_QName_in_attributeType1474 = new BitSet(new long[]{0x0000000000000002L});\r
-    public static final BitSet FOLLOW_QName_in_attributeType1486 = new BitSet(new long[]{0x0000080000000000L});\r
-    public static final BitSet FOLLOW_Star_in_attributeType1488 = new BitSet(new long[]{0x0000000000000002L});\r
+    public static final BitSet FOLLOW_Preamble_in_schema879 = new BitSet(new long[]{0x4089000000000002L});\r
+    public static final BitSet FOLLOW_schemaElement_in_schema882 = new BitSet(new long[]{0x4089000000000002L});\r
+    public static final BitSet FOLLOW_classDefinition_in_schemaElement910 = new BitSet(new long[]{0x0000000000000002L});\r
+    public static final BitSet FOLLOW_projectionDef_in_schemaElement917 = new BitSet(new long[]{0x0000000000000002L});\r
+    public static final BitSet FOLLOW_moduleDefinition_in_schemaElement923 = new BitSet(new long[]{0x0000000000000002L});\r
+    public static final BitSet FOLLOW_ModuleDef_in_moduleDefinition935 = new BitSet(new long[]{0x408D000000000000L});\r
+    public static final BitSet FOLLOW_schemaElement_in_moduleDefinition937 = new BitSet(new long[]{0x408D000000000000L});\r
+    public static final BitSet FOLLOW_End_in_moduleDefinition940 = new BitSet(new long[]{0x0000000000000002L});\r
+    public static final BitSet FOLLOW_Class_in_classDefinition972 = new BitSet(new long[]{0x0000000000000000L,0x0000000000000002L});\r
+    public static final BitSet FOLLOW_QName_in_classDefinition974 = new BitSet(new long[]{0x0036804000000000L});\r
+    public static final BitSet FOLLOW_inheritance_in_classDefinition976 = new BitSet(new long[]{0x0036800000000000L});\r
+    public static final BitSet FOLLOW_classBody_in_classDefinition979 = new BitSet(new long[]{0x0004000000000000L});\r
+    public static final BitSet FOLLOW_End_in_classDefinition982 = new BitSet(new long[]{0x0000000000000002L});\r
+    public static final BitSet FOLLOW_Relation_in_classDefinition1005 = new BitSet(new long[]{0x0000000000000000L,0x0000000000000002L});\r
+    public static final BitSet FOLLOW_QName_in_classDefinition1007 = new BitSet(new long[]{0x0036804000000000L});\r
+    public static final BitSet FOLLOW_inheritance_in_classDefinition1009 = new BitSet(new long[]{0x0036800000000000L});\r
+    public static final BitSet FOLLOW_classBody_in_classDefinition1012 = new BitSet(new long[]{0x0004000000000000L});\r
+    public static final BitSet FOLLOW_End_in_classDefinition1015 = new BitSet(new long[]{0x0000000000000002L});\r
+    public static final BitSet FOLLOW_belongsToStatement_in_classBody1044 = new BitSet(new long[]{0x0032800000000002L});\r
+    public static final BitSet FOLLOW_includeStatement_in_classBody1048 = new BitSet(new long[]{0x0032800000000002L});\r
+    public static final BitSet FOLLOW_attributes_in_classBody1052 = new BitSet(new long[]{0x0032800000000002L});\r
+    public static final BitSet FOLLOW_indexStatement_in_classBody1056 = new BitSet(new long[]{0x0032800000000002L});\r
+    public static final BitSet FOLLOW_Projection_in_projectionDef1066 = new BitSet(new long[]{0x0000000000000000L,0x0000000000000002L});\r
+    public static final BitSet FOLLOW_QName_in_projectionDef1070 = new BitSet(new long[]{0x0200000000000000L});\r
+    public static final BitSet FOLLOW_On_in_projectionDef1072 = new BitSet(new long[]{0x0000000000000000L,0x0000000000000002L});\r
+    public static final BitSet FOLLOW_QName_in_projectionDef1076 = new BitSet(new long[]{0x0000880000000000L,0x0000000000000002L});\r
+    public static final BitSet FOLLOW_projectColumn_in_projectionDef1079 = new BitSet(new long[]{0x0104890000000000L,0x0000000000000002L});\r
+    public static final BitSet FOLLOW_Comma_in_projectionDef1082 = new BitSet(new long[]{0x0000880000000000L,0x0000000000000002L});\r
+    public static final BitSet FOLLOW_projectColumn_in_projectionDef1085 = new BitSet(new long[]{0x0104890000000000L,0x0000000000000002L});\r
+    public static final BitSet FOLLOW_orderByColumns_in_projectionDef1090 = new BitSet(new long[]{0x0004000000000000L});\r
+    public static final BitSet FOLLOW_End_in_projectionDef1093 = new BitSet(new long[]{0x0000000000000002L});\r
+    public static final BitSet FOLLOW_QName_in_projectColumn1125 = new BitSet(new long[]{0x0000000000000002L});\r
+    public static final BitSet FOLLOW_Star_in_projectColumn1137 = new BitSet(new long[]{0x0000000000000002L});\r
+    public static final BitSet FOLLOW_Symbol_in_projectColumn1149 = new BitSet(new long[]{0x0000000000000002L});\r
+    public static final BitSet FOLLOW_OrderBy_in_orderByColumns1167 = new BitSet(new long[]{0x0000800000000000L,0x0000000000000002L});\r
+    public static final BitSet FOLLOW_orderByItem_in_orderByColumns1169 = new BitSet(new long[]{0x0000010000000002L});\r
+    public static final BitSet FOLLOW_Comma_in_orderByColumns1172 = new BitSet(new long[]{0x0000800000000000L,0x0000000000000002L});\r
+    public static final BitSet FOLLOW_orderByItem_in_orderByColumns1174 = new BitSet(new long[]{0x0000010000000002L});\r
+    public static final BitSet FOLLOW_QName_in_orderByItem1194 = new BitSet(new long[]{0x0000000000000002L});\r
+    public static final BitSet FOLLOW_Symbol_in_orderByItem1206 = new BitSet(new long[]{0x0000000000000002L});\r
+    public static final BitSet FOLLOW_Symbol_in_functionArg1222 = new BitSet(new long[]{0x0000000000000002L});\r
+    public static final BitSet FOLLOW_BelongsTo_in_belongsToStatement1238 = new BitSet(new long[]{0x0000000000000000L,0x0000000000000002L});\r
+    public static final BitSet FOLLOW_QName_in_belongsToStatement1240 = new BitSet(new long[]{0x0000000000000002L});\r
+    public static final BitSet FOLLOW_Lt_in_inheritance1258 = new BitSet(new long[]{0x0000000000000000L,0x0000000000000002L});\r
+    public static final BitSet FOLLOW_QName_in_inheritance1260 = new BitSet(new long[]{0x0000000000000002L});\r
+    public static final BitSet FOLLOW_Includes_in_includeStatement1277 = new BitSet(new long[]{0x0000000000000000L,0x0000000000000002L});\r
+    public static final BitSet FOLLOW_includeItem_in_includeStatement1279 = new BitSet(new long[]{0x0000010000000002L});\r
+    public static final BitSet FOLLOW_Comma_in_includeStatement1282 = new BitSet(new long[]{0x0000000000000000L,0x0000000000000002L});\r
+    public static final BitSet FOLLOW_includeItem_in_includeStatement1284 = new BitSet(new long[]{0x0000010000000002L});\r
+    public static final BitSet FOLLOW_QName_in_includeItem1301 = new BitSet(new long[]{0x0000000000000002L});\r
+    public static final BitSet FOLLOW_Index_in_indexStatement1316 = new BitSet(new long[]{0x0000000000000000L,0x0000000000000002L});\r
+    public static final BitSet FOLLOW_QName_in_indexStatement1318 = new BitSet(new long[]{0x0200000000000000L});\r
+    public static final BitSet FOLLOW_On_in_indexStatement1320 = new BitSet(new long[]{0x0000800000000000L});\r
+    public static final BitSet FOLLOW_indexTarget_in_indexStatement1322 = new BitSet(new long[]{0x0000010000000002L});\r
+    public static final BitSet FOLLOW_Comma_in_indexStatement1325 = new BitSet(new long[]{0x0000800000000000L});\r
+    public static final BitSet FOLLOW_indexTarget_in_indexStatement1327 = new BitSet(new long[]{0x0000010000000002L});\r
+    public static final BitSet FOLLOW_Symbol_in_indexTarget1355 = new BitSet(new long[]{0x0000000000000002L});\r
+    public static final BitSet FOLLOW_attribute_in_attributes1375 = new BitSet(new long[]{0x0000010000000002L});\r
+    public static final BitSet FOLLOW_Comma_in_attributes1378 = new BitSet(new long[]{0x0000800000000000L});\r
+    public static final BitSet FOLLOW_attribute_in_attributes1380 = new BitSet(new long[]{0x0000010000000002L});\r
+    public static final BitSet FOLLOW_Symbol_in_attribute1407 = new BitSet(new long[]{0x0040000000000002L,0x0000000000000002L});\r
+    public static final BitSet FOLLOW_attributeType_in_attribute1409 = new BitSet(new long[]{0x0040000000000002L});\r
+    public static final BitSet FOLLOW_Default_in_attribute1413 = new BitSet(new long[]{0x0000000260000000L});\r
+    public static final BitSet FOLLOW_attributeValue_in_attribute1415 = new BitSet(new long[]{0x0000000000000002L});\r
+    public static final BitSet FOLLOW_String_in_attributeValue1453 = new BitSet(new long[]{0x0000000000000002L});\r
+    public static final BitSet FOLLOW_Double_in_attributeValue1457 = new BitSet(new long[]{0x0000000000000002L});\r
+    public static final BitSet FOLLOW_Integer_in_attributeValue1461 = new BitSet(new long[]{0x0000000000000002L});\r
+    public static final BitSet FOLLOW_QName_in_attributeType1482 = new BitSet(new long[]{0x0000000000000002L});\r
+    public static final BitSet FOLLOW_QName_in_attributeType1494 = new BitSet(new long[]{0x0000080000000000L});\r
+    public static final BitSet FOLLOW_Star_in_attributeType1496 = new BitSet(new long[]{0x0000000000000002L});\r
 \r
 }
\ No newline at end of file
index bd1a075..d7dacc8 100644 (file)
@@ -39,58 +39,41 @@ public enum BeanErrorCode implements ErrorCode {
     NoMoreSubtree,
 
     // XML
-    InvalidXMLData,
-    ParserError,
-    UnsupportedXMLDataType,
+    InvalidXMLData, ParserError, UnsupportedXMLDataType,
 
     // JSON
-    InvalidJSONData,
-    InvalidJSONArray,
+    InvalidJSONData, InvalidJSONArray,
 
     UnsupportedDataType,
 
     // Bean class
-    InvalidBeanClass,
-    IllegalArgument,
-    IllegalAccess,
-    NoPublicConstructor,
-    InstantiationFailure,
-    InvalidNumberFormat,
-    InvocationTargetException,
+    InvalidBeanClass, IllegalArgument, IllegalAccess, NoPublicConstructor, InstantiationFailure, InvalidNumberFormat, InvocationTargetException,
 
     BeanObjectIsNull,
 
     // binder
-    GetterCannotBeUsedToBindData,
-    BindFailure,
-    UnknownBeanUpdator,
-    InvalidKeyAndValuePair,
-    MapContainerIsNotFound,
-    MapElementConstructionFailed,
-    InvalidDateFormat,
-    InvalidFormat,
-    InvalidType;
+    GetterCannotBeUsedToBindData, BindFailure, UnknownBeanUpdator, InvalidKeyAndValuePair, MapContainerIsNotFound, MapElementConstructionFailed, InvalidDateFormat, InvalidFormat, InvalidType;
 
     private final String description;
 
-    BeanErrorCode(String description)
-    {
+    BeanErrorCode(String description) {
         this.description = description;
     }
 
-    BeanErrorCode()
-    {
+    BeanErrorCode() {
         this.description = EMPTY_DESCRIPTION;
     }
 
-    public String getCodeName()
-    {
+    public String getCodeName() {
         return name();
     }
 
-    public String getDescription()
-    {
+    public String getDescription() {
         return description;
     }
 
+    public Enum< ? > getCode() {
+        return this;
+    }
+
 }
index af4a8ff..8d05dec 100644 (file)
@@ -47,7 +47,7 @@ public @interface Argument {
     /**
      * This argument is required or not
      */
-    boolean required() default true;
+    boolean required() default false;
 
     /**
      * argument index (0-origin) among the arguments without option prefix, "-"
index 6998a6f..45b6d33 100644 (file)
@@ -35,13 +35,11 @@ import org.xerial.util.bean.TypeInfo;
  * @author leo
  * 
  */
-public class OptionItem
-{
-    private final Option       optionDescriptor;
+public class OptionItem {
+    private final Option optionDescriptor;
     private final OptionSetter optionSetter;
 
-    public OptionItem(Method method)
-    {
+    public OptionItem(Method method) {
         Option option = method.getAnnotation(Option.class);
         if (option == null)
             throw new IllegalArgumentException(method + " is not an option item");
@@ -50,8 +48,7 @@ public class OptionItem
         this.optionSetter = new OptionSetterViaMethod(method);
     }
 
-    public OptionItem(Field field)
-    {
+    public OptionItem(Field field) {
         Option option = field.getAnnotation(Option.class);
         if (option == null)
             throw new IllegalArgumentException(field + " is not an option item");
@@ -61,10 +58,8 @@ public class OptionItem
     }
 
     @Override
-    public boolean equals(Object obj)
-    {
-        if (obj instanceof OptionItem)
-        {
+    public boolean equals(Object obj) {
+        if (obj instanceof OptionItem) {
             OptionItem other = (OptionItem) obj;
             return optionDescriptor.equals(other.optionDescriptor);
         }
@@ -73,38 +68,31 @@ public class OptionItem
     }
 
     @Override
-    public int hashCode()
-    {
+    public int hashCode() {
         return optionDescriptor.hashCode();
     }
 
-    public boolean needsArgument()
-    {
+    public boolean needsArgument() {
         return optionSetter.takesArgument();
     }
 
-    public boolean hasSymbol()
-    {
+    public boolean hasSymbol() {
         return optionDescriptor.symbol() != null && optionDescriptor.symbol().length() > 0;
     }
 
-    public boolean hasLongName()
-    {
+    public boolean hasLongName() {
         return optionDescriptor.longName() != null && optionDescriptor.longName().length() > 0;
     }
 
-    public Option getOption()
-    {
+    public Option getOption() {
         return optionDescriptor;
     }
 
-    public boolean takesMultipleArguments()
-    {
+    public boolean takesMultipleArguments() {
         return TypeInfo.isCollection(optionSetter.getOptionDataType());
     }
 
-    public void setOption(Object bean, String value) throws OptionParserException
-    {
+    public void setOption(Object bean, String value) throws OptionParserException {
         optionSetter.setOption(bean, value);
 
         //        Class< ? > optionType = optionSetter.getOptionDataType();
@@ -120,15 +108,13 @@ public class OptionItem
 
     }
 
-    public void initialize(Object optionHolder) throws OptionParserException
-    {
+    public void initialize(Object optionHolder) throws OptionParserException {
         optionSetter.initialize(optionHolder);
     }
 
     @Override
-    public String toString()
-    {
-        return String.format("symbol=%s, longName=%s, description=%s", optionDescriptor.symbol(), optionDescriptor
+    public String toString() {
+        return String.format("-%s, --%s :%s", optionDescriptor.symbol(), optionDescriptor
                 .longName(), optionDescriptor.description());
     }
 }
index b04db6a..be7be3a 100644 (file)
@@ -31,7 +31,11 @@ import java.util.ArrayList;
 import java.util.HashSet;
 import java.util.List;
 
+import org.xerial.core.XerialError;
 import org.xerial.core.XerialErrorCode;
+import org.xerial.util.bean.BeanErrorCode;
+import org.xerial.util.bean.BeanException;
+import org.xerial.util.bean.TypeInfo;
 
 /**
  * A command-line option and argument parser
@@ -39,8 +43,7 @@ import org.xerial.core.XerialErrorCode;
  * @author leo
  * 
  */
-public class OptionParser
-{
+public class OptionParser {
     private final OptionSchema schema;
     private final Object optionHolder;
 
@@ -49,44 +52,53 @@ public class OptionParser
     private HashSet<Argument> activatedArgument = new HashSet<Argument>();
     private List<String> unusedArgument = new ArrayList<String>();
 
-    public <T> OptionParser(T optionHolder)
-    {
+    public <T> OptionParser(T optionHolder) {
         this.optionHolder = optionHolder;
         schema = OptionSchema.newOptionSchema(optionHolder);
     }
 
-    OptionItem findOptionItem(OptionSchema schema, String optionName) throws OptionParserException
-    {
+    public <T> OptionParser(Class<T> optionHolderType) {
+        try {
+            this.optionHolder = TypeInfo.createInstance(optionHolderType);
+        }
+        catch (BeanException e) {
+            throw new XerialError(XerialErrorCode.INVALID_ARGUMENT, e);
+        }
+
+        schema = OptionSchema.newOptionSchema(optionHolder);
+    }
+
+    @SuppressWarnings("unchecked")
+    public <T> T getOptionHolder() {
+        return (T) optionHolder;
+    }
+
+    OptionItem findOptionItem(OptionSchema schema, String optionName) throws OptionParserException {
         OptionItem optionItem = schema.getOption(optionName);
-        if (optionItem == null)
-        {
-            if (!ignoreUnknownOption)
-            {
-                throw new OptionParserException(XerialErrorCode.SYNTAX_ERROR, "unknown option: " + optionName);
+        if (optionItem == null) {
+            if (!ignoreUnknownOption) {
+                throw new OptionParserException(XerialErrorCode.SYNTAX_ERROR, "unknown option: "
+                        + optionName);
             }
         }
         return optionItem;
     }
 
-    public void printUsage()
-    {
+    public void printUsage() {
         printUsage(System.out);
     }
 
-    public void printUsage(Writer out)
-    {
+    public void printUsage(Writer out) {
         assert schema != null;
         schema.printUsage(out);
     }
 
-    public void printUsage(OutputStream out)
-    {
+    public void printUsage(OutputStream out) {
         assert schema != null;
         schema.printUsage(out);
     }
 
-    public String getUsage()
-    {
+    public String getUsage() {
         StringWriter buf = new StringWriter();
         printUsage(buf);
         return buf.toString();
@@ -98,8 +110,7 @@ public class OptionParser
      * 
      * @return
      */
-    public String[] getUnusedArguments()
-    {
+    public String[] getUnusedArguments() {
         String[] result = new String[unusedArgument.size()];
         for (int i = 0; i < unusedArgument.size(); ++i)
             result[i] = unusedArgument.get(i);
@@ -117,8 +128,7 @@ public class OptionParser
      *            options are found.
      * @throws OptionParserException
      */
-    public void parse(String[] args, boolean ignoreUnknownOption) throws OptionParserException
-    {
+    public void parse(String[] args, boolean ignoreUnknownOption) throws OptionParserException {
         setIgnoreUnknownOption(ignoreUnknownOption);
         parse(args);
     }
@@ -130,40 +140,33 @@ public class OptionParser
      * @param args
      * @throws OptionParserException
      */
-    public void parse(String[] args) throws OptionParserException
-    {
+    public void parse(String[] args) throws OptionParserException {
         // clear
         unusedArgument.clear();
         activatedOption.clear();
         activatedArgument.clear();
 
         // initialize collections in the OptionHolder
-        for (OptionItem each : schema.getOptionItemList())
-        {
+        for (OptionItem each : schema.getOptionItemList()) {
             each.initialize(optionHolder);
         }
-        for (ArgumentItem each : schema.getArgumentItemList())
-        {
+        for (ArgumentItem each : schema.getArgumentItemList()) {
             each.initialize(optionHolder);
         }
 
         int index = 0; // index in the args array
         int argIndex = 0; // argument index
-        for (; index < args.length; index++)
-        {
+        for (; index < args.length; index++) {
             String currentArg = args[index];
 
-            if (currentArg.startsWith("--"))
-            {
+            if (currentArg.startsWith("--")) {
                 // long name option
                 int splitPos = currentArg.indexOf('=');
-                if (splitPos == -1)
-                {
+                if (splitPos == -1) {
                     // no value is found
                     String longOptionName = currentArg.substring(2);
                     OptionItem optionItem = findOptionItem(schema, longOptionName);
-                    if (optionItem == null)
-                    {
+                    if (optionItem == null) {
                         unusedArgument.add(currentArg);
                         continue;
                     }
@@ -174,91 +177,89 @@ public class OptionParser
 
                     optionItem.setOption(optionHolder, "true");
 
-                    if (!optionItem.takesMultipleArguments() && activatedOption.contains(optionItem.getOption()))
-                        throw new OptionParserException(XerialErrorCode.DUPLICATE_OPTION, optionItem.getOption()
-                                .toString());
+                    if (!optionItem.takesMultipleArguments()
+                            && activatedOption.contains(optionItem.getOption()))
+                        throw new OptionParserException(XerialErrorCode.DUPLICATE_OPTION,
+                                optionItem.getOption().toString());
 
                     activatedOption.add(optionItem.getOption());
                 }
-                else
-                {
+                else {
                     // option is a (key, value) pair
                     String longOptionName = currentArg.substring(2, splitPos);
                     String value = currentArg.substring(splitPos + 1);
                     OptionItem optionItem = findOptionItem(schema, longOptionName);
-                    if (optionItem == null)
-                    {
+                    if (optionItem == null) {
                         unusedArgument.add(currentArg);
                         continue;
                     }
 
-                    if (!optionItem.needsArgument())
-                    {
-                        throw new OptionParserException(XerialErrorCode.SYNTAX_ERROR, "syntax error --"
-                                + longOptionName);
+                    if (!optionItem.needsArgument()) {
+                        throw new OptionParserException(XerialErrorCode.SYNTAX_ERROR,
+                                "syntax error --" + longOptionName);
                     }
 
                     optionItem.setOption(optionHolder, value);
-                    if (!optionItem.takesMultipleArguments() && activatedOption.contains(optionItem.getOption()))
-                        throw new OptionParserException(XerialErrorCode.DUPLICATE_OPTION, optionItem.getOption()
-                                .toString());
+                    if (!optionItem.takesMultipleArguments()
+                            && activatedOption.contains(optionItem.getOption()))
+                        throw new OptionParserException(XerialErrorCode.DUPLICATE_OPTION,
+                                optionItem.getOption().toString());
 
                     activatedOption.add(optionItem.getOption());
                 }
 
             }
-            else if (currentArg.startsWith("-"))
-            {
+            else if (currentArg.startsWith("-")) {
                 // option with a leading hyphen (e.g. "-txvf" is equivalent to "-t", "-x", "-v" and "-f")
                 String shortOptionList = currentArg.substring(1);
-                for (int i = 0; i < shortOptionList.length(); i++)
-                {
+                for (int i = 0; i < shortOptionList.length(); i++) {
                     String shortOptionName = shortOptionList.substring(i, i + 1);
                     OptionItem optionItem = findOptionItem(schema, shortOptionName);
-                    if (optionItem == null)
-                    {
+                    if (optionItem == null) {
                         unusedArgument.add(currentArg);
                         continue;
                     }
 
-                    if (optionItem.needsArgument())
-                    {
+                    if (optionItem.needsArgument()) {
                         if (shortOptionList.length() != 1)
-                            throw new OptionParserException(XerialErrorCode.SYNTAX_ERROR, String.format(
-                                    "short name option -%s with an arguments must be a single notation",
-                                    shortOptionName));
-
-                        optionItem.setOption(optionHolder, args[++index]);
+                            throw new OptionParserException(
+                                    XerialErrorCode.SYNTAX_ERROR,
+                                    String
+                                            .format(
+                                                    "short name option -%s with an arguments must be a single notation",
+                                                    shortOptionName));
+
+                        setOption(optionItem, args[++index]);
                     }
                     else
-                        optionItem.setOption(optionHolder, "true");
+                        setOption(optionItem, "true");
 
-                    if (!optionItem.takesMultipleArguments() && activatedOption.contains(optionItem.getOption()))
-                        throw new OptionParserException(XerialErrorCode.DUPLICATE_OPTION, optionItem.getOption()
-                                .toString());
+                    if (!optionItem.takesMultipleArguments()
+                            && activatedOption.contains(optionItem.getOption()))
+                        throw new OptionParserException(XerialErrorCode.DUPLICATE_OPTION,
+                                optionItem.getOption().toString());
 
                     activatedOption.add(optionItem.getOption());
                 }
             }
-            else
-            {
+            else {
                 // general argument
                 ArgumentItem argItem = schema.getArgument(argIndex);
-                if (argItem == null)
-                {
-                    if (ignoreUnknownOption)
-                    {
+                if (argItem == null) {
+                    if (ignoreUnknownOption) {
                         unusedArgument.add(currentArg);
                         continue;
                     }
                     else
-                        throw new OptionParserException(XerialErrorCode.SYNTAX_ERROR, "unused argument: " + currentArg);
+                        throw new OptionParserException(XerialErrorCode.SYNTAX_ERROR,
+                                "unused argument: " + currentArg);
                 }
 
                 argItem.set(optionHolder, currentArg);
-                if (!argItem.takesMultipleArguments() && activatedArgument.contains(argItem.getArgumentDescriptor()))
-                    throw new OptionParserException(XerialErrorCode.DUPLICATE_OPTION, argItem.getArgumentDescriptor()
-                            .toString());
+                if (!argItem.takesMultipleArguments()
+                        && activatedArgument.contains(argItem.getArgumentDescriptor()))
+                    throw new OptionParserException(XerialErrorCode.DUPLICATE_OPTION, argItem
+                            .getArgumentDescriptor().toString());
 
                 activatedArgument.add(argItem.getArgumentDescriptor());
                 argIndex++;
@@ -267,11 +268,30 @@ public class OptionParser
         }
 
         // verify missing options & arguments
-        for (ArgumentItem argItem : schema.getArgumentItemList())
-        {
+        for (ArgumentItem argItem : schema.getArgumentItemList()) {
             if (argItem.getArgumentDescriptor().required()
                     && !activatedArgument.contains(argItem.getArgumentDescriptor()))
-                throw new OptionParserException(XerialErrorCode.MISSING_ARGUMENT, argItem.toString());
+                throw new OptionParserException(XerialErrorCode.MISSING_ARGUMENT, argItem
+                        .toString());
+        }
+    }
+
+    private void setOption(OptionItem item, String value) throws OptionParserException {
+        try {
+            item.setOption(optionHolder, value);
+        }
+        catch (OptionParserException e) {
+            if (BeanErrorCode.class.isInstance(e.getErrorCode())) {
+                BeanErrorCode be = BeanErrorCode.class.cast(e.getErrorCode());
+                switch (be) {
+                case InvalidFormat:
+                    throw new OptionParserException(XerialErrorCode.INVALID_ARGUMENT, String
+                            .format("cannot set %s to %s", value, item.toString()));
+                }
+
+            }
+
+            throw e;
         }
     }
 
@@ -281,8 +301,7 @@ public class OptionParser
      * 
      * @param ignore
      */
-    public void setIgnoreUnknownOption(boolean ignore)
-    {
+    public void setIgnoreUnknownOption(boolean ignore) {
         ignoreUnknownOption = ignore;
     }
 
index 52fd45c..0a57045 100644 (file)
@@ -34,31 +34,31 @@ import org.xerial.core.XerialException;
  * @author leo
  * 
  */
-public class OptionParserException extends XerialException
-{
+public class OptionParserException extends XerialException {
     /**
      * Comment for <code>serialVersionUID</code>
      */
     private static final long serialVersionUID = 1L;
 
-    public OptionParserException(ErrorCode errorCode, String message, Throwable cause)
-    {
+    public OptionParserException(ErrorCode errorCode, String message, Throwable cause) {
         super(errorCode, message, cause);
     }
 
-    public OptionParserException(ErrorCode errorCode, String message)
-    {
+    public OptionParserException(ErrorCode errorCode, String message) {
         super(errorCode, message);
     }
 
-    public OptionParserException(ErrorCode errorCode, Throwable cause)
-    {
+    public OptionParserException(ErrorCode errorCode, Throwable cause) {
         super(errorCode, cause);
     }
 
-    public OptionParserException(ErrorCode errorCode)
-    {
+    public OptionParserException(ErrorCode errorCode) {
         super(errorCode);
     }
 
+    @Override
+    public String getMessage() {
+
+        return super.getMessage();
+    }
 }
index 5bf3e1a..ffc76e1 100644 (file)
@@ -53,55 +53,45 @@ import org.xerial.util.template.Template;
  * @author leo
  * 
  */
-public class OptionSchema
-{
-    private final ArrayList<OptionItem>   optionItemList   = new ArrayList<OptionItem>();
+public class OptionSchema {
+    private final ArrayList<OptionItem> optionItemList = new ArrayList<OptionItem>();
     private final ArrayList<ArgumentItem> argumentItemList = new ArrayList<ArgumentItem>();
-    private Usage                         usage            = null;
+    private Usage usage = null;
 
-    List<OptionItem> getOptionItemList()
-    {
+    List<OptionItem> getOptionItemList() {
         return optionItemList;
     }
 
-    List<ArgumentItem> getArgumentItemList()
-    {
+    List<ArgumentItem> getArgumentItemList() {
         return argumentItemList;
     }
 
-    Usage getUsage()
-    {
+    Usage getUsage() {
         return usage;
     }
 
-    protected static String optionDescription(OptionItem optionItem)
-    {
+    protected static String optionDescription(OptionItem optionItem) {
         StringBuilder line = new StringBuilder();
         Option opt = optionItem.getOption();
-        if (optionItem.hasSymbol())
-        {
+        if (optionItem.hasSymbol()) {
             line.append(String.format("-%s", opt.symbol()));
-            if (optionItem.hasLongName())
-            {
+            if (optionItem.hasLongName()) {
                 line.append(String.format(", --%s", opt.longName()));
 
                 if (optionItem.needsArgument())
                     line.append(String.format("=%s", opt.varName()));
             }
-            else
-            {
+            else {
                 if (optionItem.needsArgument())
                     line.append(String.format(" ", opt.varName()));
             }
         }
-        else if (optionItem.hasLongName())
-        {
+        else if (optionItem.hasLongName()) {
             line.append(String.format("    --%s", opt.longName()));
             if (optionItem.needsArgument())
                 line.append(String.format("=%s", opt.varName()));
         }
-        else
-        {
+        else {
             throw new XerialError(XerialErrorCode.NO_OPTION, optionItem.toString());
         }
 
@@ -109,8 +99,7 @@ public class OptionSchema
 
     }
 
-    protected static String argumentExpression(ArgumentItem argItem)
-    {
+    protected static String argumentExpression(ArgumentItem argItem) {
         StringBuilder line = new StringBuilder();
 
         Argument arg = argItem.getArgumentDescriptor();
@@ -128,8 +117,7 @@ public class OptionSchema
         return line.toString();
     }
 
-    public void printUsage(OutputStream out)
-    {
+    public void printUsage(OutputStream out) {
         printUsage(new OutputStreamWriter(out));
     }
 
@@ -137,45 +125,42 @@ public class OptionSchema
         COMMAND, ARGUMENT_LIST, DESCRIPTION, OPTION_LIST
     }
 
-    public void printUsage(Writer out)
-    {
+    public void printUsage(Writer out) {
         Properties helpMessageTemplateValue = new Properties();
 
         // argument list
         Collections.sort(argumentItemList, new Comparator<ArgumentItem>() {
-            public int compare(ArgumentItem o1, ArgumentItem o2)
-            {
+            public int compare(ArgumentItem o1, ArgumentItem o2) {
                 return o1.getRange().compareTo(o2.getRange());
             }
         });
 
-        List<String> argExpressionList = Algorithm.map(argumentItemList, new Mapper<ArgumentItem, String>() {
-            public String map(ArgumentItem input)
-            {
-                return argumentExpression(input);
-            }
-        });
+        List<String> argExpressionList = Algorithm.map(argumentItemList,
+                new Mapper<ArgumentItem, String>() {
+                    public String map(ArgumentItem input) {
+                        return argumentExpression(input);
+                    }
+                });
 
         // usage information
-        if (usage != null)
-        {
+        if (usage != null) {
             helpMessageTemplateValue.put(TemplateVariable.COMMAND.name(), usage.command());
             if (usage.description() != null && usage.description().length() > 0)
-                helpMessageTemplateValue.put(TemplateVariable.DESCRIPTION.name(), usage.description());
+                helpMessageTemplateValue.put(TemplateVariable.DESCRIPTION.name(), usage
+                        .description());
         }
 
-        helpMessageTemplateValue.put(TemplateVariable.ARGUMENT_LIST.name(), StringUtil.join(argExpressionList, " "));
+        helpMessageTemplateValue.put(TemplateVariable.ARGUMENT_LIST.name(), StringUtil.join(
+                argExpressionList, " "));
 
         // option list
         Collections.sort(optionItemList, new Comparator<OptionItem>() {
-            public int compare(OptionItem o1, OptionItem o2)
-            {
+            public int compare(OptionItem o1, OptionItem o2) {
                 Option opt1 = o1.getOption();
                 Option opt2 = o2.getOption();
 
                 // prefer options that have a short name 
-                if (o1.hasSymbol())
-                {
+                if (o1.hasSymbol()) {
                     if (!o2.hasSymbol())
                         return -1;
                 }
@@ -190,12 +175,12 @@ public class OptionSchema
             }
         });
 
-        List<String> descriptionList = Algorithm.map(optionItemList, new Mapper<OptionItem, String>() {
-            public String map(OptionItem input)
-            {
-                return optionDescription(input);
-            }
-        });
+        List<String> descriptionList = Algorithm.map(optionItemList,
+                new Mapper<OptionItem, String>() {
+                    public String map(OptionItem input) {
+                        return optionDescription(input);
+                    }
+                });
 
         int maxDescriptionLength = 15;
         for (String each : descriptionList)
@@ -205,34 +190,32 @@ public class OptionSchema
         String optionHelpFormat = String.format(" %%-%ds  %%s", maxDescriptionLength);
 
         StringWriter optionListHelpWriter = new StringWriter();
-        for (int i = 0; i < optionItemList.size(); ++i)
-        {
+        for (int i = 0; i < optionItemList.size(); ++i) {
             OptionItem optionItem = optionItemList.get(i);
             String optionHelp = descriptionList.get(i);
-            String line = String.format(optionHelpFormat, optionHelp, optionItem.getOption().description());
+            String line = String.format(optionHelpFormat, optionHelp, optionItem.getOption()
+                    .description());
             optionListHelpWriter.append(line);
             optionListHelpWriter.append(StringUtil.newline());
         }
-        helpMessageTemplateValue.put(TemplateVariable.OPTION_LIST.name(), optionListHelpWriter.toString());
+        helpMessageTemplateValue.put(TemplateVariable.OPTION_LIST.name(), optionListHelpWriter
+                .toString());
 
         // render help messages using template
 
-        ResourcePath rp = usage != null ? new ResourcePath(usage.templatePath()) : new ResourcePath(
-                Usage.DEFAULT_TEMPLATE);
+        ResourcePath rp = new ResourcePath(usage != null ? usage.templatePath()
+                Usage.DEFAULT_TEMPLATE);
 
-        try
-        {
+        try {
             Template helpMessageTemplate = new Template(rp.openBinaryStream());
             String helpMessage = helpMessageTemplate.apply(helpMessageTemplateValue);
             out.append(helpMessage);
             out.flush();
         }
-        catch (IOException e)
-        {
+        catch (IOException e) {
             throw new XerialError(XerialErrorCode.OUTPUT_ERROR, e);
         }
-        catch (XerialException e)
-        {
+        catch (XerialException e) {
             throw new XerialError(e);
         }
 
@@ -242,10 +225,8 @@ public class OptionSchema
      * @param optionName
      * @return
      */
-    public OptionItem getOption(String optionName)
-    {
-        for (OptionItem eachOption : optionItemList)
-        {
+    public OptionItem getOption(String optionName) {
+        for (OptionItem eachOption : optionItemList) {
             Option opt = eachOption.getOption();
             if (optionName.equals(opt.symbol()))
                 return eachOption;
@@ -258,10 +239,8 @@ public class OptionSchema
         return null;
     }
 
-    public ArgumentItem getArgument(int argumentIndex)
-    {
-        for (ArgumentItem each : argumentItemList)
-        {
+    public ArgumentItem getArgument(int argumentIndex) {
+        for (ArgumentItem each : argumentItemList) {
             Argument arg = each.getArgumentDescriptor();
             if (arg.index() == argumentIndex)
                 return each;
@@ -272,37 +251,31 @@ public class OptionSchema
         return null;
     }
 
-    public void addOptionItem(Method setter)
-    {
+    public void addOptionItem(Method setter) {
         OptionItem newOption = new OptionItem(setter);
         optionItemList.add(newOption);
     }
 
-    public void addOptionItem(Field field)
-    {
+    public void addOptionItem(Field field) {
         OptionItem newOption = new OptionItem(field);
         optionItemList.add(newOption);
     }
 
-    public void addArgumentItem(Method setter)
-    {
+    public void addArgumentItem(Method setter) {
         ArgumentItem newArg = new ArgumentItem(setter);
         validate(newArg);
         argumentItemList.add(newArg);
     }
 
-    public void addArgumentItem(Field field)
-    {
+    public void addArgumentItem(Field field) {
         ArgumentItem newArg = new ArgumentItem(field);
         validate(newArg);
         argumentItemList.add(newArg);
     }
 
-    private void validate(ArgumentItem newArg)
-    {
+    private void validate(ArgumentItem newArg) {
         Range newRange = newArg.getRange();
-        for (ArgumentItem each : argumentItemList)
-        {
+        for (ArgumentItem each : argumentItemList) {
             Range r = each.getRange();
             if (r.overlaps(newRange))
                 throw new XerialError(XerialErrorCode.DUPLICATE_OPTION, String.format(
@@ -310,17 +283,14 @@ public class OptionSchema
         }
     }
 
-    public static OptionSchema newOptionSchema(Class< ? > optionHolderType)
-    {
+    public static OptionSchema newOptionSchema(Class< ? > optionHolderType) {
         OptionSchema optionSchema = new OptionSchema();
 
         // traverses through super classes
         for (Class< ? > optionHolderClass = optionHolderType; optionHolderClass != null; optionHolderClass = optionHolderClass
-                .getSuperclass())
-        {
+                .getSuperclass()) {
             // looks for bean methods annotated with Option or Argument 
-            for (Method eachMethod : optionHolderClass.getDeclaredMethods())
-            {
+            for (Method eachMethod : optionHolderClass.getDeclaredMethods()) {
                 if (eachMethod.getAnnotation(Option.class) != null)
                     optionSchema.addOptionItem(eachMethod);
 
@@ -329,8 +299,7 @@ public class OptionSchema
             }
 
             // looks for bean fields annotated with Option or Argument 
-            for (Field f : optionHolderClass.getDeclaredFields())
-            {
+            for (Field f : optionHolderClass.getDeclaredFields()) {
                 if (f.getAnnotation(Option.class) != null)
                     optionSchema.addOptionItem(f);
 
@@ -338,8 +307,7 @@ public class OptionSchema
                     optionSchema.addArgumentItem(f);
             }
 
-            if (optionHolderClass.getAnnotation(Usage.class) != null)
-            {
+            if (optionHolderClass.getAnnotation(Usage.class) != null) {
                 optionSchema.setUsage(optionHolderClass);
             }
         }
@@ -347,8 +315,7 @@ public class OptionSchema
         return optionSchema;
     }
 
-    private void setUsage(Class< ? > optionHolderClass)
-    {
+    private void setUsage(Class< ? > optionHolderClass) {
         Usage newUsage = optionHolderClass.getAnnotation(Usage.class);
         if (newUsage == null)
             throw new XerialError(XerialErrorCode.NO_USAGE_ANNOTATION, optionHolderClass.toString());
@@ -357,8 +324,7 @@ public class OptionSchema
             usage = newUsage;
     }
 
-    public static <OptionHolder> OptionSchema newOptionSchema(OptionHolder optionHolder)
-    {
+    public static <OptionHolder> OptionSchema newOptionSchema(OptionHolder optionHolder) {
         return newOptionSchema(optionHolder.getClass());
     }
 
index c5fef3f..fed6589 100644 (file)
@@ -34,24 +34,24 @@ public enum ShellError implements ErrorCode {
 
     private final String description;
 
-    private ShellError()
-    {
+    private ShellError() {
         this.description = "";
     }
 
-    private ShellError(String description)
-    {
+    private ShellError(String description) {
         this.description = description;
     }
 
-    public String getCodeName()
-    {
+    public String getCodeName() {
         return name();
     }
 
-    public String getDescription()
-    {
+    public String getDescription() {
         return description;
     }
 
+    public Enum< ? > getCode() {
+        return this;
+    }
+
 }
index 5c0de4b..069a262 100644 (file)
@@ -1,5 +1,5 @@
 usage: $COMMAND$ $ARGUMENT_LIST$\r
        $DESCRIPTION$\r
 \r
-[options]\r
+[available options]\r
 $OPTION_LIST$\r
index 6e01366..778de36 100644 (file)
@@ -34,33 +34,28 @@ import org.xerial.core.ErrorCode;
  */
 public enum XMLErrorCode implements ErrorCode {
 
-    INVALID_XML_STRUCTURE,
-    NO_MORE_TAG_TO_CLOSE,
-    PARSE_ERROR,
-    SAX_ERROR,
-    INVALID_PARSER_CONFIGURATION,
-    FAILED_TO_CREATE_XML_PARSER;
+    INVALID_XML_STRUCTURE, NO_MORE_TAG_TO_CLOSE, PARSE_ERROR, SAX_ERROR, INVALID_PARSER_CONFIGURATION, FAILED_TO_CREATE_XML_PARSER;
 
     private final String description;
 
-    private XMLErrorCode()
-    {
+    private XMLErrorCode() {
         this.description = EMPTY_DESCRIPTION;
     }
 
-    private XMLErrorCode(String description)
-    {
+    private XMLErrorCode(String description) {
         this.description = description;
     }
 
-    public String getCodeName()
-    {
+    public String getCodeName() {
         return name();
     }
 
-    public String getDescription()
-    {
+    public String getDescription() {
         return description;
     }
 
+    public Enum< ? > getCode() {
+        return this;
+    }
+
 }
index 20e43ff..00db13b 100644 (file)
@@ -24,7 +24,8 @@
 //--------------------------------------
 package org.xerial.lens;
 
-import static org.junit.Assert.*;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNotNull;
 
 import java.io.IOException;
 import java.util.ArrayList;
@@ -35,6 +36,7 @@ import org.junit.Before;
 import org.junit.Ignore;
 import org.junit.Test;
 import org.xerial.core.XerialException;
+import org.xerial.silk.SilkParser;
 import org.xerial.silk.SilkUtilTest;
 import org.xerial.util.FileResource;
 import org.xerial.util.HashedArrayList;
@@ -323,4 +325,47 @@ public class LensTest {
         assertEquals("{\"list\":[]}", Lens.toJSON(d));
     }
 
+    public static class MyGene {
+        public String name;
+        public long start;
+        public String link;
+    }
+
+    public static class MyGeneQuery {
+        private List<MyGene> geneList = new ArrayList<MyGene>();
+
+        public void addGene_Coordinate(MyGene gene, Chr c) {
+            if (c.name.equals("chr1"))
+                geneList.add(gene);
+        }
+
+        public List<MyGene> getGeneList() {
+            return geneList;
+        }
+    }
+
+    public static class Chr {
+        public String name;
+    }
+
+    @Test
+    public void testLens() throws Exception {
+
+        MyGeneQuery result = Lens.loadSilk(MyGeneQuery.class, FileResource.open(LensTest.class,
+                "sequence.silk"));
+
+        _logger.debug(Lens.toJSON(result));
+    }
+
+    @Test
+    public void testFind() throws Exception {
+        Lens.find(MyGene.class, "gene", new SilkParser(FileResource.find(LensTest.class,
+                "sequence.silk")), new ObjectHandler<MyGene>() {
+
+            public void handle(MyGene input) throws Exception {
+                _logger.info(Lens.toJSON(input));
+            }
+        });
+    }
+
 }
index b711a6b..4c10800 100644 (file)
@@ -24,7 +24,9 @@
 //--------------------------------------\r
 package org.xerial.silk.schema;\r
 \r
-import static org.junit.Assert.*;\r
+import static org.junit.Assert.assertEquals;\r
+import static org.junit.Assert.assertNotNull;\r
+import static org.junit.Assert.assertNull;\r
 \r
 import org.junit.After;\r
 import org.junit.Before;\r
@@ -107,6 +109,9 @@ public class SilkSchemaTest {
     public void buildQuery() throws Exception {\r
 \r
         SilkSchema schema = SilkSchema.parse(FileResource.open(SilkSchemaTest.class, "read.silk"));\r
+\r
+        _logger.info(Lens.toJSON(schema));\r
+\r
         QuerySet qs = schema.buildAmoebaJoinQuery();\r
 \r
         _logger.info(qs);\r
@@ -119,7 +124,7 @@ public class SilkSchemaTest {
 \r
             public void newAmoeba(Schema schema, Node coreNode, Node attributeNode)\r
                     throws Exception {\r
-                _logger.info(String.format("amoeba (%s, %s)", coreNode, attributeNode));\r
+                _logger.trace(String.format("amoeba (%s, %s)", coreNode, attributeNode));\r
             }\r
 \r
             public void text(Schema schema, Node coreNode, Node textNode, String text)\r
index f8f9183..14d4ce2 100644 (file)
@@ -19,7 +19,7 @@ class Locus
 #  :zvalue zvalue(:start, :end) \r
   :strand\r
 \r
-  index keyword :name\r
+  index keyword on :name\r
 end\r
 \r
 # reference sequence\r
index e657c77..de6686d 100644 (file)
@@ -39,33 +39,28 @@ import org.junit.Test;
 import org.xerial.util.log.LogLevel;
 import org.xerial.util.log.Logger;
 
-public class OptionParserTest
-{
+public class OptionParserTest {
     private static Logger _logger = Logger.getLogger(OptionParserTest.class);
 
     @Before
-    public void setUp() throws Exception
-    {}
+    public void setUp() throws Exception {}
 
     @After
-    public void tearDown() throws Exception
-    {}
+    public void tearDown() throws Exception {}
 
-    class MyOption
-    {
+    class MyOption {
         @Option(symbol = "h", longName = "help", description = "display help message")
-        private boolean      displayHelp;
+        private boolean displayHelp;
 
-        @Argument(index = 0)
-        private String       subCommand;
+        @Argument(index = 0, required = true)
+        private String subCommand;
 
         @Argument(name = "input_file", index = 1, required = false)
         private List<String> fileList;
     }
 
     @Test
-    public void optionBinding() throws OptionParserException
-    {
+    public void optionBinding() throws OptionParserException {
         MyOption myOption = new MyOption();
         OptionParser parser = new OptionParser(myOption);
 
@@ -81,8 +76,7 @@ public class OptionParserTest
     }
 
     @Test
-    public void printUsage()
-    {
+    public void printUsage() {
         MyOption myOption = new MyOption();
         OptionParser parser = new OptionParser(myOption);
 
@@ -93,10 +87,8 @@ public class OptionParserTest
     }
 
     @Test
-    public void testDuplicatedOptionFlag()
-    {
-        try
-        {
+    public void testDuplicatedOptionFlag() {
+        try {
             MyOption myOption = new MyOption();
             OptionParser parser = new OptionParser(myOption);
 
@@ -104,17 +96,14 @@ public class OptionParserTest
 
             fail("must detect the presence of duplicated option flags");
         }
-        catch (OptionParserException e)
-        {
+        catch (OptionParserException e) {
 
         }
     }
 
     @Test
-    public void testDuplicatedLongOptionFlag()
-    {
-        try
-        {
+    public void testDuplicatedLongOptionFlag() {
+        try {
             MyOption myOption = new MyOption();
             OptionParser parser = new OptionParser(myOption);
 
@@ -122,17 +111,14 @@ public class OptionParserTest
 
             fail("must detect the presence of duplicated option flags");
         }
-        catch (OptionParserException e)
-        {
+        catch (OptionParserException e) {
 
         }
     }
 
     @Test
-    public void detectMissingArgument()
-    {
-        try
-        {
+    public void detectMissingArgument() {
+        try {
             MyOption myOption = new MyOption();
             OptionParser parser = new OptionParser(myOption);
 
@@ -140,16 +126,14 @@ public class OptionParserTest
 
             fail("must detect some argument is missing");
         }
-        catch (OptionParserException e)
-        {
+        catch (OptionParserException e) {
 
         }
 
     }
 
     @Test
-    public void initializeCollectionsInOptionHolder() throws OptionParserException
-    {
+    public void initializeCollectionsInOptionHolder() throws OptionParserException {
         MyOption myOption = new MyOption();
         OptionParser parser = new OptionParser(myOption);
 
@@ -162,15 +146,13 @@ public class OptionParserTest
 
     }
 
-    class LoglevelCommand
-    {
+    class LoglevelCommand {
         @Option(symbol = "l", longName = "loglevel", varName = "LOG_LEVEL")
         private LogLevel loglevel = LogLevel.INFO;
     }
 
     @Test
-    public void enumOption() throws OptionParserException
-    {
+    public void enumOption() throws OptionParserException {
         LoglevelCommand opt = new LoglevelCommand();
         OptionParser parser = new OptionParser(opt);
         parser.parse(new String[] { "--loglevel=DEBUG" });
@@ -178,15 +160,13 @@ public class OptionParserTest
         assertEquals(LogLevel.DEBUG, opt.loglevel);
     }
 
-    class MultipleName
-    {
+    class MultipleName {
         @Option(longName = "name")
         private List<String> name;
     }
 
     @Test
-    public void mulpleOptionOccurences() throws OptionParserException
-    {
+    public void mulpleOptionOccurences() throws OptionParserException {
         MultipleName mn = new MultipleName();
         OptionParser parser = new OptionParser(mn);
         parser.parse(new String[] { "--name=leo", "--name=yui" });
@@ -197,18 +177,16 @@ public class OptionParserTest
         assertEquals("yui", mn.name.get(1));
     }
 
-    class IntArg
-    {
+    class IntArg {
         @Option(symbol = "i")
-        int           num;
+        int num;
 
         @Argument(name = "value")
         List<Integer> value;
     }
 
     @Test
-    public void intArgument() throws OptionParserException
-    {
+    public void intArgument() throws OptionParserException {
         IntArg intArg = new IntArg();
         OptionParser parser = new OptionParser(intArg);
 
@@ -223,8 +201,7 @@ public class OptionParserTest
 
     }
 
-    class AmbiguousTypeArg
-    {
+    class AmbiguousTypeArg {
         @Argument(name = "value")
         List< ? > value;
 
@@ -233,12 +210,11 @@ public class OptionParserTest
          */
         @SuppressWarnings("unchecked")
         @Option(symbol = "d")
-        List      d;
+        List d;
     }
 
     @Test
-    public void ambiguousType() throws OptionParserException
-    {
+    public void ambiguousType() throws OptionParserException {
         AmbiguousTypeArg arg = new AmbiguousTypeArg();
         OptionParser parser = new OptionParser(arg);
 
@@ -258,61 +234,52 @@ public class OptionParserTest
     }
 
     @Test
-    public void detectUnknownOption()
-    {
+    public void detectUnknownOption() {
         MyOption myOption = new MyOption();
         OptionParser parser = new OptionParser(myOption);
 
-        try
-        {
+        try {
             parser.parse(new String[] { "-v", "file" });
 
             fail("must detect unknown options ");
         }
-        catch (OptionParserException e)
-        {
+        catch (OptionParserException e) {
 
         }
 
     }
 
     @Test
-    public void ignoreUnknownOption()
-    {
+    public void ignoreUnknownOption() {
         MyOption myOption = new MyOption();
         OptionParser parser = new OptionParser(myOption);
         parser.setIgnoreUnknownOption(true);
 
-        try
-        {
+        try {
             parser.parse(new String[] { "-v", "file" });
 
         }
-        catch (OptionParserException e)
-        {
+        catch (OptionParserException e) {
             fail("must ignore unknown options ");
         }
 
     }
 
-    class MainCommand
-    {
+    class MainCommand {
         @Argument(name = "sub_command")
         String subCommand = null;
     }
 
-    class SubCommand
-    {
+    class SubCommand {
         @Option(symbol = "h", longName = "help")
         boolean displayHelp = false;
 
         @Argument(name = "input")
-        String  input       = null;
+        String input = null;
     }
 
     @Test
-    public void retrieveUnusedArguments() throws OptionParserException
-    {
+    public void retrieveUnusedArguments() throws OptionParserException {
         MainCommand mainCommand = new MainCommand();
         OptionParser mainCommandParser = new OptionParser(mainCommand);
         mainCommandParser.setIgnoreUnknownOption(true);
@@ -334,4 +301,37 @@ public class OptionParserTest
         assertEquals("input.txt", subCommand.input);
         assertTrue(subCommand.displayHelp);
     }
+
+    @Test
+    public void getOptionHolderTest() throws Exception {
+
+        OptionParser mainCommandParser = new OptionParser(new MainCommand());
+        mainCommandParser.parse(new String[] { "action" });
+        MainCommand mc = mainCommandParser.getOptionHolder();
+
+        assertEquals("action", mc.subCommand);
+
+    }
+
+    static class MyOpt {
+        @Option(symbol = "v", longName = "value", description = "integer value")
+        int value = -1;
+    }
+
+    @Test
+    public void errorMessage() throws Exception {
+        OptionParser p = new OptionParser(MyOpt.class);
+        try {
+            p.parse(new String[] { "-v", "abc" }); // use wrong type
+        }
+        catch (OptionParserException e) {
+            _logger.debug(e);
+            assertTrue(String.format(
+                    "error message must explain which option argument causes the error: %s", e
+                            .getMessage()), e.getMessage().contains("-v"));
+            return;
+        }
+        fail("cannot reach here");
+
+    }
 }