OSDN Git Service

index spec
authorleo <leo@ae02f08e-27ec-0310-ae8c-8ba02fe2eafd>
Mon, 6 Jul 2009 07:32:18 +0000 (07:32 +0000)
committerleo <leo@ae02f08e-27ec-0310-ae8c-8ba02fe2eafd>
Mon, 6 Jul 2009 07:32:18 +0000 (07:32 +0000)
git-svn-id: http://www.xerial.org/svn/project/XerialJ/trunk/xerial-core@3436 ae02f08e-27ec-0310-ae8c-8ba02fe2eafd

13 files changed:
src/main/java/org/xerial/lens/Lens.java
src/main/java/org/xerial/silk/schema/SilkAttribute.java
src/main/java/org/xerial/silk/schema/SilkClass.java
src/main/java/org/xerial/silk/schema/SilkIndexTarget.java [new file with mode: 0644]
src/main/java/org/xerial/silk/schema/SilkModule.java
src/main/java/org/xerial/silk/schema/SilkSchema.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/test/java/org/xerial/silk/schema/SilkSchemaTest.java
src/test/java/org/xerial/silk/schema/schema.silk
src/test/java/org/xerial/silk/schema/simple-schema.silk [new file with mode: 0644]

index f79f45e..4c7cb7d 100644 (file)
@@ -260,6 +260,10 @@ public class Lens {
         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());
index 8497354..4bb4aab 100644 (file)
@@ -30,14 +30,13 @@ package org.xerial.silk.schema;
  * @author leo\r
  * \r
  */\r
-public class SilkAttribute\r
-{\r
+public class SilkAttribute {\r
     public static final String DEFAULT_TYPE = "default";\r
 \r
     public String typeName = DEFAULT_TYPE;\r
     public String name;\r
     public boolean isArray = false;\r
 \r
-    public String value = null;\r
+    public String defaultValue = null;\r
 \r
 }\r
index a2682e8..add0b2d 100644 (file)
@@ -27,14 +27,12 @@ package org.xerial.silk.schema;
 import java.util.List;\r
 \r
 /**\r
- * \r
+ * Class definition\r
  * \r
  * @author leo\r
  * \r
  */\r
-public class SilkClass\r
-{\r
-    public SilkModule module = null;\r
+public class SilkClass {\r
     public String name;\r
 \r
     public String parent = null;\r
@@ -42,4 +40,6 @@ public class SilkClass
     public List<String> mixin;\r
     public List<SilkAttribute> attribute;\r
 \r
+    public List<SilkIndexTarget> index;\r
+\r
 }\r
diff --git a/src/main/java/org/xerial/silk/schema/SilkIndexTarget.java b/src/main/java/org/xerial/silk/schema/SilkIndexTarget.java
new file mode 100644 (file)
index 0000000..39eb4f8
--- /dev/null
@@ -0,0 +1,40 @@
+/*--------------------------------------------------------------------------\r
+ *  Copyright 2009 Taro L. Saito\r
+ *\r
+ *  Licensed under the Apache License, Version 2.0 (the "License");\r
+ *  you may not use this file except in compliance with the License.\r
+ *  You may obtain a copy of the License at\r
+ *\r
+ *     http://www.apache.org/licenses/LICENSE-2.0\r
+ *\r
+ *  Unless required by applicable law or agreed to in writing, software\r
+ *  distributed under the License is distributed on an "AS IS" BASIS,\r
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r
+ *  See the License for the specific language governing permissions and\r
+ *  limitations under the License.\r
+ *--------------------------------------------------------------------------*/\r
+//--------------------------------------\r
+// XerialJ\r
+//\r
+// SilkIndexTarget.java\r
+// Since: Jul 6, 2009 4:27:27 PM\r
+//\r
+// $URL$\r
+// $Author$\r
+//--------------------------------------\r
+package org.xerial.silk.schema;\r
+\r
+import java.util.List;\r
+\r
+/**\r
+ * Index specification\r
+ * \r
+ * @author leo\r
+ * \r
+ */\r
+public class SilkIndexTarget {\r
+\r
+    public String typeName;\r
+    public List<String> attribute;\r
+\r
+}\r
index fcc4df5..77c042c 100644 (file)
 //--------------------------------------\r
 package org.xerial.silk.schema;\r
 \r
-public class SilkModule\r
-{\r
+import java.util.List;\r
+\r
+/**\r
+ * Module for packing several class definitions within a scope\r
+ * \r
+ * @author leo\r
+ * \r
+ */\r
+public class SilkModule {\r
     public final static String ROOT_MODULE_NAME = "";\r
 \r
     public String name = ROOT_MODULE_NAME;\r
+\r
+    public List<SilkClass> classDef;\r
 }\r
index d290cc0..bb1e62f 100644 (file)
@@ -41,12 +41,10 @@ import org.xerial.util.StringUtil;
 import org.xerial.util.antlr.ANTLRUtil;\r
 import org.xerial.util.log.Logger;\r
 \r
-public class SilkSchema\r
-{\r
+public class SilkSchema {\r
     private static Logger _logger = Logger.getLogger(SilkSchema.class);\r
 \r
     public List<SilkModule> module;\r
-    public List<SilkClass> classDef;\r
     public List<SilkRelation> relation;\r
 \r
     /**\r
@@ -57,34 +55,34 @@ public class SilkSchema
      * @return an instance of SilkSchema\r
      * @throws XerialException\r
      */\r
-    public static SilkSchema parse(Reader reader) throws XerialException\r
-    {\r
-        try\r
-        {\r
+    public static SilkSchema parse(Reader reader) throws XerialException {\r
+        try {\r
             SilkSchemaLexer lexer = new SilkSchemaLexer(new ANTLRReaderStream(reader));\r
             CommonTokenStream token = new CommonTokenStream(lexer);\r
 \r
             if (_logger.isDebugEnabled())\r
-                _logger.debug(StringUtil.join(ANTLRUtil.prettyPrintTokenList(token.getTokens(), ANTLRUtil\r
-                        .getTokenTable(SilkSchemaLexer.class, "SilkSchema.tokens")), "\n"));\r
+                _logger\r
+                        .debug(StringUtil.join(ANTLRUtil\r
+                                .prettyPrintTokenList(token.getTokens(), ANTLRUtil.getTokenTable(\r
+                                        SilkSchemaLexer.class, "SilkSchema.tokens")), "\n"));\r
 \r
             SilkSchemaParser parser = new SilkSchemaParser(token);\r
 \r
             SilkSchemaParser.schema_return ret = parser.schema();\r
 \r
             if (_logger.isDebugEnabled())\r
-                _logger.debug("parse tree:\n" + ANTLRUtil.parseTree((Tree) ret.getTree(), SilkSchemaParser.tokenNames));\r
+                _logger.debug("parse tree:\n"\r
+                        + ANTLRUtil.parseTree((Tree) ret.getTree(), SilkSchemaParser.tokenNames));\r
 \r
-            return Lens.loadANTLRParseTree(SilkSchema.class, (Tree) ret.getTree(), SilkSchemaParser.tokenNames);\r
+            return Lens.loadANTLRParseTree(SilkSchema.class, (Tree) ret.getTree(),\r
+                    SilkSchemaParser.tokenNames);\r
         }\r
-        catch (IOException e)\r
-        {\r
+        catch (IOException e) {\r
             throw new XerialException(XerialErrorCode.IO_EXCEPTION, e);\r
         }\r
-        catch (RecognitionException e)\r
-        {\r
-            throw new XerialException(XerialErrorCode.PARSE_ERROR, String.format("parse error line %d(%d): %s", e.line,\r
-                    e.charPositionInLine, e));\r
+        catch (RecognitionException e) {\r
+            throw new XerialException(XerialErrorCode.PARSE_ERROR, String.format(\r
+                    "parse error line %d(%d): %s", e.line, e.charPositionInLine, e));\r
         }\r
 \r
     }\r
index a8fd121..c6b7c82 100644 (file)
@@ -37,7 +37,7 @@ tokens {
   Attribute;\r
   IsArray;\r
   TypeName;\r
-  Value;\r
+  DefaultValue;\r
 }\r
 \r
 \r
@@ -156,13 +156,14 @@ UnsafeUnicodeChar: '(' | ')' | '[' | ']' | '{' | '}' | ',' | ':' | '#' | '<' | '
 fragment\r
 NonWhiteSpaceChar: ~(UnsafeUnicodeChar | '\r' | '\n' | ' ' | '\t' | '\u000C');\r
 \r
-\r
-Symbol: (':' NonWhiteSpaceChar) =>  ':' NonWhiteSpaceChar+;\r
+fragment SymbolChars: NonWhiteSpaceChar+;\r
+Symbol: (':' NonWhiteSpaceChar) =>  ':' s=SymbolChars { setText($s.text); };\r
 \r
 Class: 'class';\r
 Includes: 'includes';\r
 End: 'end';\r
 Relation: 'relation';\r
+Index: 'index';\r
 \r
 fragment SafeFirstLetter: 'A' .. 'Z' | 'a' .. 'z';\r
 fragment SafeLetter: SafeFirstLetter | '0' .. '9' | '-' | '_';\r
@@ -200,7 +201,7 @@ classDefinition
   | Relation QName classBody End -> ^(Relation Name[$QName.text] classBody)\r
   ; \r
   \r
-classBody: inheritance? (includeStatement | attributes)*;\r
+classBody: inheritance? (includeStatement | attributes | indexStatement)*;\r
   \r
 fragment inheritance: Lt QName -> Parent[$QName.text];\r
   \r
@@ -208,6 +209,13 @@ fragment includeStatement: Includes includeItem (Comma includeItem)* -> includeI
 \r
 fragment includeItem: QName -> Mixin[$QName.text];\r
 \r
+fragment indexStatement: Index QName indexTarget (Comma indexTarget)*\r
+  -> ^(Index TypeName[$QName.text] indexTarget+)\r
+; \r
+\r
+fragment indexTarget: Symbol -> Attribute[$Symbol.text]  \r
+; \r
+\r
 \r
 fragment attributes: attribute (Comma attribute)* \r
   -> attribute+\r
@@ -219,7 +227,7 @@ fragment attribute:
   ; \r
 \r
 attributeValue\r
-  : (String | Double | Integer) -> Value[$attributeValue.text]; \r
+  : (String | Double | Integer) -> DefaultValue[$attributeValue.text]; \r
   \r
 fragment attributeType\r
   : QName -> TypeName[$QName.text] \r
index 637d3da..795b551 100644 (file)
@@ -1,47 +1,49 @@
-Includes=45\r
+Includes=46\r
 RBrace=31\r
 NonWhiteSpaceChar=42\r
-Class=44\r
+Class=45\r
 LBracket=32\r
 Digit=18\r
+SymbolChars=43\r
 Frac=27\r
 HexDigit=20\r
-Symbol=43\r
+Symbol=44\r
+Index=49\r
 Module=5\r
 Letter=19\r
 Attribute=10\r
 Comma=37\r
 Schema=4\r
 Dot=36\r
-End=46\r
+End=47\r
 EscapeSequence=22\r
+DefaultValue=13\r
 Integer=26\r
-Relation=47\r
+Relation=48\r
 Mixin=9\r
-WhiteSpace=53\r
+WhiteSpace=55\r
 ClassDef=6\r
 LineComment=16\r
-ModuleName=50\r
-SafeFirstLetter=48\r
+ModuleName=52\r
+SafeFirstLetter=50\r
 Star=40\r
 Eq=35\r
 Preamble=15\r
 Exp=28\r
-QNameChar=54\r
+QNameChar=56\r
 RParen=39\r
 UnicodeChar=21\r
 StringChar=23\r
 LineBreak=17\r
 Name=7\r
-ModuleDef=52\r
+ModuleDef=54\r
 LParen=38\r
 String=25\r
-SafeLetter=49\r
+SafeLetter=51\r
 LineBreakChar=14\r
 IsArray=11\r
-QName=55\r
+QName=57\r
 StringChar_s=24\r
-Value=13\r
 UnsafeUnicodeChar=41\r
 Double=29\r
 LBrace=30\r
@@ -49,4 +51,4 @@ RBracket=33
 Lt=34\r
 Parent=8\r
 TypeName=12\r
-WhiteSpaces=51\r
+WhiteSpaces=53\r
index df40b12..b26bd64 100644 (file)
@@ -1,4 +1,4 @@
-// $ANTLR 3.1.3 Mar 17, 2009 19:23:44 SilkSchema.g 2009-07-03 16:06:13\r
+// $ANTLR 3.1.3 Mar 17, 2009 19:23:44 SilkSchema.g 2009-07-06 16:30:59\r
 \r
 /*--------------------------------------------------------------------------\r
  *  Copyright 2009 Taro L. Saito\r
@@ -34,59 +34,61 @@ import java.util.ArrayList;
 import java.util.Map;\r
 import java.util.HashMap;\r
 public class SilkSchemaLexer extends Lexer {\r
-    public static final int Includes=45;\r
+    public static final int Includes=46;\r
     public static final int RBrace=31;\r
     public static final int NonWhiteSpaceChar=42;\r
     public static final int LBracket=32;\r
-    public static final int Class=44;\r
+    public static final int Class=45;\r
+    public static final int SymbolChars=43;\r
     public static final int Digit=18;\r
     public static final int Frac=27;\r
     public static final int HexDigit=20;\r
-    public static final int Symbol=43;\r
+    public static final int Symbol=44;\r
+    public static final int Index=49;\r
     public static final int Module=5;\r
     public static final int Letter=19;\r
     public static final int Comma=37;\r
     public static final int Attribute=10;\r
     public static final int Schema=4;\r
     public static final int Dot=36;\r
-    public static final int End=46;\r
+    public static final int End=47;\r
     public static final int EscapeSequence=22;\r
+    public static final int DefaultValue=13;\r
     public static final int Integer=26;\r
-    public static final int Relation=47;\r
+    public static final int Relation=48;\r
     public static final int Mixin=9;\r
-    public static final int WhiteSpace=53;\r
+    public static final int WhiteSpace=55;\r
     public static final int ClassDef=6;\r
     public static final int LineComment=16;\r
-    public static final int ModuleName=50;\r
-    public static final int SafeFirstLetter=48;\r
+    public static final int ModuleName=52;\r
+    public static final int SafeFirstLetter=50;\r
     public static final int Star=40;\r
     public static final int Eq=35;\r
     public static final int Preamble=15;\r
     public static final int Exp=28;\r
-    public static final int QNameChar=54;\r
+    public static final int QNameChar=56;\r
     public static final int RParen=39;\r
     public static final int UnicodeChar=21;\r
     public static final int StringChar=23;\r
     public static final int LineBreak=17;\r
     public static final int Name=7;\r
-    public static final int ModuleDef=52;\r
+    public static final int ModuleDef=54;\r
     public static final int LParen=38;\r
     public static final int String=25;\r
-    public static final int SafeLetter=49;\r
+    public static final int SafeLetter=51;\r
     public static final int LineBreakChar=14;\r
     public static final int IsArray=11;\r
-    public static final int QName=55;\r
+    public static final int QName=57;\r
     public static final int EOF=-1;\r
     public static final int StringChar_s=24;\r
     public static final int UnsafeUnicodeChar=41;\r
-    public static final int Value=13;\r
     public static final int LBrace=30;\r
     public static final int Double=29;\r
     public static final int Lt=34;\r
     public static final int RBracket=33;\r
     public static final int Parent=8;\r
     public static final int TypeName=12;\r
-    public static final int WhiteSpaces=51;\r
+    public static final int WhiteSpaces=53;\r
 \r
       \r
 \r
@@ -1231,16 +1233,13 @@ public class SilkSchemaLexer extends Lexer {
     }\r
     // $ANTLR end "NonWhiteSpaceChar"\r
 \r
-    // $ANTLR start "Symbol"\r
-    public final void mSymbol() throws RecognitionException {\r
+    // $ANTLR start "SymbolChars"\r
+    public final void mSymbolChars() throws RecognitionException {\r
         try {\r
-            int _type = Symbol;\r
-            int _channel = DEFAULT_TOKEN_CHANNEL;\r
-            // SilkSchema.g:160:7: ( ( ':' NonWhiteSpaceChar )=> ':' ( NonWhiteSpaceChar )+ )\r
-            // SilkSchema.g:160:9: ( ':' NonWhiteSpaceChar )=> ':' ( NonWhiteSpaceChar )+\r
+            // SilkSchema.g:159:21: ( ( NonWhiteSpaceChar )+ )\r
+            // SilkSchema.g:159:23: ( NonWhiteSpaceChar )+\r
             {\r
-            match(':'); if (state.failed) return ;\r
-            // SilkSchema.g:160:41: ( NonWhiteSpaceChar )+\r
+            // SilkSchema.g:159:23: ( NonWhiteSpaceChar )+\r
             int cnt15=0;\r
             loop15:\r
             do {\r
@@ -1254,7 +1253,7 @@ public class SilkSchemaLexer extends Lexer {
 \r
                 switch (alt15) {\r
                case 1 :\r
-                   // SilkSchema.g:160:41: NonWhiteSpaceChar\r
+                   // SilkSchema.g:159:23: NonWhiteSpaceChar\r
                    {\r
                    mNonWhiteSpaceChar(); if (state.failed) return ;\r
 \r
@@ -1274,6 +1273,32 @@ public class SilkSchemaLexer extends Lexer {
 \r
             }\r
 \r
+        }\r
+        finally {\r
+        }\r
+    }\r
+    // $ANTLR end "SymbolChars"\r
+\r
+    // $ANTLR start "Symbol"\r
+    public final void mSymbol() throws RecognitionException {\r
+        try {\r
+            int _type = Symbol;\r
+            int _channel = DEFAULT_TOKEN_CHANNEL;\r
+            Token s=null;\r
+\r
+            // SilkSchema.g:160:7: ( ( ':' NonWhiteSpaceChar )=> ':' s= SymbolChars )\r
+            // SilkSchema.g:160:9: ( ':' NonWhiteSpaceChar )=> ':' s= SymbolChars\r
+            {\r
+            match(':'); if (state.failed) return ;\r
+            int sStart586 = getCharIndex();\r
+            mSymbolChars(); if (state.failed) return ;\r
+            s = new CommonToken(input, Token.INVALID_TOKEN_TYPE, Token.DEFAULT_CHANNEL, sStart586, getCharIndex()-1);\r
+            if ( state.backtracking==0 ) {\r
+               setText((s!=null?s.getText():null)); \r
+            }\r
+\r
+            }\r
+\r
             state.type = _type;\r
             state.channel = _channel;\r
         }\r
@@ -1366,10 +1391,31 @@ public class SilkSchemaLexer extends Lexer {
     }\r
     // $ANTLR end "Relation"\r
 \r
+    // $ANTLR start "Index"\r
+    public final void mIndex() throws RecognitionException {\r
+        try {\r
+            int _type = Index;\r
+            int _channel = DEFAULT_TOKEN_CHANNEL;\r
+            // SilkSchema.g:166:6: ( 'index' )\r
+            // SilkSchema.g:166:8: 'index'\r
+            {\r
+            match("index"); if (state.failed) return ;\r
+\r
+\r
+            }\r
+\r
+            state.type = _type;\r
+            state.channel = _channel;\r
+        }\r
+        finally {\r
+        }\r
+    }\r
+    // $ANTLR end "Index"\r
+\r
     // $ANTLR start "SafeFirstLetter"\r
     public final void mSafeFirstLetter() throws RecognitionException {\r
         try {\r
-            // SilkSchema.g:167:25: ( 'A' .. 'Z' | 'a' .. 'z' )\r
+            // SilkSchema.g:168: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
@@ -1394,7 +1440,7 @@ public class SilkSchemaLexer extends Lexer {
     // $ANTLR start "SafeLetter"\r
     public final void mSafeLetter() throws RecognitionException {\r
         try {\r
-            // SilkSchema.g:168:20: ( SafeFirstLetter | '0' .. '9' | '-' | '_' )\r
+            // SilkSchema.g:169: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
@@ -1419,11 +1465,11 @@ public class SilkSchemaLexer extends Lexer {
     // $ANTLR start "ModuleName"\r
     public final void mModuleName() throws RecognitionException {\r
         try {\r
-            // SilkSchema.g:170:20: ( SafeFirstLetter ( SafeLetter )* ( '.' SafeFirstLetter ( SafeLetter )* )* )\r
-            // SilkSchema.g:170:22: SafeFirstLetter ( SafeLetter )* ( '.' SafeFirstLetter ( SafeLetter )* )*\r
+            // SilkSchema.g:171:20: ( SafeFirstLetter ( SafeLetter )* ( '.' SafeFirstLetter ( SafeLetter )* )* )\r
+            // SilkSchema.g:171:22: SafeFirstLetter ( SafeLetter )* ( '.' SafeFirstLetter ( SafeLetter )* )*\r
             {\r
             mSafeFirstLetter(); if (state.failed) return ;\r
-            // SilkSchema.g:170:38: ( SafeLetter )*\r
+            // SilkSchema.g:171:38: ( SafeLetter )*\r
             loop16:\r
             do {\r
                 int alt16=2;\r
@@ -1436,7 +1482,7 @@ public class SilkSchemaLexer extends Lexer {
 \r
                 switch (alt16) {\r
                case 1 :\r
-                   // SilkSchema.g:170:38: SafeLetter\r
+                   // SilkSchema.g:171:38: SafeLetter\r
                    {\r
                    mSafeLetter(); if (state.failed) return ;\r
 \r
@@ -1448,7 +1494,7 @@ public class SilkSchemaLexer extends Lexer {
                 }\r
             } while (true);\r
 \r
-            // SilkSchema.g:170:50: ( '.' SafeFirstLetter ( SafeLetter )* )*\r
+            // SilkSchema.g:171:50: ( '.' SafeFirstLetter ( SafeLetter )* )*\r
             loop18:\r
             do {\r
                 int alt18=2;\r
@@ -1461,11 +1507,11 @@ public class SilkSchemaLexer extends Lexer {
 \r
                 switch (alt18) {\r
                case 1 :\r
-                   // SilkSchema.g:170:51: '.' SafeFirstLetter ( SafeLetter )*\r
+                   // SilkSchema.g:171:51: '.' SafeFirstLetter ( SafeLetter )*\r
                    {\r
                    match('.'); if (state.failed) return ;\r
                    mSafeFirstLetter(); if (state.failed) return ;\r
-                   // SilkSchema.g:170:71: ( SafeLetter )*\r
+                   // SilkSchema.g:171:71: ( SafeLetter )*\r
                    loop17:\r
                    do {\r
                        int alt17=2;\r
@@ -1478,7 +1524,7 @@ public class SilkSchemaLexer extends Lexer {
 \r
                        switch (alt17) {\r
                        case 1 :\r
-                           // SilkSchema.g:170:71: SafeLetter\r
+                           // SilkSchema.g:171:71: SafeLetter\r
                            {\r
                            mSafeLetter(); if (state.failed) return ;\r
 \r
@@ -1515,15 +1561,15 @@ public class SilkSchemaLexer extends Lexer {
             int _channel = DEFAULT_TOKEN_CHANNEL;\r
             Token s=null;\r
 \r
-            // SilkSchema.g:171:10: ( 'module' WhiteSpaces s= ModuleName )\r
-            // SilkSchema.g:171:12: 'module' WhiteSpaces s= ModuleName\r
+            // SilkSchema.g:172:10: ( 'module' WhiteSpaces s= ModuleName )\r
+            // SilkSchema.g:172:12: 'module' WhiteSpaces s= ModuleName\r
             {\r
             match("module"); if (state.failed) return ;\r
 \r
             mWhiteSpaces(); if (state.failed) return ;\r
-            int sStart689 = getCharIndex();\r
+            int sStart708 = getCharIndex();\r
             mModuleName(); if (state.failed) return ;\r
-            s = new CommonToken(input, Token.INVALID_TOKEN_TYPE, Token.DEFAULT_CHANNEL, sStart689, getCharIndex()-1);\r
+            s = new CommonToken(input, Token.INVALID_TOKEN_TYPE, Token.DEFAULT_CHANNEL, sStart708, getCharIndex()-1);\r
             if ( state.backtracking==0 ) {\r
                setText((s!=null?s.getText():null)); \r
             }\r
@@ -1541,8 +1587,8 @@ public class SilkSchemaLexer extends Lexer {
     // $ANTLR start "QNameChar"\r
     public final void mQNameChar() throws RecognitionException {\r
         try {\r
-            // SilkSchema.g:173:19: (~ ( LineBreakChar | UnsafeUnicodeChar | WhiteSpace ) )\r
-            // SilkSchema.g:173:21: ~ ( LineBreakChar | UnsafeUnicodeChar | WhiteSpace )\r
+            // SilkSchema.g:174:19: (~ ( LineBreakChar | UnsafeUnicodeChar | WhiteSpace ) )\r
+            // SilkSchema.g:174: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
@@ -1568,10 +1614,10 @@ public class SilkSchemaLexer extends Lexer {
         try {\r
             int _type = QName;\r
             int _channel = DEFAULT_TOKEN_CHANNEL;\r
-            // SilkSchema.g:174:6: ( ( QNameChar )+ ( Dot ( QNameChar )+ )* )\r
-            // SilkSchema.g:174:8: ( QNameChar )+ ( Dot ( QNameChar )+ )*\r
+            // SilkSchema.g:175:6: ( ( QNameChar )+ ( Dot ( QNameChar )+ )* )\r
+            // SilkSchema.g:175:8: ( QNameChar )+ ( Dot ( QNameChar )+ )*\r
             {\r
-            // SilkSchema.g:174:8: ( QNameChar )+\r
+            // SilkSchema.g:175:8: ( QNameChar )+\r
             int cnt19=0;\r
             loop19:\r
             do {\r
@@ -1585,7 +1631,7 @@ public class SilkSchemaLexer extends Lexer {
 \r
                 switch (alt19) {\r
                case 1 :\r
-                   // SilkSchema.g:174:8: QNameChar\r
+                   // SilkSchema.g:175:8: QNameChar\r
                    {\r
                    mQNameChar(); if (state.failed) return ;\r
 \r
@@ -1602,7 +1648,7 @@ public class SilkSchemaLexer extends Lexer {
                 cnt19++;\r
             } while (true);\r
 \r
-            // SilkSchema.g:174:19: ( Dot ( QNameChar )+ )*\r
+            // SilkSchema.g:175:19: ( Dot ( QNameChar )+ )*\r
             loop21:\r
             do {\r
                 int alt21=2;\r
@@ -1615,10 +1661,10 @@ public class SilkSchemaLexer extends Lexer {
 \r
                 switch (alt21) {\r
                case 1 :\r
-                   // SilkSchema.g:174:20: Dot ( QNameChar )+\r
+                   // SilkSchema.g:175:20: Dot ( QNameChar )+\r
                    {\r
                    mDot(); if (state.failed) return ;\r
-                   // SilkSchema.g:174:24: ( QNameChar )+\r
+                   // SilkSchema.g:175:24: ( QNameChar )+\r
                    int cnt20=0;\r
                    loop20:\r
                    do {\r
@@ -1632,7 +1678,7 @@ public class SilkSchemaLexer extends Lexer {
 \r
                        switch (alt20) {\r
                        case 1 :\r
-                           // SilkSchema.g:174:24: QNameChar\r
+                           // SilkSchema.g:175:24: QNameChar\r
                            {\r
                            mQNameChar(); if (state.failed) return ;\r
 \r
@@ -1672,7 +1718,7 @@ public class SilkSchemaLexer extends Lexer {
     // $ANTLR start "WhiteSpace"\r
     public final void mWhiteSpace() throws RecognitionException {\r
         try {\r
-            // SilkSchema.g:177:11: ( ' ' | '\\t' )\r
+            // SilkSchema.g:178:11: ( ' ' | '\\t' )\r
             // SilkSchema.g:\r
             {\r
             if ( input.LA(1)=='\t'||input.LA(1)==' ' ) {\r
@@ -1699,10 +1745,10 @@ public class SilkSchemaLexer extends Lexer {
         try {\r
             int _type = WhiteSpaces;\r
             int _channel = DEFAULT_TOKEN_CHANNEL;\r
-            // SilkSchema.g:179:12: ( ( WhiteSpace )+ )\r
-            // SilkSchema.g:179:14: ( WhiteSpace )+\r
+            // SilkSchema.g:180:12: ( ( WhiteSpace )+ )\r
+            // SilkSchema.g:180:14: ( WhiteSpace )+\r
             {\r
-            // SilkSchema.g:179:14: ( WhiteSpace )+\r
+            // SilkSchema.g:180:14: ( WhiteSpace )+\r
             int cnt22=0;\r
             loop22:\r
             do {\r
@@ -1716,7 +1762,7 @@ public class SilkSchemaLexer extends Lexer {
 \r
                 switch (alt22) {\r
                case 1 :\r
-                   // SilkSchema.g:179:14: WhiteSpace\r
+                   // SilkSchema.g:180:14: WhiteSpace\r
                    {\r
                    mWhiteSpace(); if (state.failed) return ;\r
 \r
@@ -1748,8 +1794,8 @@ public class SilkSchemaLexer extends Lexer {
     // $ANTLR end "WhiteSpaces"\r
 \r
     public void mTokens() throws RecognitionException {\r
-        // SilkSchema.g:1:8: ( Preamble | LineComment | LineBreak | String | Integer | Double | LBrace | RBrace | LBracket | RBracket | Lt | Eq | Dot | Comma | LParen | RParen | Star | Symbol | Class | Includes | End | Relation | ModuleDef | QName | WhiteSpaces )\r
-        int alt23=25;\r
+        // SilkSchema.g:1:8: ( Preamble | LineComment | LineBreak | String | Integer | Double | LBrace | RBrace | LBracket | RBracket | Lt | Eq | Dot | Comma | LParen | RParen | Star | Symbol | Class | Includes | End | Relation | Index | ModuleDef | QName | WhiteSpaces )\r
+        int alt23=26;\r
         alt23 = dfa23.predict(input);\r
         switch (alt23) {\r
             case 1 :\r
@@ -1907,21 +1953,28 @@ public class SilkSchemaLexer extends Lexer {
                 }\r
                 break;\r
             case 23 :\r
-                // SilkSchema.g:1:165: ModuleDef\r
+                // SilkSchema.g:1:165: Index\r
                 {\r
-                mModuleDef(); if (state.failed) return ;\r
+                mIndex(); if (state.failed) return ;\r
 \r
                 }\r
                 break;\r
             case 24 :\r
-                // SilkSchema.g:1:175: QName\r
+                // SilkSchema.g:1:171: ModuleDef\r
                 {\r
-                mQName(); if (state.failed) return ;\r
+                mModuleDef(); if (state.failed) return ;\r
 \r
                 }\r
                 break;\r
             case 25 :\r
-                // SilkSchema.g:1:181: WhiteSpaces\r
+                // SilkSchema.g:1:181: QName\r
+                {\r
+                mQName(); if (state.failed) return ;\r
+\r
+                }\r
+                break;\r
+            case 26 :\r
+                // SilkSchema.g:1:187: WhiteSpaces\r
                 {\r
                 mWhiteSpaces(); if (state.failed) return ;\r
 \r
@@ -1936,33 +1989,34 @@ public class SilkSchemaLexer extends Lexer {
     protected DFA23 dfa23 = new DFA23(this);\r
     static final String DFA23_eotS =\r
         "\6\uffff\2\35\5\uffff\1\41\6\uffff\5\31\2\uffff\2\35\2\uffff\1"+\r
-        "\31\1\35\1\uffff\5\31\1\uffff\1\35\1\47\1\31\1\47\2\31\1\64\5\31"+\r
-        "\1\uffff\3\31\1\47\1\75\3\31\1\uffff\5\31\1\uffff\1\106\1\107\2"+\r
-        "\uffff";\r
+        "\31\1\35\1\uffff\5\31\1\uffff\1\35\1\47\1\31\1\47\3\31\1\66\6\31"+\r
+        "\1\uffff\3\31\1\47\1\100\1\31\1\102\2\31\1\uffff\1\31\1\uffff\4"+\r
+        "\31\1\uffff\1\112\1\113\2\uffff";\r
     static final String DFA23_eofS =\r
-        "\110\uffff";\r
+        "\114\uffff";\r
     static final String DFA23_minS =\r
         "\1\0\4\uffff\1\60\2\0\5\uffff\1\0\6\uffff\1\154\2\156\1\145\1\157"+\r
         "\2\uffff\2\56\1\uffff\1\0\1\53\1\0\1\uffff\1\141\1\143\1\144\1\154"+\r
-        "\1\144\1\uffff\1\56\1\0\1\60\1\0\1\163\1\154\1\0\1\141\1\165\1\53"+\r
-        "\1\163\1\165\1\uffff\1\164\1\154\1\60\2\0\1\144\1\151\1\145\1\uffff"+\r
-        "\1\145\1\157\1\11\1\163\1\156\1\uffff\2\0\2\uffff";\r
+        "\1\144\1\uffff\1\56\1\0\1\60\1\0\1\163\1\154\1\145\1\0\1\141\1\165"+\r
+        "\1\53\1\163\1\165\1\170\1\uffff\1\164\1\154\1\60\2\0\1\144\1\0\1"+\r
+        "\151\1\145\1\uffff\1\145\1\uffff\1\157\1\11\1\163\1\156\1\uffff"+\r
+        "\2\0\2\uffff";\r
     static final String DFA23_maxS =\r
         "\1\uffff\4\uffff\1\71\2\uffff\5\uffff\1\uffff\6\uffff\1\154\2\156"+\r
         "\1\145\1\157\2\uffff\2\145\1\uffff\1\uffff\1\71\1\uffff\1\uffff"+\r
-        "\1\141\1\143\1\144\1\154\1\144\1\uffff\1\145\1\uffff\1\71\1\uffff"+\r
-        "\1\163\1\154\1\uffff\1\141\1\165\1\71\1\163\1\165\1\uffff\1\164"+\r
-        "\1\154\1\71\2\uffff\1\144\1\151\1\145\1\uffff\1\145\1\157\1\40\1"+\r
-        "\163\1\156\1\uffff\2\uffff\2\uffff";\r
+        "\1\141\2\144\1\154\1\144\1\uffff\1\145\1\uffff\1\71\1\uffff\1\163"+\r
+        "\1\154\1\145\1\uffff\1\141\1\165\1\71\1\163\1\165\1\170\1\uffff"+\r
+        "\1\164\1\154\1\71\2\uffff\1\144\1\uffff\1\151\1\145\1\uffff\1\145"+\r
+        "\1\uffff\1\157\1\40\1\163\1\156\1\uffff\2\uffff\2\uffff";\r
     static final String DFA23_acceptS =\r
         "\1\uffff\1\1\1\2\1\3\1\4\3\uffff\1\7\1\10\1\11\1\12\1\13\1\uffff"+\r
-        "\1\15\1\16\1\17\1\20\1\21\1\22\5\uffff\1\30\1\31\2\uffff\1\5\3\uffff"+\r
-        "\1\14\5\uffff\1\6\14\uffff\1\25\10\uffff\1\23\5\uffff\1\27\2\uffff"+\r
-        "\1\24\1\26";\r
+        "\1\15\1\16\1\17\1\20\1\21\1\22\5\uffff\1\31\1\32\2\uffff\1\5\3\uffff"+\r
+        "\1\14\5\uffff\1\6\16\uffff\1\25\11\uffff\1\23\1\uffff\1\27\4\uffff"+\r
+        "\1\30\2\uffff\1\24\1\26";\r
     static final String DFA23_specialS =\r
-        "\1\4\5\uffff\1\3\1\10\5\uffff\1\2\20\uffff\1\0\1\uffff\1\11\10"+\r
-        "\uffff\1\1\1\uffff\1\7\2\uffff\1\5\11\uffff\1\13\1\6\12\uffff\1"+\r
-        "\14\1\12\2\uffff}>";\r
+        "\1\10\5\uffff\1\2\1\14\5\uffff\1\13\20\uffff\1\12\1\uffff\1\1\10"+\r
+        "\uffff\1\5\1\uffff\1\11\3\uffff\1\3\12\uffff\1\7\1\0\1\uffff\1\6"+\r
+        "\12\uffff\1\4\1\15\2\uffff}>";\r
     static final String[] DFA23_transitionS = {\r
             "\11\31\1\32\1\3\2\31\1\3\22\31\1\32\1\31\1\4\1\2\1\31\1\1\1"+\r
             "\31\1\uffff\1\20\1\21\1\22\1\31\1\17\1\5\1\16\1\31\1\6\11\7"+\r
@@ -2018,54 +2072,61 @@ public class SilkSchemaLexer extends Lexer {
             "\7\31\1\37\25\31\3\uffff\uff82\31",\r
             "",\r
             "\1\54",\r
-            "\1\55",\r
-            "\1\56",\r
+            "\1\55\1\56",\r
             "\1\57",\r
             "\1\60",\r
+            "\1\61",\r
             "",\r
             "\1\47\1\uffff\12\50\13\uffff\1\47\37\uffff\1\47",\r
             "\11\31\2\uffff\2\31\1\uffff\22\31\1\uffff\1\31\2\uffff\1\31"+\r
             "\1\uffff\1\31\4\uffff\1\31\2\uffff\2\31\12\51\1\uffff\1\31\1"+\r
-            "\uffff\1\31\1\uffff\1\31\1\uffff\4\31\1\61\25\31\3\uffff\7\31"+\r
-            "\1\61\25\31\3\uffff\uff82\31",\r
+            "\uffff\1\31\1\uffff\1\31\1\uffff\4\31\1\62\25\31\3\uffff\7\31"+\r
+            "\1\62\25\31\3\uffff\uff82\31",\r
             "\12\53",\r
             "\11\31\2\uffff\2\31\1\uffff\22\31\1\uffff\1\31\2\uffff\1\31"+\r
             "\1\uffff\1\31\4\uffff\1\31\2\uffff\2\31\12\53\1\uffff\1\31\1"+\r
             "\uffff\1\31\1\uffff\1\31\1\uffff\32\31\3\uffff\35\31\3\uffff"+\r
             "\uff82\31",\r
-            "\1\62",\r
             "\1\63",\r
+            "\1\64",\r
+            "\1\65",\r
             "\11\31\2\uffff\2\31\1\uffff\22\31\1\uffff\1\31\2\uffff\1\31"+\r
             "\1\uffff\1\31\4\uffff\1\31\2\uffff\14\31\1\uffff\1\31\1\uffff"+\r
             "\1\31\1\uffff\1\31\1\uffff\32\31\3\uffff\35\31\3\uffff\uff82"+\r
             "\31",\r
-            "\1\65",\r
-            "\1\66",\r
-            "\1\67\1\uffff\1\47\2\uffff\12\70",\r
-            "\1\71",\r
-            "\1\72",\r
-            "",\r
+            "\1\67",\r
+            "\1\70",\r
+            "\1\71\1\uffff\1\47\2\uffff\12\72",\r
             "\1\73",\r
             "\1\74",\r
-            "\12\70",\r
+            "\1\75",\r
+            "",\r
+            "\1\76",\r
+            "\1\77",\r
+            "\12\72",\r
             "\11\31\2\uffff\2\31\1\uffff\22\31\1\uffff\1\31\2\uffff\1\31"+\r
-            "\1\uffff\1\31\4\uffff\1\31\2\uffff\2\31\12\70\1\uffff\1\31\1"+\r
+            "\1\uffff\1\31\4\uffff\1\31\2\uffff\2\31\12\72\1\uffff\1\31\1"+\r
             "\uffff\1\31\1\uffff\1\31\1\uffff\32\31\3\uffff\35\31\3\uffff"+\r
             "\uff82\31",\r
             "\11\31\2\uffff\2\31\1\uffff\22\31\1\uffff\1\31\2\uffff\1\31"+\r
             "\1\uffff\1\31\4\uffff\1\31\2\uffff\14\31\1\uffff\1\31\1\uffff"+\r
             "\1\31\1\uffff\1\31\1\uffff\32\31\3\uffff\35\31\3\uffff\uff82"+\r
             "\31",\r
-            "\1\76",\r
-            "\1\77",\r
-            "\1\100",\r
-            "",\r
             "\1\101",\r
-            "\1\102",\r
-            "\1\103\26\uffff\1\103",\r
+            "\11\31\2\uffff\2\31\1\uffff\22\31\1\uffff\1\31\2\uffff\1\31"+\r
+            "\1\uffff\1\31\4\uffff\1\31\2\uffff\14\31\1\uffff\1\31\1\uffff"+\r
+            "\1\31\1\uffff\1\31\1\uffff\32\31\3\uffff\35\31\3\uffff\uff82"+\r
+            "\31",\r
+            "\1\103",\r
             "\1\104",\r
+            "",\r
             "\1\105",\r
             "",\r
+            "\1\106",\r
+            "\1\107\26\uffff\1\107",\r
+            "\1\110",\r
+            "\1\111",\r
+            "",\r
             "\11\31\2\uffff\2\31\1\uffff\22\31\1\uffff\1\31\2\uffff\1\31"+\r
             "\1\uffff\1\31\4\uffff\1\31\2\uffff\14\31\1\uffff\1\31\1\uffff"+\r
             "\1\31\1\uffff\1\31\1\uffff\32\31\3\uffff\35\31\3\uffff\uff82"+\r
@@ -2108,29 +2169,79 @@ public class SilkSchemaLexer extends Lexer {
             this.transition = DFA23_transition;\r
         }\r
         public String getDescription() {\r
-            return "1:1: Tokens : ( Preamble | LineComment | LineBreak | String | Integer | Double | LBrace | RBrace | LBracket | RBracket | Lt | Eq | Dot | Comma | LParen | RParen | Star | Symbol | Class | Includes | End | Relation | ModuleDef | QName | WhiteSpaces );";\r
+            return "1:1: Tokens : ( Preamble | LineComment | LineBreak | String | Integer | Double | LBrace | RBrace | LBracket | RBracket | Lt | Eq | Dot | Comma | LParen | RParen | Star | Symbol | Class | Includes | End | Relation | Index | 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_30 = input.LA(1);\r
+                        int LA23_59 = input.LA(1);\r
 \r
                         s = -1;\r
-                        if ( ((LA23_30>='0' && LA23_30<='9')) ) {s = 41;}\r
+                        if ( ((LA23_59>='\u0000' && LA23_59<='\b')||(LA23_59>='\u000B' && LA23_59<='\f')||(LA23_59>='\u000E' && LA23_59<='\u001F')||LA23_59=='!'||LA23_59=='$'||LA23_59=='&'||LA23_59=='+'||(LA23_59>='.' && LA23_59<='9')||LA23_59==';'||LA23_59=='='||LA23_59=='?'||(LA23_59>='A' && LA23_59<='Z')||(LA23_59>='^' && LA23_59<='z')||(LA23_59>='~' && LA23_59<='\uFFFF')) ) {s = 25;}\r
 \r
-                        else 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==';'||LA23_30=='='||LA23_30=='?'||(LA23_30>='A' && LA23_30<='Z')||(LA23_30>='^' && LA23_30<='z')||(LA23_30>='~' && LA23_30<='\uFFFF')) ) {s = 25;}\r
+                        else s = 64;\r
 \r
                         if ( s>=0 ) return s;\r
                         break;\r
                     case 1 : \r
+                        int LA23_32 = input.LA(1);\r
+\r
+                        s = -1;\r
+                        if ( (LA23_32=='.') ) {s = 30;}\r
+\r
+                        else if ( (LA23_32=='E'||LA23_32=='e') ) {s = 31;}\r
+\r
+                        else if ( ((LA23_32>='0' && LA23_32<='9')) ) {s = 32;}\r
+\r
+                        else if ( ((LA23_32>='\u0000' && LA23_32<='\b')||(LA23_32>='\u000B' && LA23_32<='\f')||(LA23_32>='\u000E' && LA23_32<='\u001F')||LA23_32=='!'||LA23_32=='$'||LA23_32=='&'||LA23_32=='+'||LA23_32=='/'||LA23_32==';'||LA23_32=='='||LA23_32=='?'||(LA23_32>='A' && LA23_32<='D')||(LA23_32>='F' && LA23_32<='Z')||(LA23_32>='^' && LA23_32<='d')||(LA23_32>='f' && LA23_32<='z')||(LA23_32>='~' && LA23_32<='\uFFFF')) ) {s = 25;}\r
+\r
+                        else s = 29;\r
+\r
+                        if ( s>=0 ) return s;\r
+                        break;\r
+                    case 2 : \r
+                        int LA23_6 = input.LA(1);\r
+\r
+                        s = -1;\r
+                        if ( (LA23_6=='.') ) {s = 30;}\r
+\r
+                        else if ( (LA23_6=='E'||LA23_6=='e') ) {s = 31;}\r
+\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 = 25;}\r
+\r
+                        else s = 29;\r
+\r
+                        if ( s>=0 ) return s;\r
+                        break;\r
+                    case 3 : \r
+                        int LA23_47 = input.LA(1);\r
+\r
+                        s = -1;\r
+                        if ( ((LA23_47>='\u0000' && LA23_47<='\b')||(LA23_47>='\u000B' && LA23_47<='\f')||(LA23_47>='\u000E' && LA23_47<='\u001F')||LA23_47=='!'||LA23_47=='$'||LA23_47=='&'||LA23_47=='+'||(LA23_47>='.' && LA23_47<='9')||LA23_47==';'||LA23_47=='='||LA23_47=='?'||(LA23_47>='A' && LA23_47<='Z')||(LA23_47>='^' && LA23_47<='z')||(LA23_47>='~' && LA23_47<='\uFFFF')) ) {s = 25;}\r
+\r
+                        else s = 54;\r
+\r
+                        if ( s>=0 ) return s;\r
+                        break;\r
+                    case 4 : \r
+                        int LA23_72 = input.LA(1);\r
+\r
+                        s = -1;\r
+                        if ( ((LA23_72>='\u0000' && LA23_72<='\b')||(LA23_72>='\u000B' && LA23_72<='\f')||(LA23_72>='\u000E' && LA23_72<='\u001F')||LA23_72=='!'||LA23_72=='$'||LA23_72=='&'||LA23_72=='+'||(LA23_72>='.' && LA23_72<='9')||LA23_72==';'||LA23_72=='='||LA23_72=='?'||(LA23_72>='A' && LA23_72<='Z')||(LA23_72>='^' && LA23_72<='z')||(LA23_72>='~' && LA23_72<='\uFFFF')) ) {s = 25;}\r
+\r
+                        else s = 74;\r
+\r
+                        if ( s>=0 ) return s;\r
+                        break;\r
+                    case 5 : \r
                         int LA23_41 = input.LA(1);\r
 \r
                         s = -1;\r
                         if ( ((LA23_41>='\u0000' && LA23_41<='\b')||(LA23_41>='\u000B' && LA23_41<='\f')||(LA23_41>='\u000E' && LA23_41<='\u001F')||LA23_41=='!'||LA23_41=='$'||LA23_41=='&'||LA23_41=='+'||(LA23_41>='.' && LA23_41<='/')||LA23_41==';'||LA23_41=='='||LA23_41=='?'||(LA23_41>='A' && LA23_41<='D')||(LA23_41>='F' && LA23_41<='Z')||(LA23_41>='^' && LA23_41<='d')||(LA23_41>='f' && LA23_41<='z')||(LA23_41>='~' && LA23_41<='\uFFFF')) ) {s = 25;}\r
 \r
-                        else if ( (LA23_41=='E'||LA23_41=='e') ) {s = 49;}\r
+                        else if ( (LA23_41=='E'||LA23_41=='e') ) {s = 50;}\r
 \r
                         else if ( ((LA23_41>='0' && LA23_41<='9')) ) {s = 41;}\r
 \r
@@ -2138,31 +2249,29 @@ public class SilkSchemaLexer extends Lexer {
 \r
                         if ( s>=0 ) return s;\r
                         break;\r
-                    case 2 : \r
-                        int LA23_13 = input.LA(1);\r
+                    case 6 : \r
+                        int LA23_61 = input.LA(1);\r
 \r
                         s = -1;\r
-                        if ( ((LA23_13>='\u0000' && LA23_13<='\b')||(LA23_13>='\u000B' && LA23_13<='\f')||(LA23_13>='\u000E' && LA23_13<='\u001F')||LA23_13=='!'||LA23_13=='$'||LA23_13=='&'||LA23_13=='+'||(LA23_13>='.' && LA23_13<='9')||LA23_13==';'||LA23_13=='='||LA23_13=='?'||(LA23_13>='A' && LA23_13<='Z')||(LA23_13>='^' && LA23_13<='z')||(LA23_13>='~' && LA23_13<='\uFFFF')) ) {s = 25;}\r
+                        if ( ((LA23_61>='\u0000' && LA23_61<='\b')||(LA23_61>='\u000B' && LA23_61<='\f')||(LA23_61>='\u000E' && LA23_61<='\u001F')||LA23_61=='!'||LA23_61=='$'||LA23_61=='&'||LA23_61=='+'||(LA23_61>='.' && LA23_61<='9')||LA23_61==';'||LA23_61=='='||LA23_61=='?'||(LA23_61>='A' && LA23_61<='Z')||(LA23_61>='^' && LA23_61<='z')||(LA23_61>='~' && LA23_61<='\uFFFF')) ) {s = 25;}\r
 \r
-                        else s = 33;\r
+                        else s = 66;\r
 \r
                         if ( s>=0 ) return s;\r
                         break;\r
-                    case 3 : \r
-                        int LA23_6 = input.LA(1);\r
+                    case 7 : \r
+                        int LA23_58 = input.LA(1);\r
 \r
                         s = -1;\r
-                        if ( (LA23_6=='.') ) {s = 30;}\r
+                        if ( ((LA23_58>='\u0000' && LA23_58<='\b')||(LA23_58>='\u000B' && LA23_58<='\f')||(LA23_58>='\u000E' && LA23_58<='\u001F')||LA23_58=='!'||LA23_58=='$'||LA23_58=='&'||LA23_58=='+'||(LA23_58>='.' && LA23_58<='/')||LA23_58==';'||LA23_58=='='||LA23_58=='?'||(LA23_58>='A' && LA23_58<='Z')||(LA23_58>='^' && LA23_58<='z')||(LA23_58>='~' && LA23_58<='\uFFFF')) ) {s = 25;}\r
 \r
-                        else if ( (LA23_6=='E'||LA23_6=='e') ) {s = 31;}\r
-\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 = 25;}\r
+                        else if ( ((LA23_58>='0' && LA23_58<='9')) ) {s = 58;}\r
 \r
-                        else s = 29;\r
+                        else s = 39;\r
 \r
                         if ( s>=0 ) return s;\r
                         break;\r
-                    case 4 : \r
+                    case 8 : \r
                         int LA23_0 = input.LA(1);\r
 \r
                          \r
@@ -2225,45 +2334,45 @@ public class SilkSchemaLexer extends Lexer {
                         input.seek(index23_0);\r
                         if ( s>=0 ) return s;\r
                         break;\r
-                    case 5 : \r
-                        int LA23_46 = input.LA(1);\r
+                    case 9 : \r
+                        int LA23_43 = input.LA(1);\r
 \r
                         s = -1;\r
-                        if ( ((LA23_46>='\u0000' && LA23_46<='\b')||(LA23_46>='\u000B' && LA23_46<='\f')||(LA23_46>='\u000E' && LA23_46<='\u001F')||LA23_46=='!'||LA23_46=='$'||LA23_46=='&'||LA23_46=='+'||(LA23_46>='.' && LA23_46<='9')||LA23_46==';'||LA23_46=='='||LA23_46=='?'||(LA23_46>='A' && LA23_46<='Z')||(LA23_46>='^' && LA23_46<='z')||(LA23_46>='~' && LA23_46<='\uFFFF')) ) {s = 25;}\r
+                        if ( ((LA23_43>='\u0000' && LA23_43<='\b')||(LA23_43>='\u000B' && LA23_43<='\f')||(LA23_43>='\u000E' && LA23_43<='\u001F')||LA23_43=='!'||LA23_43=='$'||LA23_43=='&'||LA23_43=='+'||(LA23_43>='.' && LA23_43<='/')||LA23_43==';'||LA23_43=='='||LA23_43=='?'||(LA23_43>='A' && LA23_43<='Z')||(LA23_43>='^' && LA23_43<='z')||(LA23_43>='~' && LA23_43<='\uFFFF')) ) {s = 25;}\r
 \r
-                        else s = 52;\r
+                        else if ( ((LA23_43>='0' && LA23_43<='9')) ) {s = 43;}\r
+\r
+                        else s = 39;\r
 \r
                         if ( s>=0 ) return s;\r
                         break;\r
-                    case 6 : \r
-                        int LA23_57 = input.LA(1);\r
+                    case 10 : \r
+                        int LA23_30 = input.LA(1);\r
 \r
                         s = -1;\r
-                        if ( ((LA23_57>='\u0000' && LA23_57<='\b')||(LA23_57>='\u000B' && LA23_57<='\f')||(LA23_57>='\u000E' && LA23_57<='\u001F')||LA23_57=='!'||LA23_57=='$'||LA23_57=='&'||LA23_57=='+'||(LA23_57>='.' && LA23_57<='9')||LA23_57==';'||LA23_57=='='||LA23_57=='?'||(LA23_57>='A' && LA23_57<='Z')||(LA23_57>='^' && LA23_57<='z')||(LA23_57>='~' && LA23_57<='\uFFFF')) ) {s = 25;}\r
+                        if ( ((LA23_30>='0' && LA23_30<='9')) ) {s = 41;}\r
 \r
-                        else s = 61;\r
+                        else 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==';'||LA23_30=='='||LA23_30=='?'||(LA23_30>='A' && LA23_30<='Z')||(LA23_30>='^' && LA23_30<='z')||(LA23_30>='~' && LA23_30<='\uFFFF')) ) {s = 25;}\r
 \r
                         if ( s>=0 ) return s;\r
                         break;\r
-                    case 7 : \r
-                        int LA23_43 = input.LA(1);\r
+                    case 11 : \r
+                        int LA23_13 = input.LA(1);\r
 \r
                         s = -1;\r
-                        if ( ((LA23_43>='0' && LA23_43<='9')) ) {s = 43;}\r
-\r
-                        else if ( ((LA23_43>='\u0000' && LA23_43<='\b')||(LA23_43>='\u000B' && LA23_43<='\f')||(LA23_43>='\u000E' && LA23_43<='\u001F')||LA23_43=='!'||LA23_43=='$'||LA23_43=='&'||LA23_43=='+'||(LA23_43>='.' && LA23_43<='/')||LA23_43==';'||LA23_43=='='||LA23_43=='?'||(LA23_43>='A' && LA23_43<='Z')||(LA23_43>='^' && LA23_43<='z')||(LA23_43>='~' && LA23_43<='\uFFFF')) ) {s = 25;}\r
+                        if ( ((LA23_13>='\u0000' && LA23_13<='\b')||(LA23_13>='\u000B' && LA23_13<='\f')||(LA23_13>='\u000E' && LA23_13<='\u001F')||LA23_13=='!'||LA23_13=='$'||LA23_13=='&'||LA23_13=='+'||(LA23_13>='.' && LA23_13<='9')||LA23_13==';'||LA23_13=='='||LA23_13=='?'||(LA23_13>='A' && LA23_13<='Z')||(LA23_13>='^' && LA23_13<='z')||(LA23_13>='~' && LA23_13<='\uFFFF')) ) {s = 25;}\r
 \r
-                        else s = 39;\r
+                        else s = 33;\r
 \r
                         if ( s>=0 ) return s;\r
                         break;\r
-                    case 8 : \r
+                    case 12 : \r
                         int LA23_7 = input.LA(1);\r
 \r
                         s = -1;\r
-                        if ( ((LA23_7>='0' && LA23_7<='9')) ) {s = 32;}\r
+                        if ( (LA23_7=='.') ) {s = 30;}\r
 \r
-                        else if ( (LA23_7=='.') ) {s = 30;}\r
+                        else if ( ((LA23_7>='0' && LA23_7<='9')) ) {s = 32;}\r
 \r
                         else if ( (LA23_7=='E'||LA23_7=='e') ) {s = 31;}\r
 \r
@@ -2273,51 +2382,13 @@ public class SilkSchemaLexer extends Lexer {
 \r
                         if ( s>=0 ) return s;\r
                         break;\r
-                    case 9 : \r
-                        int LA23_32 = input.LA(1);\r
-\r
-                        s = -1;\r
-                        if ( (LA23_32=='.') ) {s = 30;}\r
-\r
-                        else if ( (LA23_32=='E'||LA23_32=='e') ) {s = 31;}\r
-\r
-                        else if ( ((LA23_32>='0' && LA23_32<='9')) ) {s = 32;}\r
-\r
-                        else if ( ((LA23_32>='\u0000' && LA23_32<='\b')||(LA23_32>='\u000B' && LA23_32<='\f')||(LA23_32>='\u000E' && LA23_32<='\u001F')||LA23_32=='!'||LA23_32=='$'||LA23_32=='&'||LA23_32=='+'||LA23_32=='/'||LA23_32==';'||LA23_32=='='||LA23_32=='?'||(LA23_32>='A' && LA23_32<='D')||(LA23_32>='F' && LA23_32<='Z')||(LA23_32>='^' && LA23_32<='d')||(LA23_32>='f' && LA23_32<='z')||(LA23_32>='~' && LA23_32<='\uFFFF')) ) {s = 25;}\r
-\r
-                        else s = 29;\r
-\r
-                        if ( s>=0 ) return s;\r
-                        break;\r
-                    case 10 : \r
-                        int LA23_69 = input.LA(1);\r
-\r
-                        s = -1;\r
-                        if ( ((LA23_69>='\u0000' && LA23_69<='\b')||(LA23_69>='\u000B' && LA23_69<='\f')||(LA23_69>='\u000E' && LA23_69<='\u001F')||LA23_69=='!'||LA23_69=='$'||LA23_69=='&'||LA23_69=='+'||(LA23_69>='.' && LA23_69<='9')||LA23_69==';'||LA23_69=='='||LA23_69=='?'||(LA23_69>='A' && LA23_69<='Z')||(LA23_69>='^' && LA23_69<='z')||(LA23_69>='~' && LA23_69<='\uFFFF')) ) {s = 25;}\r
-\r
-                        else s = 71;\r
-\r
-                        if ( s>=0 ) return s;\r
-                        break;\r
-                    case 11 : \r
-                        int LA23_56 = 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<='/')||LA23_56==';'||LA23_56=='='||LA23_56=='?'||(LA23_56>='A' && LA23_56<='Z')||(LA23_56>='^' && LA23_56<='z')||(LA23_56>='~' && LA23_56<='\uFFFF')) ) {s = 25;}\r
-\r
-                        else if ( ((LA23_56>='0' && LA23_56<='9')) ) {s = 56;}\r
-\r
-                        else s = 39;\r
-\r
-                        if ( s>=0 ) return s;\r
-                        break;\r
-                    case 12 : \r
-                        int LA23_68 = input.LA(1);\r
+                    case 13 : \r
+                        int LA23_73 = input.LA(1);\r
 \r
                         s = -1;\r
-                        if ( ((LA23_68>='\u0000' && LA23_68<='\b')||(LA23_68>='\u000B' && LA23_68<='\f')||(LA23_68>='\u000E' && LA23_68<='\u001F')||LA23_68=='!'||LA23_68=='$'||LA23_68=='&'||LA23_68=='+'||(LA23_68>='.' && LA23_68<='9')||LA23_68==';'||LA23_68=='='||LA23_68=='?'||(LA23_68>='A' && LA23_68<='Z')||(LA23_68>='^' && LA23_68<='z')||(LA23_68>='~' && LA23_68<='\uFFFF')) ) {s = 25;}\r
+                        if ( ((LA23_73>='\u0000' && LA23_73<='\b')||(LA23_73>='\u000B' && LA23_73<='\f')||(LA23_73>='\u000E' && LA23_73<='\u001F')||LA23_73=='!'||LA23_73=='$'||LA23_73=='&'||LA23_73=='+'||(LA23_73>='.' && LA23_73<='9')||LA23_73==';'||LA23_73=='='||LA23_73=='?'||(LA23_73>='A' && LA23_73<='Z')||(LA23_73>='^' && LA23_73<='z')||(LA23_73>='~' && LA23_73<='\uFFFF')) ) {s = 25;}\r
 \r
-                        else s = 70;\r
+                        else s = 75;\r
 \r
                         if ( s>=0 ) return s;\r
                         break;\r
index e22e424..b95b32c 100644 (file)
@@ -1,4 +1,4 @@
-// $ANTLR 3.1.3 Mar 17, 2009 19:23:44 SilkSchema.g 2009-07-03 16:06:13\r
+// $ANTLR 3.1.3 Mar 17, 2009 19:23:44 SilkSchema.g 2009-07-06 16:30:58\r
 \r
 /*--------------------------------------------------------------------------\r
  *  Copyright 2009 Taro L. Saito\r
@@ -35,53 +35,55 @@ 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", "Value", "LineBreakChar", "Preamble", "LineComment", "LineBreak", "Digit", "Letter", "HexDigit", "UnicodeChar", "EscapeSequence", "StringChar", "StringChar_s", "String", "Integer", "Frac", "Exp", "Double", "LBrace", "RBrace", "LBracket", "RBracket", "Lt", "Eq", "Dot", "Comma", "LParen", "RParen", "Star", "UnsafeUnicodeChar", "NonWhiteSpaceChar", "Symbol", "Class", "Includes", "End", "Relation", "SafeFirstLetter", "SafeLetter", "ModuleName", "WhiteSpaces", "ModuleDef", "WhiteSpace", "QNameChar", "QName"\r
+        "<invalid>", "<EOR>", "<DOWN>", "<UP>", "Schema", "Module", "ClassDef", "Name", "Parent", "Mixin", "Attribute", "IsArray", "TypeName", "DefaultValue", "LineBreakChar", "Preamble", "LineComment", "LineBreak", "Digit", "Letter", "HexDigit", "UnicodeChar", "EscapeSequence", "StringChar", "StringChar_s", "String", "Integer", "Frac", "Exp", "Double", "LBrace", "RBrace", "LBracket", "RBracket", "Lt", "Eq", "Dot", "Comma", "LParen", "RParen", "Star", "UnsafeUnicodeChar", "NonWhiteSpaceChar", "SymbolChars", "Symbol", "Class", "Includes", "End", "Relation", "Index", "SafeFirstLetter", "SafeLetter", "ModuleName", "WhiteSpaces", "ModuleDef", "WhiteSpace", "QNameChar", "QName"\r
     };\r
-    public static final int Includes=45;\r
+    public static final int Includes=46;\r
     public static final int RBrace=31;\r
     public static final int NonWhiteSpaceChar=42;\r
-    public static final int Class=44;\r
+    public static final int Class=45;\r
     public static final int LBracket=32;\r
     public static final int Digit=18;\r
+    public static final int SymbolChars=43;\r
     public static final int Frac=27;\r
     public static final int HexDigit=20;\r
-    public static final int Symbol=43;\r
+    public static final int Symbol=44;\r
+    public static final int Index=49;\r
     public static final int Module=5;\r
     public static final int Letter=19;\r
     public static final int Attribute=10;\r
     public static final int Comma=37;\r
     public static final int Schema=4;\r
     public static final int Dot=36;\r
-    public static final int End=46;\r
+    public static final int End=47;\r
     public static final int EscapeSequence=22;\r
+    public static final int DefaultValue=13;\r
     public static final int Integer=26;\r
-    public static final int Relation=47;\r
+    public static final int Relation=48;\r
     public static final int Mixin=9;\r
-    public static final int WhiteSpace=53;\r
+    public static final int WhiteSpace=55;\r
     public static final int ClassDef=6;\r
     public static final int LineComment=16;\r
-    public static final int ModuleName=50;\r
-    public static final int SafeFirstLetter=48;\r
+    public static final int ModuleName=52;\r
+    public static final int SafeFirstLetter=50;\r
     public static final int Star=40;\r
     public static final int Eq=35;\r
     public static final int Preamble=15;\r
     public static final int Exp=28;\r
-    public static final int QNameChar=54;\r
+    public static final int QNameChar=56;\r
     public static final int RParen=39;\r
     public static final int UnicodeChar=21;\r
     public static final int StringChar=23;\r
     public static final int LineBreak=17;\r
     public static final int Name=7;\r
-    public static final int ModuleDef=52;\r
+    public static final int ModuleDef=54;\r
     public static final int LParen=38;\r
     public static final int String=25;\r
-    public static final int SafeLetter=49;\r
+    public static final int SafeLetter=51;\r
     public static final int LineBreakChar=14;\r
     public static final int IsArray=11;\r
-    public static final int QName=55;\r
+    public static final int QName=57;\r
     public static final int EOF=-1;\r
     public static final int StringChar_s=24;\r
-    public static final int Value=13;\r
     public static final int UnsafeUnicodeChar=41;\r
     public static final int Double=29;\r
     public static final int LBrace=30;\r
@@ -89,7 +91,7 @@ public class SilkSchemaParser extends Parser {
     public static final int Lt=34;\r
     public static final int Parent=8;\r
     public static final int TypeName=12;\r
-    public static final int WhiteSpaces=51;\r
+    public static final int WhiteSpaces=53;\r
 \r
     // delegates\r
     // delegators\r
@@ -122,7 +124,7 @@ public class SilkSchemaParser extends Parser {
     };\r
 \r
     // $ANTLR start "schema"\r
-    // SilkSchema.g:184:1: schema : ( Preamble )? ( schemaElement )* -> ^( Schema ( Preamble )? ( schemaElement )* ) ;\r
+    // SilkSchema.g:185: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
@@ -137,10 +139,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:184:7: ( ( Preamble )? ( schemaElement )* -> ^( Schema ( Preamble )? ( schemaElement )* ) )\r
-            // SilkSchema.g:184:10: ( Preamble )? ( schemaElement )*\r
+            // SilkSchema.g:185:7: ( ( Preamble )? ( schemaElement )* -> ^( Schema ( Preamble )? ( schemaElement )* ) )\r
+            // SilkSchema.g:185:10: ( Preamble )? ( schemaElement )*\r
             {\r
-            // SilkSchema.g:184:10: ( Preamble )?\r
+            // SilkSchema.g:185:10: ( Preamble )?\r
             int alt1=2;\r
             int LA1_0 = input.LA(1);\r
 \r
@@ -149,9 +151,9 @@ public class SilkSchemaParser extends Parser {
             }\r
             switch (alt1) {\r
                 case 1 :\r
-                    // SilkSchema.g:184:10: Preamble\r
+                    // SilkSchema.g:185:10: Preamble\r
                     {\r
-                    Preamble1=(Token)match(input,Preamble,FOLLOW_Preamble_in_schema818);  \r
+                    Preamble1=(Token)match(input,Preamble,FOLLOW_Preamble_in_schema835);  \r
                     stream_Preamble.add(Preamble1);\r
 \r
 \r
@@ -160,7 +162,7 @@ public class SilkSchemaParser extends Parser {
 \r
             }\r
 \r
-            // SilkSchema.g:184:20: ( schemaElement )*\r
+            // SilkSchema.g:185:20: ( schemaElement )*\r
             loop2:\r
             do {\r
                 int alt2=2;\r
@@ -173,9 +175,9 @@ public class SilkSchemaParser extends Parser {
 \r
                 switch (alt2) {\r
                case 1 :\r
-                   // SilkSchema.g:184:20: schemaElement\r
+                   // SilkSchema.g:185:20: schemaElement\r
                    {\r
-                   pushFollow(FOLLOW_schemaElement_in_schema821);\r
+                   pushFollow(FOLLOW_schemaElement_in_schema838);\r
                    schemaElement2=schemaElement();\r
 \r
                    state._fsp--;\r
@@ -193,7 +195,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
@@ -203,20 +205,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
-            // 184:36: -> ^( Schema ( Preamble )? ( schemaElement )* )\r
+            // 185:36: -> ^( Schema ( Preamble )? ( schemaElement )* )\r
             {\r
-                // SilkSchema.g:184:39: ^( Schema ( Preamble )? ( schemaElement )* )\r
+                // SilkSchema.g:185: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:184:48: ( Preamble )?\r
+                // SilkSchema.g:185:48: ( Preamble )?\r
                 if ( stream_Preamble.hasNext() ) {\r
                     adaptor.addChild(root_1, stream_Preamble.nextNode());\r
 \r
                 }\r
                 stream_Preamble.reset();\r
-                // SilkSchema.g:184:58: ( schemaElement )*\r
+                // SilkSchema.g:185:58: ( schemaElement )*\r
                 while ( stream_schemaElement.hasNext() ) {\r
                     adaptor.addChild(root_1, stream_schemaElement.nextTree());\r
 \r
@@ -255,7 +257,7 @@ public class SilkSchemaParser extends Parser {
     };\r
 \r
     // $ANTLR start "schemaElement"\r
-    // SilkSchema.g:187:1: schemaElement : ( classDefinition | moduleDefinition );\r
+    // SilkSchema.g:188:1: schemaElement : ( classDefinition | 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
@@ -269,7 +271,7 @@ public class SilkSchemaParser extends Parser {
 \r
 \r
         try {\r
-            // SilkSchema.g:188:3: ( classDefinition | moduleDefinition )\r
+            // SilkSchema.g:189:3: ( classDefinition | moduleDefinition )\r
             int alt3=2;\r
             int LA3_0 = input.LA(1);\r
 \r
@@ -287,11 +289,11 @@ public class SilkSchemaParser extends Parser {
             }\r
             switch (alt3) {\r
                 case 1 :\r
-                    // SilkSchema.g:188:5: classDefinition\r
+                    // SilkSchema.g:189:5: classDefinition\r
                     {\r
                     root_0 = (Object)adaptor.nil();\r
 \r
-                    pushFollow(FOLLOW_classDefinition_in_schemaElement849);\r
+                    pushFollow(FOLLOW_classDefinition_in_schemaElement866);\r
                     classDefinition3=classDefinition();\r
 \r
                     state._fsp--;\r
@@ -301,11 +303,11 @@ public class SilkSchemaParser extends Parser {
                     }\r
                     break;\r
                 case 2 :\r
-                    // SilkSchema.g:189:5: moduleDefinition\r
+                    // SilkSchema.g:190:5: moduleDefinition\r
                     {\r
                     root_0 = (Object)adaptor.nil();\r
 \r
-                    pushFollow(FOLLOW_moduleDefinition_in_schemaElement856);\r
+                    pushFollow(FOLLOW_moduleDefinition_in_schemaElement873);\r
                     moduleDefinition4=moduleDefinition();\r
 \r
                     state._fsp--;\r
@@ -340,7 +342,7 @@ public class SilkSchemaParser extends Parser {
     };\r
 \r
     // $ANTLR start "moduleDefinition"\r
-    // SilkSchema.g:193:1: moduleDefinition : ModuleDef ( classDefinition )* End -> ^( Module Name[$ModuleDef.text] ( classDefinition )* ) ;\r
+    // SilkSchema.g:194:1: moduleDefinition : ModuleDef ( classDefinition )* End -> ^( Module Name[$ModuleDef.text] ( classDefinition )* ) ;\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
@@ -358,13 +360,13 @@ public class SilkSchemaParser extends Parser {
         RewriteRuleTokenStream stream_ModuleDef=new RewriteRuleTokenStream(adaptor,"token ModuleDef");\r
         RewriteRuleSubtreeStream stream_classDefinition=new RewriteRuleSubtreeStream(adaptor,"rule classDefinition");\r
         try {\r
-            // SilkSchema.g:193:17: ( ModuleDef ( classDefinition )* End -> ^( Module Name[$ModuleDef.text] ( classDefinition )* ) )\r
-            // SilkSchema.g:194:2: ModuleDef ( classDefinition )* End\r
+            // SilkSchema.g:194:17: ( ModuleDef ( classDefinition )* End -> ^( Module Name[$ModuleDef.text] ( classDefinition )* ) )\r
+            // SilkSchema.g:195:2: ModuleDef ( classDefinition )* End\r
             {\r
-            ModuleDef5=(Token)match(input,ModuleDef,FOLLOW_ModuleDef_in_moduleDefinition868);  \r
+            ModuleDef5=(Token)match(input,ModuleDef,FOLLOW_ModuleDef_in_moduleDefinition885);  \r
             stream_ModuleDef.add(ModuleDef5);\r
 \r
-            // SilkSchema.g:194:12: ( classDefinition )*\r
+            // SilkSchema.g:195:12: ( classDefinition )*\r
             loop4:\r
             do {\r
                 int alt4=2;\r
@@ -377,9 +379,9 @@ public class SilkSchemaParser extends Parser {
 \r
                 switch (alt4) {\r
                case 1 :\r
-                   // SilkSchema.g:194:12: classDefinition\r
+                   // SilkSchema.g:195:12: classDefinition\r
                    {\r
-                   pushFollow(FOLLOW_classDefinition_in_moduleDefinition870);\r
+                   pushFollow(FOLLOW_classDefinition_in_moduleDefinition887);\r
                    classDefinition6=classDefinition();\r
 \r
                    state._fsp--;\r
@@ -394,7 +396,7 @@ public class SilkSchemaParser extends Parser {
                 }\r
             } while (true);\r
 \r
-            End7=(Token)match(input,End,FOLLOW_End_in_moduleDefinition873);  \r
+            End7=(Token)match(input,End,FOLLOW_End_in_moduleDefinition890);  \r
             stream_End.add(End7);\r
 \r
 \r
@@ -410,15 +412,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
-            // 195:2: -> ^( Module Name[$ModuleDef.text] ( classDefinition )* )\r
+            // 196:2: -> ^( Module Name[$ModuleDef.text] ( classDefinition )* )\r
             {\r
-                // SilkSchema.g:195:5: ^( Module Name[$ModuleDef.text] ( classDefinition )* )\r
+                // SilkSchema.g:196:5: ^( Module Name[$ModuleDef.text] ( classDefinition )* )\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, (ModuleDef5!=null?ModuleDef5.getText():null)));\r
-                // SilkSchema.g:195:36: ( classDefinition )*\r
+                // SilkSchema.g:196:36: ( classDefinition )*\r
                 while ( stream_classDefinition.hasNext() ) {\r
                     adaptor.addChild(root_1, stream_classDefinition.nextTree());\r
 \r
@@ -457,7 +459,7 @@ public class SilkSchemaParser extends Parser {
     };\r
 \r
     // $ANTLR start "classDefinition"\r
-    // SilkSchema.g:198:1: classDefinition : ( Class QName classBody End -> ^( ClassDef Name[$QName.text] classBody ) | Relation QName classBody End -> ^( Relation Name[$QName.text] classBody ) );\r
+    // SilkSchema.g:199:1: classDefinition : ( Class QName classBody End -> ^( ClassDef Name[$QName.text] classBody ) | Relation QName classBody End -> ^( Relation Name[$QName.text] 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
@@ -487,7 +489,7 @@ public class SilkSchemaParser extends Parser {
         RewriteRuleTokenStream stream_QName=new RewriteRuleTokenStream(adaptor,"token QName");\r
         RewriteRuleSubtreeStream stream_classBody=new RewriteRuleSubtreeStream(adaptor,"rule classBody");\r
         try {\r
-            // SilkSchema.g:199:3: ( Class QName classBody End -> ^( ClassDef Name[$QName.text] classBody ) | Relation QName classBody End -> ^( Relation Name[$QName.text] classBody ) )\r
+            // SilkSchema.g:200:3: ( Class QName classBody End -> ^( ClassDef Name[$QName.text] classBody ) | Relation QName classBody End -> ^( Relation Name[$QName.text] classBody ) )\r
             int alt5=2;\r
             int LA5_0 = input.LA(1);\r
 \r
@@ -505,21 +507,21 @@ public class SilkSchemaParser extends Parser {
             }\r
             switch (alt5) {\r
                 case 1 :\r
-                    // SilkSchema.g:199:5: Class QName classBody End\r
+                    // SilkSchema.g:200:5: Class QName classBody End\r
                     {\r
-                    Class8=(Token)match(input,Class,FOLLOW_Class_in_classDefinition903);  \r
+                    Class8=(Token)match(input,Class,FOLLOW_Class_in_classDefinition920);  \r
                     stream_Class.add(Class8);\r
 \r
-                    QName9=(Token)match(input,QName,FOLLOW_QName_in_classDefinition905);  \r
+                    QName9=(Token)match(input,QName,FOLLOW_QName_in_classDefinition922);  \r
                     stream_QName.add(QName9);\r
 \r
-                    pushFollow(FOLLOW_classBody_in_classDefinition907);\r
+                    pushFollow(FOLLOW_classBody_in_classDefinition924);\r
                     classBody10=classBody();\r
 \r
                     state._fsp--;\r
 \r
                     stream_classBody.add(classBody10.getTree());\r
-                    End11=(Token)match(input,End,FOLLOW_End_in_classDefinition909);  \r
+                    End11=(Token)match(input,End,FOLLOW_End_in_classDefinition926);  \r
                     stream_End.add(End11);\r
 \r
 \r
@@ -535,9 +537,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
-                    // 199:31: -> ^( ClassDef Name[$QName.text] classBody )\r
+                    // 200:31: -> ^( ClassDef Name[$QName.text] classBody )\r
                     {\r
-                        // SilkSchema.g:199:34: ^( ClassDef Name[$QName.text] classBody )\r
+                        // SilkSchema.g:200:34: ^( ClassDef Name[$QName.text] classBody )\r
                         {\r
                         Object root_1 = (Object)adaptor.nil();\r
                         root_1 = (Object)adaptor.becomeRoot((Object)adaptor.create(ClassDef, "ClassDef"), root_1);\r
@@ -554,27 +556,27 @@ public class SilkSchemaParser extends Parser {
                     }\r
                     break;\r
                 case 2 :\r
-                    // SilkSchema.g:200:5: Relation QName classBody End\r
+                    // SilkSchema.g:201:5: Relation QName classBody End\r
                     {\r
-                    Relation12=(Token)match(input,Relation,FOLLOW_Relation_in_classDefinition926);  \r
+                    Relation12=(Token)match(input,Relation,FOLLOW_Relation_in_classDefinition943);  \r
                     stream_Relation.add(Relation12);\r
 \r
-                    QName13=(Token)match(input,QName,FOLLOW_QName_in_classDefinition928);  \r
+                    QName13=(Token)match(input,QName,FOLLOW_QName_in_classDefinition945);  \r
                     stream_QName.add(QName13);\r
 \r
-                    pushFollow(FOLLOW_classBody_in_classDefinition930);\r
+                    pushFollow(FOLLOW_classBody_in_classDefinition947);\r
                     classBody14=classBody();\r
 \r
                     state._fsp--;\r
 \r
                     stream_classBody.add(classBody14.getTree());\r
-                    End15=(Token)match(input,End,FOLLOW_End_in_classDefinition932);  \r
+                    End15=(Token)match(input,End,FOLLOW_End_in_classDefinition949);  \r
                     stream_End.add(End15);\r
 \r
 \r
 \r
                     // AST REWRITE\r
-                    // elements: Relation, classBody\r
+                    // elements: classBody, Relation\r
                     // token labels: \r
                     // rule labels: retval\r
                     // token list labels: \r
@@ -584,9 +586,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
-                    // 200:34: -> ^( Relation Name[$QName.text] classBody )\r
+                    // 201:34: -> ^( Relation Name[$QName.text] classBody )\r
                     {\r
-                        // SilkSchema.g:200:37: ^( Relation Name[$QName.text] classBody )\r
+                        // SilkSchema.g:201:37: ^( Relation Name[$QName.text] classBody )\r
                         {\r
                         Object root_1 = (Object)adaptor.nil();\r
                         root_1 = (Object)adaptor.becomeRoot(stream_Relation.nextNode(), root_1);\r
@@ -628,7 +630,7 @@ public class SilkSchemaParser extends Parser {
     };\r
 \r
     // $ANTLR start "classBody"\r
-    // SilkSchema.g:203:1: classBody : ( inheritance )? ( includeStatement | attributes )* ;\r
+    // SilkSchema.g:204:1: classBody : ( inheritance )? ( 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
@@ -641,15 +643,17 @@ public class SilkSchemaParser extends Parser {
 \r
         SilkSchemaParser.attributes_return attributes18 = null;\r
 \r
+        SilkSchemaParser.indexStatement_return indexStatement19 = null;\r
+\r
 \r
 \r
         try {\r
-            // SilkSchema.g:203:10: ( ( inheritance )? ( includeStatement | attributes )* )\r
-            // SilkSchema.g:203:12: ( inheritance )? ( includeStatement | attributes )*\r
+            // SilkSchema.g:204:10: ( ( inheritance )? ( includeStatement | attributes | indexStatement )* )\r
+            // SilkSchema.g:204:12: ( inheritance )? ( includeStatement | attributes | indexStatement )*\r
             {\r
             root_0 = (Object)adaptor.nil();\r
 \r
-            // SilkSchema.g:203:12: ( inheritance )?\r
+            // SilkSchema.g:204:12: ( inheritance )?\r
             int alt6=2;\r
             int LA6_0 = input.LA(1);\r
 \r
@@ -658,9 +662,9 @@ public class SilkSchemaParser extends Parser {
             }\r
             switch (alt6) {\r
                 case 1 :\r
-                    // SilkSchema.g:203:12: inheritance\r
+                    // SilkSchema.g:204:12: inheritance\r
                     {\r
-                    pushFollow(FOLLOW_inheritance_in_classBody956);\r
+                    pushFollow(FOLLOW_inheritance_in_classBody973);\r
                     inheritance16=inheritance();\r
 \r
                     state._fsp--;\r
@@ -672,25 +676,35 @@ public class SilkSchemaParser extends Parser {
 \r
             }\r
 \r
-            // SilkSchema.g:203:25: ( includeStatement | attributes )*\r
+            // SilkSchema.g:204:25: ( includeStatement | attributes | indexStatement )*\r
             loop7:\r
             do {\r
-                int alt7=3;\r
-                int LA7_0 = input.LA(1);\r
-\r
-                if ( (LA7_0==Includes) ) {\r
+                int alt7=4;\r
+                switch ( input.LA(1) ) {\r
+                case Includes:\r
+                    {\r
                     alt7=1;\r
-                }\r
-                else if ( (LA7_0==Symbol||LA7_0==QName) ) {\r
+                    }\r
+                    break;\r
+                case Symbol:\r
+                case QName:\r
+                    {\r
                     alt7=2;\r
-                }\r
+                    }\r
+                    break;\r
+                case Index:\r
+                    {\r
+                    alt7=3;\r
+                    }\r
+                    break;\r
 \r
+                }\r
 \r
                 switch (alt7) {\r
                case 1 :\r
-                   // SilkSchema.g:203:26: includeStatement\r
+                   // SilkSchema.g:204:26: includeStatement\r
                    {\r
-                   pushFollow(FOLLOW_includeStatement_in_classBody960);\r
+                   pushFollow(FOLLOW_includeStatement_in_classBody977);\r
                    includeStatement17=includeStatement();\r
 \r
                    state._fsp--;\r
@@ -700,9 +714,9 @@ public class SilkSchemaParser extends Parser {
                    }\r
                    break;\r
                case 2 :\r
-                   // SilkSchema.g:203:45: attributes\r
+                   // SilkSchema.g:204:45: attributes\r
                    {\r
-                   pushFollow(FOLLOW_attributes_in_classBody964);\r
+                   pushFollow(FOLLOW_attributes_in_classBody981);\r
                    attributes18=attributes();\r
 \r
                    state._fsp--;\r
@@ -711,6 +725,18 @@ public class SilkSchemaParser extends Parser {
 \r
                    }\r
                    break;\r
+               case 3 :\r
+                   // SilkSchema.g:204:58: indexStatement\r
+                   {\r
+                   pushFollow(FOLLOW_indexStatement_in_classBody985);\r
+                   indexStatement19=indexStatement();\r
+\r
+                   state._fsp--;\r
+\r
+                   adaptor.addChild(root_0, indexStatement19.getTree());\r
+\r
+                   }\r
+                   break;\r
 \r
                default :\r
                    break loop7;\r
@@ -744,30 +770,30 @@ public class SilkSchemaParser extends Parser {
     };\r
 \r
     // $ANTLR start "inheritance"\r
-    // SilkSchema.g:205:10: fragment inheritance : Lt QName -> Parent[$QName.text] ;\r
+    // SilkSchema.g:206:10: 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
 \r
         Object root_0 = null;\r
 \r
-        Token Lt19=null;\r
-        Token QName20=null;\r
+        Token Lt20=null;\r
+        Token QName21=null;\r
 \r
-        Object Lt19_tree=null;\r
-        Object QName20_tree=null;\r
+        Object Lt20_tree=null;\r
+        Object QName21_tree=null;\r
         RewriteRuleTokenStream stream_Lt=new RewriteRuleTokenStream(adaptor,"token Lt");\r
         RewriteRuleTokenStream stream_QName=new RewriteRuleTokenStream(adaptor,"token QName");\r
 \r
         try {\r
-            // SilkSchema.g:205:21: ( Lt QName -> Parent[$QName.text] )\r
-            // SilkSchema.g:205:23: Lt QName\r
+            // SilkSchema.g:206:21: ( Lt QName -> Parent[$QName.text] )\r
+            // SilkSchema.g:206:23: Lt QName\r
             {\r
-            Lt19=(Token)match(input,Lt,FOLLOW_Lt_in_inheritance977);  \r
-            stream_Lt.add(Lt19);\r
+            Lt20=(Token)match(input,Lt,FOLLOW_Lt_in_inheritance998);  \r
+            stream_Lt.add(Lt20);\r
 \r
-            QName20=(Token)match(input,QName,FOLLOW_QName_in_inheritance979);  \r
-            stream_QName.add(QName20);\r
+            QName21=(Token)match(input,QName,FOLLOW_QName_in_inheritance1000);  \r
+            stream_QName.add(QName21);\r
 \r
 \r
 \r
@@ -782,9 +808,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
-            // 205:32: -> Parent[$QName.text]\r
+            // 206:32: -> Parent[$QName.text]\r
             {\r
-                adaptor.addChild(root_0, (Object)adaptor.create(Parent, (QName20!=null?QName20.getText():null)));\r
+                adaptor.addChild(root_0, (Object)adaptor.create(Parent, (QName21!=null?QName21.getText():null)));\r
 \r
             }\r
 \r
@@ -815,39 +841,39 @@ public class SilkSchemaParser extends Parser {
     };\r
 \r
     // $ANTLR start "includeStatement"\r
-    // SilkSchema.g:207:10: fragment includeStatement : Includes includeItem ( Comma includeItem )* -> ( includeItem )+ ;\r
+    // SilkSchema.g:208:10: 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
 \r
         Object root_0 = null;\r
 \r
-        Token Includes21=null;\r
-        Token Comma23=null;\r
-        SilkSchemaParser.includeItem_return includeItem22 = null;\r
+        Token Includes22=null;\r
+        Token Comma24=null;\r
+        SilkSchemaParser.includeItem_return includeItem23 = null;\r
 \r
-        SilkSchemaParser.includeItem_return includeItem24 = null;\r
+        SilkSchemaParser.includeItem_return includeItem25 = null;\r
 \r
 \r
-        Object Includes21_tree=null;\r
-        Object Comma23_tree=null;\r
+        Object Includes22_tree=null;\r
+        Object Comma24_tree=null;\r
         RewriteRuleTokenStream stream_Includes=new RewriteRuleTokenStream(adaptor,"token Includes");\r
         RewriteRuleTokenStream stream_Comma=new RewriteRuleTokenStream(adaptor,"token Comma");\r
         RewriteRuleSubtreeStream stream_includeItem=new RewriteRuleSubtreeStream(adaptor,"rule includeItem");\r
         try {\r
-            // SilkSchema.g:207:26: ( Includes includeItem ( Comma includeItem )* -> ( includeItem )+ )\r
-            // SilkSchema.g:207:28: Includes includeItem ( Comma includeItem )*\r
+            // SilkSchema.g:208:26: ( Includes includeItem ( Comma includeItem )* -> ( includeItem )+ )\r
+            // SilkSchema.g:208:28: Includes includeItem ( Comma includeItem )*\r
             {\r
-            Includes21=(Token)match(input,Includes,FOLLOW_Includes_in_includeStatement995);  \r
-            stream_Includes.add(Includes21);\r
+            Includes22=(Token)match(input,Includes,FOLLOW_Includes_in_includeStatement1016);  \r
+            stream_Includes.add(Includes22);\r
 \r
-            pushFollow(FOLLOW_includeItem_in_includeStatement997);\r
-            includeItem22=includeItem();\r
+            pushFollow(FOLLOW_includeItem_in_includeStatement1018);\r
+            includeItem23=includeItem();\r
 \r
             state._fsp--;\r
 \r
-            stream_includeItem.add(includeItem22.getTree());\r
-            // SilkSchema.g:207:49: ( Comma includeItem )*\r
+            stream_includeItem.add(includeItem23.getTree());\r
+            // SilkSchema.g:208:49: ( Comma includeItem )*\r
             loop8:\r
             do {\r
                 int alt8=2;\r
@@ -860,17 +886,17 @@ public class SilkSchemaParser extends Parser {
 \r
                 switch (alt8) {\r
                case 1 :\r
-                   // SilkSchema.g:207:50: Comma includeItem\r
+                   // SilkSchema.g:208:50: Comma includeItem\r
                    {\r
-                   Comma23=(Token)match(input,Comma,FOLLOW_Comma_in_includeStatement1000);  \r
-                   stream_Comma.add(Comma23);\r
+                   Comma24=(Token)match(input,Comma,FOLLOW_Comma_in_includeStatement1021);  \r
+                   stream_Comma.add(Comma24);\r
 \r
-                   pushFollow(FOLLOW_includeItem_in_includeStatement1002);\r
-                   includeItem24=includeItem();\r
+                   pushFollow(FOLLOW_includeItem_in_includeStatement1023);\r
+                   includeItem25=includeItem();\r
 \r
                    state._fsp--;\r
 \r
-                   stream_includeItem.add(includeItem24.getTree());\r
+                   stream_includeItem.add(includeItem25.getTree());\r
 \r
                    }\r
                    break;\r
@@ -893,7 +919,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
-            // 207:70: -> ( includeItem )+\r
+            // 208:70: -> ( includeItem )+\r
             {\r
                 if ( !(stream_includeItem.hasNext()) ) {\r
                     throw new RewriteEarlyExitException();\r
@@ -933,24 +959,24 @@ public class SilkSchemaParser extends Parser {
     };\r
 \r
     // $ANTLR start "includeItem"\r
-    // SilkSchema.g:209:10: fragment includeItem : QName -> Mixin[$QName.text] ;\r
+    // SilkSchema.g:210:10: 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
 \r
         Object root_0 = null;\r
 \r
-        Token QName25=null;\r
+        Token QName26=null;\r
 \r
-        Object QName25_tree=null;\r
+        Object QName26_tree=null;\r
         RewriteRuleTokenStream stream_QName=new RewriteRuleTokenStream(adaptor,"token QName");\r
 \r
         try {\r
-            // SilkSchema.g:209:21: ( QName -> Mixin[$QName.text] )\r
-            // SilkSchema.g:209:23: QName\r
+            // SilkSchema.g:210:21: ( QName -> Mixin[$QName.text] )\r
+            // SilkSchema.g:210:23: QName\r
             {\r
-            QName25=(Token)match(input,QName,FOLLOW_QName_in_includeItem1018);  \r
-            stream_QName.add(QName25);\r
+            QName26=(Token)match(input,QName,FOLLOW_QName_in_includeItem1039);  \r
+            stream_QName.add(QName26);\r
 \r
 \r
 \r
@@ -965,9 +991,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
-            // 209:29: -> Mixin[$QName.text]\r
+            // 210:29: -> Mixin[$QName.text]\r
             {\r
-                adaptor.addChild(root_0, (Object)adaptor.create(Mixin, (QName25!=null?QName25.getText():null)));\r
+                adaptor.addChild(root_0, (Object)adaptor.create(Mixin, (QName26!=null?QName26.getText():null)));\r
 \r
             }\r
 \r
@@ -992,39 +1018,51 @@ public class SilkSchemaParser extends Parser {
     }\r
     // $ANTLR end "includeItem"\r
 \r
-    public static class attributes_return extends ParserRuleReturnScope {\r
+    public static class indexStatement_return extends ParserRuleReturnScope {\r
         Object tree;\r
         public Object getTree() { return tree; }\r
     };\r
 \r
-    // $ANTLR start "attributes"\r
-    // SilkSchema.g:212:10: 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
+    // $ANTLR start "indexStatement"\r
+    // SilkSchema.g:212:10: fragment indexStatement : Index QName 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
 \r
         Object root_0 = null;\r
 \r
-        Token Comma27=null;\r
-        SilkSchemaParser.attribute_return attribute26 = null;\r
+        Token Index27=null;\r
+        Token QName28=null;\r
+        Token Comma30=null;\r
+        SilkSchemaParser.indexTarget_return indexTarget29 = null;\r
 \r
-        SilkSchemaParser.attribute_return attribute28 = null;\r
+        SilkSchemaParser.indexTarget_return indexTarget31 = null;\r
 \r
 \r
-        Object Comma27_tree=null;\r
+        Object Index27_tree=null;\r
+        Object QName28_tree=null;\r
+        Object Comma30_tree=null;\r
+        RewriteRuleTokenStream stream_Index=new RewriteRuleTokenStream(adaptor,"token Index");\r
         RewriteRuleTokenStream stream_Comma=new RewriteRuleTokenStream(adaptor,"token Comma");\r
-        RewriteRuleSubtreeStream stream_attribute=new RewriteRuleSubtreeStream(adaptor,"rule attribute");\r
+        RewriteRuleTokenStream stream_QName=new RewriteRuleTokenStream(adaptor,"token QName");\r
+        RewriteRuleSubtreeStream stream_indexTarget=new RewriteRuleSubtreeStream(adaptor,"rule indexTarget");\r
         try {\r
-            // SilkSchema.g:212:20: ( attribute ( Comma attribute )* -> ( attribute )+ )\r
-            // SilkSchema.g:212:22: attribute ( Comma attribute )*\r
+            // SilkSchema.g:212:24: ( Index QName indexTarget ( Comma indexTarget )* -> ^( Index TypeName[$QName.text] ( indexTarget )+ ) )\r
+            // SilkSchema.g:212:26: Index QName indexTarget ( Comma indexTarget )*\r
             {\r
-            pushFollow(FOLLOW_attribute_in_attributes1033);\r
-            attribute26=attribute();\r
+            Index27=(Token)match(input,Index,FOLLOW_Index_in_indexStatement1053);  \r
+            stream_Index.add(Index27);\r
+\r
+            QName28=(Token)match(input,QName,FOLLOW_QName_in_indexStatement1055);  \r
+            stream_QName.add(QName28);\r
+\r
+            pushFollow(FOLLOW_indexTarget_in_indexStatement1057);\r
+            indexTarget29=indexTarget();\r
 \r
             state._fsp--;\r
 \r
-            stream_attribute.add(attribute26.getTree());\r
-            // SilkSchema.g:212:32: ( Comma attribute )*\r
+            stream_indexTarget.add(indexTarget29.getTree());\r
+            // SilkSchema.g:212:50: ( Comma indexTarget )*\r
             loop9:\r
             do {\r
                 int alt9=2;\r
@@ -1037,17 +1075,17 @@ public class SilkSchemaParser extends Parser {
 \r
                 switch (alt9) {\r
                case 1 :\r
-                   // SilkSchema.g:212:33: Comma attribute\r
+                   // SilkSchema.g:212:51: Comma indexTarget\r
                    {\r
-                   Comma27=(Token)match(input,Comma,FOLLOW_Comma_in_attributes1036);  \r
-                   stream_Comma.add(Comma27);\r
+                   Comma30=(Token)match(input,Comma,FOLLOW_Comma_in_indexStatement1060);  \r
+                   stream_Comma.add(Comma30);\r
 \r
-                   pushFollow(FOLLOW_attribute_in_attributes1038);\r
-                   attribute28=attribute();\r
+                   pushFollow(FOLLOW_indexTarget_in_indexStatement1062);\r
+                   indexTarget31=indexTarget();\r
 \r
                    state._fsp--;\r
 \r
-                   stream_attribute.add(attribute28.getTree());\r
+                   stream_indexTarget.add(indexTarget31.getTree());\r
 \r
                    }\r
                    break;\r
@@ -1060,6 +1098,192 @@ public class SilkSchemaParser extends Parser {
 \r
 \r
             // AST REWRITE\r
+            // elements: Index, indexTarget\r
+            // token labels: \r
+            // rule labels: retval\r
+            // token list labels: \r
+            // rule list labels: \r
+            // wildcard labels: \r
+            retval.tree = root_0;\r
+            RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"rule retval",retval!=null?retval.tree:null);\r
+\r
+            root_0 = (Object)adaptor.nil();\r
+            // 213:3: -> ^( Index TypeName[$QName.text] ( indexTarget )+ )\r
+            {\r
+                // SilkSchema.g:213: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
+\r
+                adaptor.addChild(root_1, (Object)adaptor.create(TypeName, (QName28!=null?QName28.getText():null)));\r
+                if ( !(stream_indexTarget.hasNext()) ) {\r
+                    throw new RewriteEarlyExitException();\r
+                }\r
+                while ( stream_indexTarget.hasNext() ) {\r
+                    adaptor.addChild(root_1, stream_indexTarget.nextTree());\r
+\r
+                }\r
+                stream_indexTarget.reset();\r
+\r
+                adaptor.addChild(root_0, root_1);\r
+                }\r
+\r
+            }\r
+\r
+            retval.tree = root_0;\r
+            }\r
+\r
+            retval.stop = input.LT(-1);\r
+\r
+            retval.tree = (Object)adaptor.rulePostProcessing(root_0);\r
+            adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);\r
+\r
+        }\r
+        catch (RecognitionException re) {\r
+            reportError(re);\r
+            recover(input,re);\r
+       retval.tree = (Object)adaptor.errorNode(input, retval.start, input.LT(-1), re);\r
+\r
+        }\r
+        finally {\r
+        }\r
+        return retval;\r
+    }\r
+    // $ANTLR end "indexStatement"\r
+\r
+    public static class indexTarget_return extends ParserRuleReturnScope {\r
+        Object tree;\r
+        public Object getTree() { return tree; }\r
+    };\r
+\r
+    // $ANTLR start "indexTarget"\r
+    // SilkSchema.g:216:10: 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 Symbol32=null;\r
+\r
+        Object Symbol32_tree=null;\r
+        RewriteRuleTokenStream stream_Symbol=new RewriteRuleTokenStream(adaptor,"token Symbol");\r
+\r
+        try {\r
+            // SilkSchema.g:216:21: ( Symbol -> Attribute[$Symbol.text] )\r
+            // SilkSchema.g:216:23: Symbol\r
+            {\r
+            Symbol32=(Token)match(input,Symbol,FOLLOW_Symbol_in_indexTarget1089);  \r
+            stream_Symbol.add(Symbol32);\r
+\r
+\r
+\r
+            // AST REWRITE\r
+            // elements: \r
+            // token labels: \r
+            // rule labels: retval\r
+            // token list labels: \r
+            // rule list labels: \r
+            // wildcard labels: \r
+            retval.tree = root_0;\r
+            RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"rule retval",retval!=null?retval.tree:null);\r
+\r
+            root_0 = (Object)adaptor.nil();\r
+            // 216:30: -> Attribute[$Symbol.text]\r
+            {\r
+                adaptor.addChild(root_0, (Object)adaptor.create(Attribute, (Symbol32!=null?Symbol32.getText():null)));\r
+\r
+            }\r
+\r
+            retval.tree = root_0;\r
+            }\r
+\r
+            retval.stop = input.LT(-1);\r
+\r
+            retval.tree = (Object)adaptor.rulePostProcessing(root_0);\r
+            adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);\r
+\r
+        }\r
+        catch (RecognitionException re) {\r
+            reportError(re);\r
+            recover(input,re);\r
+       retval.tree = (Object)adaptor.errorNode(input, retval.start, input.LT(-1), re);\r
+\r
+        }\r
+        finally {\r
+        }\r
+        return retval;\r
+    }\r
+    // $ANTLR end "indexTarget"\r
+\r
+    public static class attributes_return extends ParserRuleReturnScope {\r
+        Object tree;\r
+        public Object getTree() { return tree; }\r
+    };\r
+\r
+    // $ANTLR start "attributes"\r
+    // SilkSchema.g:220:10: 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 Comma34=null;\r
+        SilkSchemaParser.attribute_return attribute33 = null;\r
+\r
+        SilkSchemaParser.attribute_return attribute35 = null;\r
+\r
+\r
+        Object Comma34_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:220:20: ( attribute ( Comma attribute )* -> ( attribute )+ )\r
+            // SilkSchema.g:220:22: attribute ( Comma attribute )*\r
+            {\r
+            pushFollow(FOLLOW_attribute_in_attributes1108);\r
+            attribute33=attribute();\r
+\r
+            state._fsp--;\r
+\r
+            stream_attribute.add(attribute33.getTree());\r
+            // SilkSchema.g:220:32: ( Comma attribute )*\r
+            loop10:\r
+            do {\r
+                int alt10=2;\r
+                int LA10_0 = input.LA(1);\r
+\r
+                if ( (LA10_0==Comma) ) {\r
+                    alt10=1;\r
+                }\r
+\r
+\r
+                switch (alt10) {\r
+               case 1 :\r
+                   // SilkSchema.g:220:33: Comma attribute\r
+                   {\r
+                   Comma34=(Token)match(input,Comma,FOLLOW_Comma_in_attributes1111);  \r
+                   stream_Comma.add(Comma34);\r
+\r
+                   pushFollow(FOLLOW_attribute_in_attributes1113);\r
+                   attribute35=attribute();\r
+\r
+                   state._fsp--;\r
+\r
+                   stream_attribute.add(attribute35.getTree());\r
+\r
+                   }\r
+                   break;\r
+\r
+               default :\r
+                   break loop10;\r
+                }\r
+            } while (true);\r
+\r
+\r
+\r
+            // AST REWRITE\r
             // elements: attribute\r
             // token labels: \r
             // rule labels: retval\r
@@ -1070,7 +1294,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
-            // 213:3: -> ( attribute )+\r
+            // 221:3: -> ( attribute )+\r
             {\r
                 if ( !(stream_attribute.hasNext()) ) {\r
                     throw new RewriteEarlyExitException();\r
@@ -1110,76 +1334,76 @@ public class SilkSchemaParser extends Parser {
     };\r
 \r
     // $ANTLR start "attribute"\r
-    // SilkSchema.g:216:10: fragment attribute : ( attributeType )? Symbol ( Eq attributeValue )? -> ^( Attribute Name[$Symbol.text] ( attributeType )? ( attributeValue )? ) ;\r
+    // SilkSchema.g:224:10: fragment attribute : ( attributeType )? Symbol ( Eq 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 Symbol30=null;\r
-        Token Eq31=null;\r
-        SilkSchemaParser.attributeType_return attributeType29 = null;\r
+        Token Symbol37=null;\r
+        Token Eq38=null;\r
+        SilkSchemaParser.attributeType_return attributeType36 = null;\r
 \r
-        SilkSchemaParser.attributeValue_return attributeValue32 = null;\r
+        SilkSchemaParser.attributeValue_return attributeValue39 = null;\r
 \r
 \r
-        Object Symbol30_tree=null;\r
-        Object Eq31_tree=null;\r
+        Object Symbol37_tree=null;\r
+        Object Eq38_tree=null;\r
         RewriteRuleTokenStream stream_Symbol=new RewriteRuleTokenStream(adaptor,"token Symbol");\r
         RewriteRuleTokenStream stream_Eq=new RewriteRuleTokenStream(adaptor,"token Eq");\r
         RewriteRuleSubtreeStream stream_attributeValue=new RewriteRuleSubtreeStream(adaptor,"rule attributeValue");\r
         RewriteRuleSubtreeStream stream_attributeType=new RewriteRuleSubtreeStream(adaptor,"rule attributeType");\r
         try {\r
-            // SilkSchema.g:216:19: ( ( attributeType )? Symbol ( Eq attributeValue )? -> ^( Attribute Name[$Symbol.text] ( attributeType )? ( attributeValue )? ) )\r
-            // SilkSchema.g:217:3: ( attributeType )? Symbol ( Eq attributeValue )?\r
+            // SilkSchema.g:224:19: ( ( attributeType )? Symbol ( Eq attributeValue )? -> ^( Attribute Name[$Symbol.text] ( attributeType )? ( attributeValue )? ) )\r
+            // SilkSchema.g:225:3: ( attributeType )? Symbol ( Eq attributeValue )?\r
             {\r
-            // SilkSchema.g:217:3: ( attributeType )?\r
-            int alt10=2;\r
-            int LA10_0 = input.LA(1);\r
+            // SilkSchema.g:225:3: ( attributeType )?\r
+            int alt11=2;\r
+            int LA11_0 = input.LA(1);\r
 \r
-            if ( (LA10_0==QName) ) {\r
-                alt10=1;\r
+            if ( (LA11_0==QName) ) {\r
+                alt11=1;\r
             }\r
-            switch (alt10) {\r
+            switch (alt11) {\r
                 case 1 :\r
-                    // SilkSchema.g:217:3: attributeType\r
+                    // SilkSchema.g:225:3: attributeType\r
                     {\r
-                    pushFollow(FOLLOW_attributeType_in_attribute1064);\r
-                    attributeType29=attributeType();\r
+                    pushFollow(FOLLOW_attributeType_in_attribute1139);\r
+                    attributeType36=attributeType();\r
 \r
                     state._fsp--;\r
 \r
-                    stream_attributeType.add(attributeType29.getTree());\r
+                    stream_attributeType.add(attributeType36.getTree());\r
 \r
                     }\r
                     break;\r
 \r
             }\r
 \r
-            Symbol30=(Token)match(input,Symbol,FOLLOW_Symbol_in_attribute1067);  \r
-            stream_Symbol.add(Symbol30);\r
+            Symbol37=(Token)match(input,Symbol,FOLLOW_Symbol_in_attribute1142);  \r
+            stream_Symbol.add(Symbol37);\r
 \r
-            // SilkSchema.g:217:25: ( Eq attributeValue )?\r
-            int alt11=2;\r
-            int LA11_0 = input.LA(1);\r
+            // SilkSchema.g:225:25: ( Eq attributeValue )?\r
+            int alt12=2;\r
+            int LA12_0 = input.LA(1);\r
 \r
-            if ( (LA11_0==Eq) ) {\r
-                alt11=1;\r
+            if ( (LA12_0==Eq) ) {\r
+                alt12=1;\r
             }\r
-            switch (alt11) {\r
+            switch (alt12) {\r
                 case 1 :\r
-                    // SilkSchema.g:217:26: Eq attributeValue\r
+                    // SilkSchema.g:225:26: Eq attributeValue\r
                     {\r
-                    Eq31=(Token)match(input,Eq,FOLLOW_Eq_in_attribute1070);  \r
-                    stream_Eq.add(Eq31);\r
+                    Eq38=(Token)match(input,Eq,FOLLOW_Eq_in_attribute1145);  \r
+                    stream_Eq.add(Eq38);\r
 \r
-                    pushFollow(FOLLOW_attributeValue_in_attribute1072);\r
-                    attributeValue32=attributeValue();\r
+                    pushFollow(FOLLOW_attributeValue_in_attribute1147);\r
+                    attributeValue39=attributeValue();\r
 \r
                     state._fsp--;\r
 \r
-                    stream_attributeValue.add(attributeValue32.getTree());\r
+                    stream_attributeValue.add(attributeValue39.getTree());\r
 \r
                     }\r
                     break;\r
@@ -1199,21 +1423,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
-            // 218:3: -> ^( Attribute Name[$Symbol.text] ( attributeType )? ( attributeValue )? )\r
+            // 226:3: -> ^( Attribute Name[$Symbol.text] ( attributeType )? ( attributeValue )? )\r
             {\r
-                // SilkSchema.g:218:6: ^( Attribute Name[$Symbol.text] ( attributeType )? ( attributeValue )? )\r
+                // SilkSchema.g:226: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, (Symbol30!=null?Symbol30.getText():null)));\r
-                // SilkSchema.g:218:37: ( attributeType )?\r
+                adaptor.addChild(root_1, (Object)adaptor.create(Name, (Symbol37!=null?Symbol37.getText():null)));\r
+                // SilkSchema.g:226:37: ( attributeType )?\r
                 if ( stream_attributeType.hasNext() ) {\r
                     adaptor.addChild(root_1, stream_attributeType.nextTree());\r
 \r
                 }\r
                 stream_attributeType.reset();\r
-                // SilkSchema.g:218:52: ( attributeValue )?\r
+                // SilkSchema.g:226:52: ( attributeValue )?\r
                 if ( stream_attributeValue.hasNext() ) {\r
                     adaptor.addChild(root_1, stream_attributeValue.nextTree());\r
 \r
@@ -1252,77 +1476,77 @@ public class SilkSchemaParser extends Parser {
     };\r
 \r
     // $ANTLR start "attributeValue"\r
-    // SilkSchema.g:221:1: attributeValue : ( String | Double | Integer ) -> Value[$attributeValue.text] ;\r
+    // SilkSchema.g:229: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 String33=null;\r
-        Token Double34=null;\r
-        Token Integer35=null;\r
+        Token String40=null;\r
+        Token Double41=null;\r
+        Token Integer42=null;\r
 \r
-        Object String33_tree=null;\r
-        Object Double34_tree=null;\r
-        Object Integer35_tree=null;\r
+        Object String40_tree=null;\r
+        Object Double41_tree=null;\r
+        Object Integer42_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:222:3: ( ( String | Double | Integer ) -> Value[$attributeValue.text] )\r
-            // SilkSchema.g:222:5: ( String | Double | Integer )\r
+            // SilkSchema.g:230:3: ( ( String | Double | Integer ) -> DefaultValue[$attributeValue.text] )\r
+            // SilkSchema.g:230:5: ( String | Double | Integer )\r
             {\r
-            // SilkSchema.g:222:5: ( String | Double | Integer )\r
-            int alt12=3;\r
+            // SilkSchema.g:230:5: ( String | Double | Integer )\r
+            int alt13=3;\r
             switch ( input.LA(1) ) {\r
             case String:\r
                 {\r
-                alt12=1;\r
+                alt13=1;\r
                 }\r
                 break;\r
             case Double:\r
                 {\r
-                alt12=2;\r
+                alt13=2;\r
                 }\r
                 break;\r
             case Integer:\r
                 {\r
-                alt12=3;\r
+                alt13=3;\r
                 }\r
                 break;\r
             default:\r
                 NoViableAltException nvae =\r
-                    new NoViableAltException("", 12, 0, input);\r
+                    new NoViableAltException("", 13, 0, input);\r
 \r
                 throw nvae;\r
             }\r
 \r
-            switch (alt12) {\r
+            switch (alt13) {\r
                 case 1 :\r
-                    // SilkSchema.g:222:6: String\r
+                    // SilkSchema.g:230:6: String\r
                     {\r
-                    String33=(Token)match(input,String,FOLLOW_String_in_attributeValue1110);  \r
-                    stream_String.add(String33);\r
+                    String40=(Token)match(input,String,FOLLOW_String_in_attributeValue1185);  \r
+                    stream_String.add(String40);\r
 \r
 \r
                     }\r
                     break;\r
                 case 2 :\r
-                    // SilkSchema.g:222:15: Double\r
+                    // SilkSchema.g:230:15: Double\r
                     {\r
-                    Double34=(Token)match(input,Double,FOLLOW_Double_in_attributeValue1114);  \r
-                    stream_Double.add(Double34);\r
+                    Double41=(Token)match(input,Double,FOLLOW_Double_in_attributeValue1189);  \r
+                    stream_Double.add(Double41);\r
 \r
 \r
                     }\r
                     break;\r
                 case 3 :\r
-                    // SilkSchema.g:222:24: Integer\r
+                    // SilkSchema.g:230:24: Integer\r
                     {\r
-                    Integer35=(Token)match(input,Integer,FOLLOW_Integer_in_attributeValue1118);  \r
-                    stream_Integer.add(Integer35);\r
+                    Integer42=(Token)match(input,Integer,FOLLOW_Integer_in_attributeValue1193);  \r
+                    stream_Integer.add(Integer42);\r
 \r
 \r
                     }\r
@@ -1343,9 +1567,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
-            // 222:33: -> Value[$attributeValue.text]\r
+            // 230:33: -> DefaultValue[$attributeValue.text]\r
             {\r
-                adaptor.addChild(root_0, (Object)adaptor.create(Value, input.toString(retval.start,input.LT(-1))));\r
+                adaptor.addChild(root_0, (Object)adaptor.create(DefaultValue, input.toString(retval.start,input.LT(-1))));\r
 \r
             }\r
 \r
@@ -1376,56 +1600,56 @@ public class SilkSchemaParser extends Parser {
     };\r
 \r
     // $ANTLR start "attributeType"\r
-    // SilkSchema.g:224:10: fragment attributeType : ( QName -> TypeName[$QName.text] | QName Star -> TypeName[$QName.text] IsArray[\"true\"] );\r
+    // SilkSchema.g:232: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 QName36=null;\r
-        Token QName37=null;\r
-        Token Star38=null;\r
+        Token QName43=null;\r
+        Token QName44=null;\r
+        Token Star45=null;\r
 \r
-        Object QName36_tree=null;\r
-        Object QName37_tree=null;\r
-        Object Star38_tree=null;\r
+        Object QName43_tree=null;\r
+        Object QName44_tree=null;\r
+        Object Star45_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:225:3: ( QName -> TypeName[$QName.text] | QName Star -> TypeName[$QName.text] IsArray[\"true\"] )\r
-            int alt13=2;\r
-            int LA13_0 = input.LA(1);\r
+            // SilkSchema.g:233:3: ( QName -> TypeName[$QName.text] | QName Star -> TypeName[$QName.text] IsArray[\"true\"] )\r
+            int alt14=2;\r
+            int LA14_0 = input.LA(1);\r
 \r
-            if ( (LA13_0==QName) ) {\r
-                int LA13_1 = input.LA(2);\r
+            if ( (LA14_0==QName) ) {\r
+                int LA14_1 = input.LA(2);\r
 \r
-                if ( (LA13_1==Star) ) {\r
-                    alt13=2;\r
+                if ( (LA14_1==Star) ) {\r
+                    alt14=2;\r
                 }\r
-                else if ( (LA13_1==Symbol) ) {\r
-                    alt13=1;\r
+                else if ( (LA14_1==Symbol) ) {\r
+                    alt14=1;\r
                 }\r
                 else {\r
                     NoViableAltException nvae =\r
-                        new NoViableAltException("", 13, 1, input);\r
+                        new NoViableAltException("", 14, 1, input);\r
 \r
                     throw nvae;\r
                 }\r
             }\r
             else {\r
                 NoViableAltException nvae =\r
-                    new NoViableAltException("", 13, 0, input);\r
+                    new NoViableAltException("", 14, 0, input);\r
 \r
                 throw nvae;\r
             }\r
-            switch (alt13) {\r
+            switch (alt14) {\r
                 case 1 :\r
-                    // SilkSchema.g:225:5: QName\r
+                    // SilkSchema.g:233:5: QName\r
                     {\r
-                    QName36=(Token)match(input,QName,FOLLOW_QName_in_attributeType1139);  \r
-                    stream_QName.add(QName36);\r
+                    QName43=(Token)match(input,QName,FOLLOW_QName_in_attributeType1214);  \r
+                    stream_QName.add(QName43);\r
 \r
 \r
 \r
@@ -1440,9 +1664,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
-                    // 225:11: -> TypeName[$QName.text]\r
+                    // 233:11: -> TypeName[$QName.text]\r
                     {\r
-                        adaptor.addChild(root_0, (Object)adaptor.create(TypeName, (QName36!=null?QName36.getText():null)));\r
+                        adaptor.addChild(root_0, (Object)adaptor.create(TypeName, (QName43!=null?QName43.getText():null)));\r
 \r
                     }\r
 \r
@@ -1450,13 +1674,13 @@ public class SilkSchemaParser extends Parser {
                     }\r
                     break;\r
                 case 2 :\r
-                    // SilkSchema.g:226:5: QName Star\r
+                    // SilkSchema.g:234:5: QName Star\r
                     {\r
-                    QName37=(Token)match(input,QName,FOLLOW_QName_in_attributeType1151);  \r
-                    stream_QName.add(QName37);\r
+                    QName44=(Token)match(input,QName,FOLLOW_QName_in_attributeType1226);  \r
+                    stream_QName.add(QName44);\r
 \r
-                    Star38=(Token)match(input,Star,FOLLOW_Star_in_attributeType1153);  \r
-                    stream_Star.add(Star38);\r
+                    Star45=(Token)match(input,Star,FOLLOW_Star_in_attributeType1228);  \r
+                    stream_Star.add(Star45);\r
 \r
 \r
 \r
@@ -1471,9 +1695,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
-                    // 226:16: -> TypeName[$QName.text] IsArray[\"true\"]\r
+                    // 234:16: -> TypeName[$QName.text] IsArray[\"true\"]\r
                     {\r
-                        adaptor.addChild(root_0, (Object)adaptor.create(TypeName, (QName37!=null?QName37.getText():null)));\r
+                        adaptor.addChild(root_0, (Object)adaptor.create(TypeName, (QName44!=null?QName44.getText():null)));\r
                         adaptor.addChild(root_0, (Object)adaptor.create(IsArray, "true"));\r
 \r
                     }\r
@@ -1506,43 +1730,50 @@ public class SilkSchemaParser extends Parser {
 \r
  \r
 \r
-    public static final BitSet FOLLOW_Preamble_in_schema818 = new BitSet(new long[]{0x0010900000000002L});\r
-    public static final BitSet FOLLOW_schemaElement_in_schema821 = new BitSet(new long[]{0x0010900000000002L});\r
-    public static final BitSet FOLLOW_classDefinition_in_schemaElement849 = new BitSet(new long[]{0x0000000000000002L});\r
-    public static final BitSet FOLLOW_moduleDefinition_in_schemaElement856 = new BitSet(new long[]{0x0000000000000002L});\r
-    public static final BitSet FOLLOW_ModuleDef_in_moduleDefinition868 = new BitSet(new long[]{0x0000D00000000000L});\r
-    public static final BitSet FOLLOW_classDefinition_in_moduleDefinition870 = new BitSet(new long[]{0x0000D00000000000L});\r
-    public static final BitSet FOLLOW_End_in_moduleDefinition873 = new BitSet(new long[]{0x0000000000000002L});\r
-    public static final BitSet FOLLOW_Class_in_classDefinition903 = new BitSet(new long[]{0x0080000000000000L});\r
-    public static final BitSet FOLLOW_QName_in_classDefinition905 = new BitSet(new long[]{0x0080680400000000L});\r
-    public static final BitSet FOLLOW_classBody_in_classDefinition907 = new BitSet(new long[]{0x0000400000000000L});\r
-    public static final BitSet FOLLOW_End_in_classDefinition909 = new BitSet(new long[]{0x0000000000000002L});\r
-    public static final BitSet FOLLOW_Relation_in_classDefinition926 = new BitSet(new long[]{0x0080000000000000L});\r
-    public static final BitSet FOLLOW_QName_in_classDefinition928 = new BitSet(new long[]{0x0080680400000000L});\r
-    public static final BitSet FOLLOW_classBody_in_classDefinition930 = new BitSet(new long[]{0x0000400000000000L});\r
-    public static final BitSet FOLLOW_End_in_classDefinition932 = new BitSet(new long[]{0x0000000000000002L});\r
-    public static final BitSet FOLLOW_inheritance_in_classBody956 = new BitSet(new long[]{0x0080280000000002L});\r
-    public static final BitSet FOLLOW_includeStatement_in_classBody960 = new BitSet(new long[]{0x0080280000000002L});\r
-    public static final BitSet FOLLOW_attributes_in_classBody964 = new BitSet(new long[]{0x0080280000000002L});\r
-    public static final BitSet FOLLOW_Lt_in_inheritance977 = new BitSet(new long[]{0x0080000000000000L});\r
-    public static final BitSet FOLLOW_QName_in_inheritance979 = new BitSet(new long[]{0x0000000000000002L});\r
-    public static final BitSet FOLLOW_Includes_in_includeStatement995 = new BitSet(new long[]{0x0080000000000000L});\r
-    public static final BitSet FOLLOW_includeItem_in_includeStatement997 = new BitSet(new long[]{0x0000002000000002L});\r
-    public static final BitSet FOLLOW_Comma_in_includeStatement1000 = new BitSet(new long[]{0x0080000000000000L});\r
-    public static final BitSet FOLLOW_includeItem_in_includeStatement1002 = new BitSet(new long[]{0x0000002000000002L});\r
-    public static final BitSet FOLLOW_QName_in_includeItem1018 = new BitSet(new long[]{0x0000000000000002L});\r
-    public static final BitSet FOLLOW_attribute_in_attributes1033 = new BitSet(new long[]{0x0000002000000002L});\r
-    public static final BitSet FOLLOW_Comma_in_attributes1036 = new BitSet(new long[]{0x0080280000000000L});\r
-    public static final BitSet FOLLOW_attribute_in_attributes1038 = new BitSet(new long[]{0x0000002000000002L});\r
-    public static final BitSet FOLLOW_attributeType_in_attribute1064 = new BitSet(new long[]{0x0000080000000000L});\r
-    public static final BitSet FOLLOW_Symbol_in_attribute1067 = new BitSet(new long[]{0x0000000800000002L});\r
-    public static final BitSet FOLLOW_Eq_in_attribute1070 = new BitSet(new long[]{0x0000000026000000L});\r
-    public static final BitSet FOLLOW_attributeValue_in_attribute1072 = new BitSet(new long[]{0x0000000000000002L});\r
-    public static final BitSet FOLLOW_String_in_attributeValue1110 = new BitSet(new long[]{0x0000000000000002L});\r
-    public static final BitSet FOLLOW_Double_in_attributeValue1114 = new BitSet(new long[]{0x0000000000000002L});\r
-    public static final BitSet FOLLOW_Integer_in_attributeValue1118 = new BitSet(new long[]{0x0000000000000002L});\r
-    public static final BitSet FOLLOW_QName_in_attributeType1139 = new BitSet(new long[]{0x0000000000000002L});\r
-    public static final BitSet FOLLOW_QName_in_attributeType1151 = new BitSet(new long[]{0x0000010000000000L});\r
-    public static final BitSet FOLLOW_Star_in_attributeType1153 = new BitSet(new long[]{0x0000000000000002L});\r
+    public static final BitSet FOLLOW_Preamble_in_schema835 = new BitSet(new long[]{0x0041200000000002L});\r
+    public static final BitSet FOLLOW_schemaElement_in_schema838 = new BitSet(new long[]{0x0041200000000002L});\r
+    public static final BitSet FOLLOW_classDefinition_in_schemaElement866 = new BitSet(new long[]{0x0000000000000002L});\r
+    public static final BitSet FOLLOW_moduleDefinition_in_schemaElement873 = new BitSet(new long[]{0x0000000000000002L});\r
+    public static final BitSet FOLLOW_ModuleDef_in_moduleDefinition885 = new BitSet(new long[]{0x0001A00000000000L});\r
+    public static final BitSet FOLLOW_classDefinition_in_moduleDefinition887 = new BitSet(new long[]{0x0001A00000000000L});\r
+    public static final BitSet FOLLOW_End_in_moduleDefinition890 = new BitSet(new long[]{0x0000000000000002L});\r
+    public static final BitSet FOLLOW_Class_in_classDefinition920 = new BitSet(new long[]{0x0200000000000000L});\r
+    public static final BitSet FOLLOW_QName_in_classDefinition922 = new BitSet(new long[]{0x0202D00400000000L});\r
+    public static final BitSet FOLLOW_classBody_in_classDefinition924 = new BitSet(new long[]{0x0000800000000000L});\r
+    public static final BitSet FOLLOW_End_in_classDefinition926 = new BitSet(new long[]{0x0000000000000002L});\r
+    public static final BitSet FOLLOW_Relation_in_classDefinition943 = new BitSet(new long[]{0x0200000000000000L});\r
+    public static final BitSet FOLLOW_QName_in_classDefinition945 = new BitSet(new long[]{0x0202D00400000000L});\r
+    public static final BitSet FOLLOW_classBody_in_classDefinition947 = new BitSet(new long[]{0x0000800000000000L});\r
+    public static final BitSet FOLLOW_End_in_classDefinition949 = new BitSet(new long[]{0x0000000000000002L});\r
+    public static final BitSet FOLLOW_inheritance_in_classBody973 = new BitSet(new long[]{0x0202500000000002L});\r
+    public static final BitSet FOLLOW_includeStatement_in_classBody977 = new BitSet(new long[]{0x0202500000000002L});\r
+    public static final BitSet FOLLOW_attributes_in_classBody981 = new BitSet(new long[]{0x0202500000000002L});\r
+    public static final BitSet FOLLOW_indexStatement_in_classBody985 = new BitSet(new long[]{0x0202500000000002L});\r
+    public static final BitSet FOLLOW_Lt_in_inheritance998 = new BitSet(new long[]{0x0200000000000000L});\r
+    public static final BitSet FOLLOW_QName_in_inheritance1000 = new BitSet(new long[]{0x0000000000000002L});\r
+    public static final BitSet FOLLOW_Includes_in_includeStatement1016 = new BitSet(new long[]{0x0200000000000000L});\r
+    public static final BitSet FOLLOW_includeItem_in_includeStatement1018 = new BitSet(new long[]{0x0000002000000002L});\r
+    public static final BitSet FOLLOW_Comma_in_includeStatement1021 = new BitSet(new long[]{0x0200000000000000L});\r
+    public static final BitSet FOLLOW_includeItem_in_includeStatement1023 = new BitSet(new long[]{0x0000002000000002L});\r
+    public static final BitSet FOLLOW_QName_in_includeItem1039 = new BitSet(new long[]{0x0000000000000002L});\r
+    public static final BitSet FOLLOW_Index_in_indexStatement1053 = new BitSet(new long[]{0x0200000000000000L});\r
+    public static final BitSet FOLLOW_QName_in_indexStatement1055 = new BitSet(new long[]{0x0000100000000000L});\r
+    public static final BitSet FOLLOW_indexTarget_in_indexStatement1057 = new BitSet(new long[]{0x0000002000000002L});\r
+    public static final BitSet FOLLOW_Comma_in_indexStatement1060 = new BitSet(new long[]{0x0000100000000000L});\r
+    public static final BitSet FOLLOW_indexTarget_in_indexStatement1062 = new BitSet(new long[]{0x0000002000000002L});\r
+    public static final BitSet FOLLOW_Symbol_in_indexTarget1089 = new BitSet(new long[]{0x0000000000000002L});\r
+    public static final BitSet FOLLOW_attribute_in_attributes1108 = new BitSet(new long[]{0x0000002000000002L});\r
+    public static final BitSet FOLLOW_Comma_in_attributes1111 = new BitSet(new long[]{0x0200100000000000L});\r
+    public static final BitSet FOLLOW_attribute_in_attributes1113 = new BitSet(new long[]{0x0000002000000002L});\r
+    public static final BitSet FOLLOW_attributeType_in_attribute1139 = new BitSet(new long[]{0x0000100000000000L});\r
+    public static final BitSet FOLLOW_Symbol_in_attribute1142 = new BitSet(new long[]{0x0000000800000002L});\r
+    public static final BitSet FOLLOW_Eq_in_attribute1145 = new BitSet(new long[]{0x0000000026000000L});\r
+    public static final BitSet FOLLOW_attributeValue_in_attribute1147 = new BitSet(new long[]{0x0000000000000002L});\r
+    public static final BitSet FOLLOW_String_in_attributeValue1185 = new BitSet(new long[]{0x0000000000000002L});\r
+    public static final BitSet FOLLOW_Double_in_attributeValue1189 = new BitSet(new long[]{0x0000000000000002L});\r
+    public static final BitSet FOLLOW_Integer_in_attributeValue1193 = new BitSet(new long[]{0x0000000000000002L});\r
+    public static final BitSet FOLLOW_QName_in_attributeType1214 = new BitSet(new long[]{0x0000000000000002L});\r
+    public static final BitSet FOLLOW_QName_in_attributeType1226 = new BitSet(new long[]{0x0000010000000000L});\r
+    public static final BitSet FOLLOW_Star_in_attributeType1228 = new BitSet(new long[]{0x0000000000000002L});\r
 \r
 }
\ No newline at end of file
index cef2ae2..60486e4 100644 (file)
@@ -29,23 +29,24 @@ import static org.junit.Assert.*;
 import org.junit.After;\r
 import org.junit.Before;\r
 import org.junit.Test;\r
+import org.xerial.lens.Lens;\r
 import org.xerial.util.FileResource;\r
+import org.xerial.util.log.Logger;\r
 \r
-public class SilkSchemaTest\r
-{\r
+public class SilkSchemaTest {\r
+\r
+    private static Logger _logger = Logger.getLogger(SilkSchemaTest.class);\r
 \r
     @Before\r
-    public void setUp() throws Exception\r
-    {}\r
+    public void setUp() throws Exception {}\r
 \r
     @After\r
-    public void tearDown() throws Exception\r
-    {}\r
+    public void tearDown() throws Exception {}\r
 \r
     @Test\r
-    public void parse() throws Exception\r
-    {\r
-        SilkSchema schema = SilkSchema.parse(FileResource.open(SilkSchemaTest.class, "schema.silk"));\r
+    public void parse() throws Exception {\r
+        SilkSchema schema = SilkSchema\r
+                .parse(FileResource.open(SilkSchemaTest.class, "schema.silk"));\r
 \r
         // confirm module\r
         assertNotNull(schema.module);\r
@@ -54,36 +55,29 @@ public class SilkSchemaTest
         assertEquals("org.utgenome", m.name);\r
 \r
         // confirm classes\r
-        assertNotNull(schema.classDef);\r
-        assertEquals(7, schema.classDef.size());\r
-        for (SilkClass c : schema.classDef)\r
-        {\r
-            if (c.name.equals("Coordinate"))\r
-            {\r
+\r
+        assertNotNull(m.classDef);\r
+        assertEquals(7, m.classDef.size());\r
+        for (SilkClass c : m.classDef) {\r
+            if (c.name.equals("Coordinate")) {\r
 \r
             }\r
-            else if (c.name.equals("Locus"))\r
-            {\r
+            else if (c.name.equals("Locus")) {\r
 \r
             }\r
-            else if (c.name.equals("Gene"))\r
-            {\r
+            else if (c.name.equals("Gene")) {\r
 \r
             }\r
-            else if (c.name.equals("Exon"))\r
-            {\r
+            else if (c.name.equals("Exon")) {\r
 \r
             }\r
-            else if (c.name.equals("CDS"))\r
-            {\r
+            else if (c.name.equals("CDS")) {\r
 \r
             }\r
-            else if (c.name.equals("Reference"))\r
-            {\r
+            else if (c.name.equals("Reference")) {\r
 \r
             }\r
-            else if (c.name.equals("Read"))\r
-            {\r
+            else if (c.name.equals("Read")) {\r
 \r
             }\r
 \r
@@ -96,6 +90,8 @@ public class SilkSchemaTest
         assertEquals("Alignment", r.name);\r
         assertEquals(2, r.attribute.size());\r
 \r
+        _logger.info(Lens.toJSON(schema));\r
+\r
     }\r
 \r
 }\r
index ee72a62..312f587 100644 (file)
@@ -4,7 +4,7 @@ module org.utgenome
 \r
 # coordinate system information\r
 class Coordinate\r
-  string :group = "utgb"\r
+  :group = "utgb"\r
   :species \r
   :revision\r
   :name\r
@@ -12,16 +12,18 @@ end
 \r
 # region on a genome sequence\r
 class Locus\r
-  string :id \r
-  integer :start \r
-  integer :end \r
+  :id \r
+  integer :start, :end \r
+\r
+  index interval :start, :end\r
+  index keyword :id\r
 end\r
 \r
 # gene data with sequence data\r
 class Gene < Locus\r
   sequence :sequence \r
-  Exon* exon\r
-  CDS* cds\r
+  Exon* :exon\r
+  CDS* :cds\r
 end\r
 \r
 class Exon < Locus\r
@@ -44,6 +46,7 @@ class Read
   integer* :qv \r
 end \r
 \r
+\r
 # Alignment of reads to a reference genome\r
 relation Alignment\r
   Reference :reference\r
diff --git a/src/test/java/org/xerial/silk/schema/simple-schema.silk b/src/test/java/org/xerial/silk/schema/simple-schema.silk
new file mode 100644 (file)
index 0000000..4e6298d
--- /dev/null
@@ -0,0 +1,50 @@
+%silk(version:1.0, type:schema)\r
+\r
+module org.utgenome\r
+\r
+\r
+# coordinate system information\r
+class Coordinate \r
+end\r
+\r
+# region on a genome sequence\r
+class Locus\r
+  string :id \r
+  integer :start \r
+  integer :end \r
+end\r
+\r
+# gene data with sequence data\r
+class Gene < Locus\r
+  sequence :sequence \r
+  Exon* :exon\r
+  CDS* :cds\r
+end\r
+\r
+class Exon < Locus\r
+end\r
+\r
+class CDS < Locus\r
+end\r
+\r
+# reference sequence\r
+class Reference < Locus\r
+  Coordinate :coodinate\r
+  sequence :sequence \r
+end\r
+\r
+# short-read data\r
+class Read \r
+  includes Locus\r
+  string :sequence \r
+  integer* :qv \r
+end \r
+\r
+# Alignment of reads to a reference genome\r
+relation Alignment\r
+  Reference :reference\r
+  Read* :read \r
+end\r
+\r
+\r
+end \r