OSDN Git Service

belongs to statement
authorleo <leo@ae02f08e-27ec-0310-ae8c-8ba02fe2eafd>
Tue, 7 Jul 2009 03:19:24 +0000 (03:19 +0000)
committerleo <leo@ae02f08e-27ec-0310-ae8c-8ba02fe2eafd>
Tue, 7 Jul 2009 03:19:24 +0000 (03:19 +0000)
git-svn-id: http://www.xerial.org/svn/project/XerialJ/trunk/xerial-core@3445 ae02f08e-27ec-0310-ae8c-8ba02fe2eafd

src/main/java/org/xerial/silk/schema/SilkClass.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

index 93d01c3..6ed38e2 100644 (file)
@@ -37,6 +37,7 @@ public class SilkClass {
     public String name;\r
 \r
     public String parent = null;\r
+    public String belongsTo = null;\r
 \r
     public List<String> mixin;\r
     public List<SilkAttribute> attribute = new ArrayList<SilkAttribute>();\r
index 83a5c68..0a251ef 100644 (file)
@@ -74,8 +74,8 @@ public class SilkSchema {
 \r
             SilkSchemaParser.schema_return ret = parser.schema();\r
 \r
-            if (_logger.isTraceEnabled())\r
-                _logger.trace("parse tree:\n"\r
+            if (_logger.isDebugEnabled())\r
+                _logger.debug("parse tree:\n"\r
                         + ANTLRUtil.parseTree((Tree) ret.getTree(), SilkSchemaParser.tokenNames));\r
 \r
             return Lens.loadANTLRParseTree(SilkSchema.class, (Tree) ret.getTree(),\r
index c6b7c82..115aeb8 100644 (file)
@@ -164,6 +164,7 @@ Includes: 'includes';
 End: 'end';\r
 Relation: 'relation';\r
 Index: 'index';\r
+BelongsTo: 'belongs_to';\r
 \r
 fragment SafeFirstLetter: 'A' .. 'Z' | 'a' .. 'z';\r
 fragment SafeLetter: SafeFirstLetter | '0' .. '9' | '-' | '_';\r
@@ -201,7 +202,9 @@ classDefinition
   | Relation QName classBody End -> ^(Relation Name[$QName.text] classBody)\r
   ; \r
   \r
-classBody: inheritance? (includeStatement | attributes | indexStatement)*;\r
+classBody: inheritance? (belongsToStatement | includeStatement | attributes | indexStatement)*;\r
+\r
+fragment belongsToStatement: BelongsTo QName -> BelongsTo[$QName.text]; \r
   \r
 fragment inheritance: Lt QName -> Parent[$QName.text];\r
   \r
index 795b551..50fabc9 100644 (file)
@@ -21,28 +21,29 @@ DefaultValue=13
 Integer=26\r
 Relation=48\r
 Mixin=9\r
-WhiteSpace=55\r
+WhiteSpace=56\r
 ClassDef=6\r
 LineComment=16\r
-ModuleName=52\r
-SafeFirstLetter=50\r
+ModuleName=53\r
+BelongsTo=50\r
+SafeFirstLetter=51\r
 Star=40\r
 Eq=35\r
 Preamble=15\r
 Exp=28\r
-QNameChar=56\r
+QNameChar=57\r
 RParen=39\r
 UnicodeChar=21\r
 StringChar=23\r
 LineBreak=17\r
 Name=7\r
-ModuleDef=54\r
+ModuleDef=55\r
 LParen=38\r
 String=25\r
-SafeLetter=51\r
+SafeLetter=52\r
 LineBreakChar=14\r
 IsArray=11\r
-QName=57\r
+QName=58\r
 StringChar_s=24\r
 UnsafeUnicodeChar=41\r
 Double=29\r
@@ -51,4 +52,4 @@ RBracket=33
 Lt=34\r
 Parent=8\r
 TypeName=12\r
-WhiteSpaces=53\r
+WhiteSpaces=54\r
index b26bd64..8fb247c 100644 (file)
@@ -1,4 +1,4 @@
-// $ANTLR 3.1.3 Mar 17, 2009 19:23:44 SilkSchema.g 2009-07-06 16:30:59\r
+// $ANTLR 3.1.3 Mar 17, 2009 19:23:44 SilkSchema.g 2009-07-07 12:10:46\r
 \r
 /*--------------------------------------------------------------------------\r
  *  Copyright 2009 Taro L. Saito\r
@@ -57,28 +57,29 @@ public class SilkSchemaLexer extends Lexer {
     public static final int Integer=26;\r
     public static final int Relation=48;\r
     public static final int Mixin=9;\r
-    public static final int WhiteSpace=55;\r
+    public static final int WhiteSpace=56;\r
     public static final int ClassDef=6;\r
     public static final int LineComment=16;\r
-    public static final int ModuleName=52;\r
-    public static final int SafeFirstLetter=50;\r
+    public static final int ModuleName=53;\r
+    public static final int BelongsTo=50;\r
+    public static final int SafeFirstLetter=51;\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=56;\r
+    public static final int QNameChar=57;\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=54;\r
     public static final int LParen=38;\r
+    public static final int ModuleDef=55;\r
     public static final int String=25;\r
-    public static final int SafeLetter=51;\r
+    public static final int SafeLetter=52;\r
     public static final int LineBreakChar=14;\r
     public static final int IsArray=11;\r
-    public static final int QName=57;\r
+    public static final int QName=58;\r
     public static final int EOF=-1;\r
     public static final int StringChar_s=24;\r
     public static final int UnsafeUnicodeChar=41;\r
@@ -88,7 +89,7 @@ public class SilkSchemaLexer extends Lexer {
     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=53;\r
+    public static final int WhiteSpaces=54;\r
 \r
       \r
 \r
@@ -1412,10 +1413,31 @@ public class SilkSchemaLexer extends Lexer {
     }\r
     // $ANTLR end "Index"\r
 \r
+    // $ANTLR start "BelongsTo"\r
+    public final void mBelongsTo() throws RecognitionException {\r
+        try {\r
+            int _type = BelongsTo;\r
+            int _channel = DEFAULT_TOKEN_CHANNEL;\r
+            // SilkSchema.g:167:10: ( 'belongs_to' )\r
+            // SilkSchema.g:167:12: 'belongs_to'\r
+            {\r
+            match("belongs_to"); if (state.failed) return ;\r
+\r
+\r
+            }\r
+\r
+            state.type = _type;\r
+            state.channel = _channel;\r
+        }\r
+        finally {\r
+        }\r
+    }\r
+    // $ANTLR end "BelongsTo"\r
+\r
     // $ANTLR start "SafeFirstLetter"\r
     public final void mSafeFirstLetter() throws RecognitionException {\r
         try {\r
-            // SilkSchema.g:168:25: ( 'A' .. 'Z' | 'a' .. 'z' )\r
+            // SilkSchema.g:169: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
@@ -1440,7 +1462,7 @@ public class SilkSchemaLexer extends Lexer {
     // $ANTLR start "SafeLetter"\r
     public final void mSafeLetter() throws RecognitionException {\r
         try {\r
-            // SilkSchema.g:169:20: ( SafeFirstLetter | '0' .. '9' | '-' | '_' )\r
+            // SilkSchema.g:170: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
@@ -1465,11 +1487,11 @@ public class SilkSchemaLexer extends Lexer {
     // $ANTLR start "ModuleName"\r
     public final void mModuleName() throws RecognitionException {\r
         try {\r
-            // SilkSchema.g:171:20: ( SafeFirstLetter ( SafeLetter )* ( '.' SafeFirstLetter ( SafeLetter )* )* )\r
-            // SilkSchema.g:171:22: SafeFirstLetter ( SafeLetter )* ( '.' SafeFirstLetter ( SafeLetter )* )*\r
+            // SilkSchema.g:172:20: ( SafeFirstLetter ( SafeLetter )* ( '.' SafeFirstLetter ( SafeLetter )* )* )\r
+            // SilkSchema.g:172:22: SafeFirstLetter ( SafeLetter )* ( '.' SafeFirstLetter ( SafeLetter )* )*\r
             {\r
             mSafeFirstLetter(); if (state.failed) return ;\r
-            // SilkSchema.g:171:38: ( SafeLetter )*\r
+            // SilkSchema.g:172:38: ( SafeLetter )*\r
             loop16:\r
             do {\r
                 int alt16=2;\r
@@ -1482,7 +1504,7 @@ public class SilkSchemaLexer extends Lexer {
 \r
                 switch (alt16) {\r
                case 1 :\r
-                   // SilkSchema.g:171:38: SafeLetter\r
+                   // SilkSchema.g:172:38: SafeLetter\r
                    {\r
                    mSafeLetter(); if (state.failed) return ;\r
 \r
@@ -1494,7 +1516,7 @@ public class SilkSchemaLexer extends Lexer {
                 }\r
             } while (true);\r
 \r
-            // SilkSchema.g:171:50: ( '.' SafeFirstLetter ( SafeLetter )* )*\r
+            // SilkSchema.g:172:50: ( '.' SafeFirstLetter ( SafeLetter )* )*\r
             loop18:\r
             do {\r
                 int alt18=2;\r
@@ -1507,11 +1529,11 @@ public class SilkSchemaLexer extends Lexer {
 \r
                 switch (alt18) {\r
                case 1 :\r
-                   // SilkSchema.g:171:51: '.' SafeFirstLetter ( SafeLetter )*\r
+                   // SilkSchema.g:172:51: '.' SafeFirstLetter ( SafeLetter )*\r
                    {\r
                    match('.'); if (state.failed) return ;\r
                    mSafeFirstLetter(); if (state.failed) return ;\r
-                   // SilkSchema.g:171:71: ( SafeLetter )*\r
+                   // SilkSchema.g:172:71: ( SafeLetter )*\r
                    loop17:\r
                    do {\r
                        int alt17=2;\r
@@ -1524,7 +1546,7 @@ public class SilkSchemaLexer extends Lexer {
 \r
                        switch (alt17) {\r
                        case 1 :\r
-                           // SilkSchema.g:171:71: SafeLetter\r
+                           // SilkSchema.g:172:71: SafeLetter\r
                            {\r
                            mSafeLetter(); if (state.failed) return ;\r
 \r
@@ -1561,15 +1583,15 @@ public class SilkSchemaLexer extends Lexer {
             int _channel = DEFAULT_TOKEN_CHANNEL;\r
             Token s=null;\r
 \r
-            // SilkSchema.g:172:10: ( 'module' WhiteSpaces s= ModuleName )\r
-            // SilkSchema.g:172:12: 'module' WhiteSpaces s= ModuleName\r
+            // SilkSchema.g:173:10: ( 'module' WhiteSpaces s= ModuleName )\r
+            // SilkSchema.g:173:12: 'module' WhiteSpaces s= ModuleName\r
             {\r
             match("module"); if (state.failed) return ;\r
 \r
             mWhiteSpaces(); if (state.failed) return ;\r
-            int sStart708 = getCharIndex();\r
+            int sStart715 = getCharIndex();\r
             mModuleName(); if (state.failed) return ;\r
-            s = new CommonToken(input, Token.INVALID_TOKEN_TYPE, Token.DEFAULT_CHANNEL, sStart708, getCharIndex()-1);\r
+            s = new CommonToken(input, Token.INVALID_TOKEN_TYPE, Token.DEFAULT_CHANNEL, sStart715, getCharIndex()-1);\r
             if ( state.backtracking==0 ) {\r
                setText((s!=null?s.getText():null)); \r
             }\r
@@ -1587,8 +1609,8 @@ public class SilkSchemaLexer extends Lexer {
     // $ANTLR start "QNameChar"\r
     public final void mQNameChar() throws RecognitionException {\r
         try {\r
-            // SilkSchema.g:174:19: (~ ( LineBreakChar | UnsafeUnicodeChar | WhiteSpace ) )\r
-            // SilkSchema.g:174:21: ~ ( LineBreakChar | UnsafeUnicodeChar | WhiteSpace )\r
+            // SilkSchema.g:175:19: (~ ( LineBreakChar | UnsafeUnicodeChar | WhiteSpace ) )\r
+            // SilkSchema.g:175: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
@@ -1614,10 +1636,10 @@ public class SilkSchemaLexer extends Lexer {
         try {\r
             int _type = QName;\r
             int _channel = DEFAULT_TOKEN_CHANNEL;\r
-            // SilkSchema.g:175:6: ( ( QNameChar )+ ( Dot ( QNameChar )+ )* )\r
-            // SilkSchema.g:175:8: ( QNameChar )+ ( Dot ( QNameChar )+ )*\r
+            // SilkSchema.g:176:6: ( ( QNameChar )+ ( Dot ( QNameChar )+ )* )\r
+            // SilkSchema.g:176:8: ( QNameChar )+ ( Dot ( QNameChar )+ )*\r
             {\r
-            // SilkSchema.g:175:8: ( QNameChar )+\r
+            // SilkSchema.g:176:8: ( QNameChar )+\r
             int cnt19=0;\r
             loop19:\r
             do {\r
@@ -1631,7 +1653,7 @@ public class SilkSchemaLexer extends Lexer {
 \r
                 switch (alt19) {\r
                case 1 :\r
-                   // SilkSchema.g:175:8: QNameChar\r
+                   // SilkSchema.g:176:8: QNameChar\r
                    {\r
                    mQNameChar(); if (state.failed) return ;\r
 \r
@@ -1648,7 +1670,7 @@ public class SilkSchemaLexer extends Lexer {
                 cnt19++;\r
             } while (true);\r
 \r
-            // SilkSchema.g:175:19: ( Dot ( QNameChar )+ )*\r
+            // SilkSchema.g:176:19: ( Dot ( QNameChar )+ )*\r
             loop21:\r
             do {\r
                 int alt21=2;\r
@@ -1661,10 +1683,10 @@ public class SilkSchemaLexer extends Lexer {
 \r
                 switch (alt21) {\r
                case 1 :\r
-                   // SilkSchema.g:175:20: Dot ( QNameChar )+\r
+                   // SilkSchema.g:176:20: Dot ( QNameChar )+\r
                    {\r
                    mDot(); if (state.failed) return ;\r
-                   // SilkSchema.g:175:24: ( QNameChar )+\r
+                   // SilkSchema.g:176:24: ( QNameChar )+\r
                    int cnt20=0;\r
                    loop20:\r
                    do {\r
@@ -1678,7 +1700,7 @@ public class SilkSchemaLexer extends Lexer {
 \r
                        switch (alt20) {\r
                        case 1 :\r
-                           // SilkSchema.g:175:24: QNameChar\r
+                           // SilkSchema.g:176:24: QNameChar\r
                            {\r
                            mQNameChar(); if (state.failed) return ;\r
 \r
@@ -1718,7 +1740,7 @@ public class SilkSchemaLexer extends Lexer {
     // $ANTLR start "WhiteSpace"\r
     public final void mWhiteSpace() throws RecognitionException {\r
         try {\r
-            // SilkSchema.g:178:11: ( ' ' | '\\t' )\r
+            // SilkSchema.g:179:11: ( ' ' | '\\t' )\r
             // SilkSchema.g:\r
             {\r
             if ( input.LA(1)=='\t'||input.LA(1)==' ' ) {\r
@@ -1745,10 +1767,10 @@ public class SilkSchemaLexer extends Lexer {
         try {\r
             int _type = WhiteSpaces;\r
             int _channel = DEFAULT_TOKEN_CHANNEL;\r
-            // SilkSchema.g:180:12: ( ( WhiteSpace )+ )\r
-            // SilkSchema.g:180:14: ( WhiteSpace )+\r
+            // SilkSchema.g:181:12: ( ( WhiteSpace )+ )\r
+            // SilkSchema.g:181:14: ( WhiteSpace )+\r
             {\r
-            // SilkSchema.g:180:14: ( WhiteSpace )+\r
+            // SilkSchema.g:181:14: ( WhiteSpace )+\r
             int cnt22=0;\r
             loop22:\r
             do {\r
@@ -1762,7 +1784,7 @@ public class SilkSchemaLexer extends Lexer {
 \r
                 switch (alt22) {\r
                case 1 :\r
-                   // SilkSchema.g:180:14: WhiteSpace\r
+                   // SilkSchema.g:181:14: WhiteSpace\r
                    {\r
                    mWhiteSpace(); if (state.failed) return ;\r
 \r
@@ -1794,8 +1816,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 | Index | ModuleDef | QName | WhiteSpaces )\r
-        int alt23=26;\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 | BelongsTo | ModuleDef | QName | WhiteSpaces )\r
+        int alt23=27;\r
         alt23 = dfa23.predict(input);\r
         switch (alt23) {\r
             case 1 :\r
@@ -1960,21 +1982,28 @@ public class SilkSchemaLexer extends Lexer {
                 }\r
                 break;\r
             case 24 :\r
-                // SilkSchema.g:1:171: ModuleDef\r
+                // SilkSchema.g:1:171: BelongsTo\r
                 {\r
-                mModuleDef(); if (state.failed) return ;\r
+                mBelongsTo(); if (state.failed) return ;\r
 \r
                 }\r
                 break;\r
             case 25 :\r
-                // SilkSchema.g:1:181: QName\r
+                // SilkSchema.g:1:181: ModuleDef\r
                 {\r
-                mQName(); if (state.failed) return ;\r
+                mModuleDef(); if (state.failed) return ;\r
 \r
                 }\r
                 break;\r
             case 26 :\r
-                // SilkSchema.g:1:187: WhiteSpaces\r
+                // SilkSchema.g:1:191: QName\r
+                {\r
+                mQName(); if (state.failed) return ;\r
+\r
+                }\r
+                break;\r
+            case 27 :\r
+                // SilkSchema.g:1:197: WhiteSpaces\r
                 {\r
                 mWhiteSpaces(); if (state.failed) return ;\r
 \r
@@ -1988,154 +2017,169 @@ public class SilkSchemaLexer extends Lexer {
 \r
     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\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
+        "\6\uffff\2\36\5\uffff\1\42\6\uffff\6\32\2\uffff\2\36\2\uffff\1"+\r
+        "\32\1\36\1\uffff\6\32\1\uffff\1\36\1\51\1\32\1\51\3\32\1\71\7\32"+\r
+        "\1\uffff\4\32\1\51\1\105\1\32\1\107\3\32\1\uffff\1\32\1\uffff\6"+\r
+        "\32\1\uffff\1\122\1\123\1\32\2\uffff\1\32\1\126\1\uffff";\r
     static final String DFA23_eofS =\r
-        "\114\uffff";\r
+        "\127\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\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
+        "\1\0\4\uffff\1\60\2\0\5\uffff\1\0\6\uffff\1\154\2\156\2\145\1\157"+\r
+        "\2\uffff\2\56\1\uffff\1\0\1\53\1\0\1\uffff\1\141\1\143\1\144\2\154"+\r
+        "\1\144\1\uffff\1\56\1\0\1\60\1\0\1\163\1\154\1\145\1\0\1\141\1\157"+\r
+        "\1\165\1\53\1\163\1\165\1\170\1\uffff\1\164\1\156\1\154\1\60\2\0"+\r
+        "\1\144\1\0\1\151\1\147\1\145\1\uffff\1\145\1\uffff\1\157\1\163\1"+\r
+        "\11\1\163\1\156\1\137\1\uffff\2\0\1\164\2\uffff\1\157\1\0\1\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\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
+        "\2\145\1\157\2\uffff\2\145\1\uffff\1\uffff\1\71\1\uffff\1\uffff"+\r
+        "\1\141\2\144\2\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\157\1\165\1\71\1\163\1\165\1\170\1"+\r
+        "\uffff\1\164\1\156\1\154\1\71\2\uffff\1\144\1\uffff\1\151\1\147"+\r
+        "\1\145\1\uffff\1\145\1\uffff\1\157\1\163\1\40\1\163\1\156\1\137"+\r
+        "\1\uffff\2\uffff\1\164\2\uffff\1\157\1\uffff\1\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\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
+        "\1\15\1\16\1\17\1\20\1\21\1\22\6\uffff\1\32\1\33\2\uffff\1\5\3\uffff"+\r
+        "\1\14\6\uffff\1\6\17\uffff\1\25\13\uffff\1\23\1\uffff\1\27\6\uffff"+\r
+        "\1\31\3\uffff\1\24\1\26\2\uffff\1\30";\r
     static final String DFA23_specialS =\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
+        "\1\7\5\uffff\1\4\1\14\5\uffff\1\12\21\uffff\1\3\1\uffff\1\10\11"+\r
+        "\uffff\1\1\1\uffff\1\11\3\uffff\1\15\14\uffff\1\5\1\13\1\uffff\1"+\r
+        "\6\15\uffff\1\2\1\0\4\uffff\1\16\1\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
-            "\1\23\1\31\1\14\1\15\1\uffff\1\31\1\uffff\32\31\1\12\1\uffff"+\r
-            "\1\13\5\31\1\24\1\31\1\26\3\31\1\25\3\31\1\30\4\31\1\27\10\31"+\r
-            "\1\10\1\uffff\1\11\uff82\31",\r
+            "\11\32\1\33\1\3\2\32\1\3\22\32\1\33\1\32\1\4\1\2\1\32\1\1\1"+\r
+            "\32\1\uffff\1\20\1\21\1\22\1\32\1\17\1\5\1\16\1\32\1\6\11\7"+\r
+            "\1\23\1\32\1\14\1\15\1\uffff\1\32\1\uffff\32\32\1\12\1\uffff"+\r
+            "\1\13\4\32\1\30\1\24\1\32\1\26\3\32\1\25\3\32\1\31\4\32\1\27"+\r
+            "\10\32\1\10\1\uffff\1\11\uff82\32",\r
             "",\r
             "",\r
             "",\r
             "",\r
-            "\1\33\11\34",\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\1\36\13\31\1\uffff\1\31\1"+\r
-            "\uffff\1\31\1\uffff\1\31\1\uffff\4\31\1\37\25\31\3\uffff\7\31"+\r
-            "\1\37\25\31\3\uffff\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\1\36\1\31\12\40\1\uffff\1"+\r
-            "\31\1\uffff\1\31\1\uffff\1\31\1\uffff\4\31\1\37\25\31\3\uffff"+\r
-            "\7\31\1\37\25\31\3\uffff\uff82\31",\r
+            "\1\34\11\35",\r
+            "\11\32\2\uffff\2\32\1\uffff\22\32\1\uffff\1\32\2\uffff\1\32"+\r
+            "\1\uffff\1\32\4\uffff\1\32\2\uffff\1\37\13\32\1\uffff\1\32\1"+\r
+            "\uffff\1\32\1\uffff\1\32\1\uffff\4\32\1\40\25\32\3\uffff\7\32"+\r
+            "\1\40\25\32\3\uffff\uff82\32",\r
+            "\11\32\2\uffff\2\32\1\uffff\22\32\1\uffff\1\32\2\uffff\1\32"+\r
+            "\1\uffff\1\32\4\uffff\1\32\2\uffff\1\37\1\32\12\41\1\uffff\1"+\r
+            "\32\1\uffff\1\32\1\uffff\1\32\1\uffff\4\32\1\40\25\32\3\uffff"+\r
+            "\7\32\1\40\25\32\3\uffff\uff82\32",\r
             "",\r
             "",\r
             "",\r
             "",\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
-            "\31",\r
+            "\11\32\2\uffff\2\32\1\uffff\22\32\1\uffff\1\32\2\uffff\1\32"+\r
+            "\1\uffff\1\32\4\uffff\1\32\2\uffff\14\32\1\uffff\1\32\1\uffff"+\r
+            "\1\32\1\uffff\1\32\1\uffff\32\32\3\uffff\35\32\3\uffff\uff82"+\r
+            "\32",\r
             "",\r
             "",\r
             "",\r
             "",\r
             "",\r
             "",\r
-            "\1\42",\r
             "\1\43",\r
             "\1\44",\r
             "\1\45",\r
             "\1\46",\r
+            "\1\47",\r
+            "\1\50",\r
             "",\r
             "",\r
-            "\1\47\26\uffff\1\47\37\uffff\1\47",\r
-            "\1\47\1\uffff\12\50\13\uffff\1\47\37\uffff\1\47",\r
+            "\1\51\26\uffff\1\51\37\uffff\1\51",\r
+            "\1\51\1\uffff\12\52\13\uffff\1\51\37\uffff\1\51",\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\3\uffff\1\31\12\51\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\52\1\uffff\1\47\2\uffff\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\1\36\1\31\12\40\1\uffff\1"+\r
-            "\31\1\uffff\1\31\1\uffff\1\31\1\uffff\4\31\1\37\25\31\3\uffff"+\r
-            "\7\31\1\37\25\31\3\uffff\uff82\31",\r
+            "\11\32\2\uffff\2\32\1\uffff\22\32\1\uffff\1\32\2\uffff\1\32"+\r
+            "\1\uffff\1\32\4\uffff\1\32\3\uffff\1\32\12\53\1\uffff\1\32\1"+\r
+            "\uffff\1\32\1\uffff\1\32\1\uffff\32\32\3\uffff\35\32\3\uffff"+\r
+            "\uff82\32",\r
+            "\1\54\1\uffff\1\51\2\uffff\12\55",\r
+            "\11\32\2\uffff\2\32\1\uffff\22\32\1\uffff\1\32\2\uffff\1\32"+\r
+            "\1\uffff\1\32\4\uffff\1\32\2\uffff\1\37\1\32\12\41\1\uffff\1"+\r
+            "\32\1\uffff\1\32\1\uffff\1\32\1\uffff\4\32\1\40\25\32\3\uffff"+\r
+            "\7\32\1\40\25\32\3\uffff\uff82\32",\r
             "",\r
-            "\1\54",\r
-            "\1\55\1\56",\r
-            "\1\57",\r
-            "\1\60",\r
+            "\1\56",\r
+            "\1\57\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\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
+            "",\r
+            "\1\51\1\uffff\12\52\13\uffff\1\51\37\uffff\1\51",\r
+            "\11\32\2\uffff\2\32\1\uffff\22\32\1\uffff\1\32\2\uffff\1\32"+\r
+            "\1\uffff\1\32\4\uffff\1\32\2\uffff\2\32\12\53\1\uffff\1\32\1"+\r
+            "\uffff\1\32\1\uffff\1\32\1\uffff\4\32\1\65\25\32\3\uffff\7\32"+\r
+            "\1\65\25\32\3\uffff\uff82\32",\r
+            "\12\55",\r
+            "\11\32\2\uffff\2\32\1\uffff\22\32\1\uffff\1\32\2\uffff\1\32"+\r
+            "\1\uffff\1\32\4\uffff\1\32\2\uffff\2\32\12\55\1\uffff\1\32\1"+\r
+            "\uffff\1\32\1\uffff\1\32\1\uffff\32\32\3\uffff\35\32\3\uffff"+\r
+            "\uff82\32",\r
+            "\1\66",\r
             "\1\67",\r
             "\1\70",\r
-            "\1\71\1\uffff\1\47\2\uffff\12\72",\r
+            "\11\32\2\uffff\2\32\1\uffff\22\32\1\uffff\1\32\2\uffff\1\32"+\r
+            "\1\uffff\1\32\4\uffff\1\32\2\uffff\14\32\1\uffff\1\32\1\uffff"+\r
+            "\1\32\1\uffff\1\32\1\uffff\32\32\3\uffff\35\32\3\uffff\uff82"+\r
+            "\32",\r
+            "\1\72",\r
             "\1\73",\r
             "\1\74",\r
-            "\1\75",\r
-            "",\r
-            "\1\76",\r
+            "\1\75\1\uffff\1\51\2\uffff\12\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\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\100",\r
             "\1\101",\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
+            "",\r
+            "\1\102",\r
             "\1\103",\r
             "\1\104",\r
-            "",\r
-            "\1\105",\r
-            "",\r
+            "\12\76",\r
+            "\11\32\2\uffff\2\32\1\uffff\22\32\1\uffff\1\32\2\uffff\1\32"+\r
+            "\1\uffff\1\32\4\uffff\1\32\2\uffff\2\32\12\76\1\uffff\1\32\1"+\r
+            "\uffff\1\32\1\uffff\1\32\1\uffff\32\32\3\uffff\35\32\3\uffff"+\r
+            "\uff82\32",\r
+            "\11\32\2\uffff\2\32\1\uffff\22\32\1\uffff\1\32\2\uffff\1\32"+\r
+            "\1\uffff\1\32\4\uffff\1\32\2\uffff\14\32\1\uffff\1\32\1\uffff"+\r
+            "\1\32\1\uffff\1\32\1\uffff\32\32\3\uffff\35\32\3\uffff\uff82"+\r
+            "\32",\r
             "\1\106",\r
-            "\1\107\26\uffff\1\107",\r
+            "\11\32\2\uffff\2\32\1\uffff\22\32\1\uffff\1\32\2\uffff\1\32"+\r
+            "\1\uffff\1\32\4\uffff\1\32\2\uffff\14\32\1\uffff\1\32\1\uffff"+\r
+            "\1\32\1\uffff\1\32\1\uffff\32\32\3\uffff\35\32\3\uffff\uff82"+\r
+            "\32",\r
             "\1\110",\r
             "\1\111",\r
+            "\1\112",\r
+            "",\r
+            "\1\113",\r
+            "",\r
+            "\1\114",\r
+            "\1\115",\r
+            "\1\116\26\uffff\1\116",\r
+            "\1\117",\r
+            "\1\120",\r
+            "\1\121",\r
+            "",\r
+            "\11\32\2\uffff\2\32\1\uffff\22\32\1\uffff\1\32\2\uffff\1\32"+\r
+            "\1\uffff\1\32\4\uffff\1\32\2\uffff\14\32\1\uffff\1\32\1\uffff"+\r
+            "\1\32\1\uffff\1\32\1\uffff\32\32\3\uffff\35\32\3\uffff\uff82"+\r
+            "\32",\r
+            "\11\32\2\uffff\2\32\1\uffff\22\32\1\uffff\1\32\2\uffff\1\32"+\r
+            "\1\uffff\1\32\4\uffff\1\32\2\uffff\14\32\1\uffff\1\32\1\uffff"+\r
+            "\1\32\1\uffff\1\32\1\uffff\32\32\3\uffff\35\32\3\uffff\uff82"+\r
+            "\32",\r
+            "\1\124",\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
-            "\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
             "",\r
+            "\1\125",\r
+            "\11\32\2\uffff\2\32\1\uffff\22\32\1\uffff\1\32\2\uffff\1\32"+\r
+            "\1\uffff\1\32\4\uffff\1\32\2\uffff\14\32\1\uffff\1\32\1\uffff"+\r
+            "\1\32\1\uffff\1\32\1\uffff\32\32\3\uffff\35\32\3\uffff\uff82"+\r
+            "\32",\r
             ""\r
     };\r
 \r
@@ -2169,109 +2213,93 @@ 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 | Index | 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 | BelongsTo | 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_59 = input.LA(1);\r
+                        int LA23_80 = input.LA(1);\r
 \r
                         s = -1;\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
+                        if ( ((LA23_80>='\u0000' && LA23_80<='\b')||(LA23_80>='\u000B' && LA23_80<='\f')||(LA23_80>='\u000E' && LA23_80<='\u001F')||LA23_80=='!'||LA23_80=='$'||LA23_80=='&'||LA23_80=='+'||(LA23_80>='.' && LA23_80<='9')||LA23_80==';'||LA23_80=='='||LA23_80=='?'||(LA23_80>='A' && LA23_80<='Z')||(LA23_80>='^' && LA23_80<='z')||(LA23_80>='~' && LA23_80<='\uFFFF')) ) {s = 26;}\r
 \r
-                        else s = 64;\r
+                        else s = 83;\r
 \r
                         if ( s>=0 ) return s;\r
                         break;\r
                     case 1 : \r
-                        int LA23_32 = input.LA(1);\r
+                        int LA23_43 = 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
+                        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<='D')||(LA23_43>='F' && LA23_43<='Z')||(LA23_43>='^' && LA23_43<='d')||(LA23_43>='f' && LA23_43<='z')||(LA23_43>='~' && LA23_43<='\uFFFF')) ) {s = 26;}\r
 \r
-                        else if ( ((LA23_32>='0' && LA23_32<='9')) ) {s = 32;}\r
+                        else if ( (LA23_43=='E'||LA23_43=='e') ) {s = 53;}\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
+                        else if ( ((LA23_43>='0' && LA23_43<='9')) ) {s = 43;}\r
 \r
-                        else s = 29;\r
+                        else s = 41;\r
 \r
                         if ( s>=0 ) return s;\r
                         break;\r
                     case 2 : \r
-                        int LA23_6 = input.LA(1);\r
+                        int LA23_79 = input.LA(1);\r
 \r
                         s = -1;\r
-                        if ( (LA23_6=='.') ) {s = 30;}\r
+                        if ( ((LA23_79>='\u0000' && LA23_79<='\b')||(LA23_79>='\u000B' && LA23_79<='\f')||(LA23_79>='\u000E' && LA23_79<='\u001F')||LA23_79=='!'||LA23_79=='$'||LA23_79=='&'||LA23_79=='+'||(LA23_79>='.' && LA23_79<='9')||LA23_79==';'||LA23_79=='='||LA23_79=='?'||(LA23_79>='A' && LA23_79<='Z')||(LA23_79>='^' && LA23_79<='z')||(LA23_79>='~' && LA23_79<='\uFFFF')) ) {s = 26;}\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
+                        else s = 82;\r
 \r
                         if ( s>=0 ) return s;\r
                         break;\r
                     case 3 : \r
-                        int LA23_47 = input.LA(1);\r
+                        int LA23_31 = 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
+                        if ( ((LA23_31>='0' && LA23_31<='9')) ) {s = 43;}\r
 \r
-                        else s = 54;\r
+                        else if ( ((LA23_31>='\u0000' && LA23_31<='\b')||(LA23_31>='\u000B' && LA23_31<='\f')||(LA23_31>='\u000E' && LA23_31<='\u001F')||LA23_31=='!'||LA23_31=='$'||LA23_31=='&'||LA23_31=='+'||LA23_31=='/'||LA23_31==';'||LA23_31=='='||LA23_31=='?'||(LA23_31>='A' && LA23_31<='Z')||(LA23_31>='^' && LA23_31<='z')||(LA23_31>='~' && LA23_31<='\uFFFF')) ) {s = 26;}\r
 \r
                         if ( s>=0 ) return s;\r
                         break;\r
                     case 4 : \r
-                        int LA23_72 = input.LA(1);\r
+                        int LA23_6 = 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
+                        if ( (LA23_6=='.') ) {s = 31;}\r
+\r
+                        else if ( (LA23_6=='E'||LA23_6=='e') ) {s = 32;}\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 = 26;}\r
 \r
-                        else s = 74;\r
+                        else s = 30;\r
 \r
                         if ( s>=0 ) return s;\r
                         break;\r
                     case 5 : \r
-                        int LA23_41 = input.LA(1);\r
+                        int LA23_62 = 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
+                        if ( ((LA23_62>='\u0000' && LA23_62<='\b')||(LA23_62>='\u000B' && LA23_62<='\f')||(LA23_62>='\u000E' && LA23_62<='\u001F')||LA23_62=='!'||LA23_62=='$'||LA23_62=='&'||LA23_62=='+'||(LA23_62>='.' && LA23_62<='/')||LA23_62==';'||LA23_62=='='||LA23_62=='?'||(LA23_62>='A' && LA23_62<='Z')||(LA23_62>='^' && LA23_62<='z')||(LA23_62>='~' && LA23_62<='\uFFFF')) ) {s = 26;}\r
 \r
-                        else if ( (LA23_41=='E'||LA23_41=='e') ) {s = 50;}\r
+                        else if ( ((LA23_62>='0' && LA23_62<='9')) ) {s = 62;}\r
 \r
-                        else if ( ((LA23_41>='0' && LA23_41<='9')) ) {s = 41;}\r
-\r
-                        else s = 39;\r
+                        else s = 41;\r
 \r
                         if ( s>=0 ) return s;\r
                         break;\r
                     case 6 : \r
-                        int LA23_61 = input.LA(1);\r
+                        int LA23_65 = input.LA(1);\r
 \r
                         s = -1;\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
+                        if ( ((LA23_65>='\u0000' && LA23_65<='\b')||(LA23_65>='\u000B' && LA23_65<='\f')||(LA23_65>='\u000E' && LA23_65<='\u001F')||LA23_65=='!'||LA23_65=='$'||LA23_65=='&'||LA23_65=='+'||(LA23_65>='.' && LA23_65<='9')||LA23_65==';'||LA23_65=='='||LA23_65=='?'||(LA23_65>='A' && LA23_65<='Z')||(LA23_65>='^' && LA23_65<='z')||(LA23_65>='~' && LA23_65<='\uFFFF')) ) {s = 26;}\r
 \r
-                        else s = 66;\r
+                        else s = 71;\r
 \r
                         if ( s>=0 ) return s;\r
                         break;\r
                     case 7 : \r
-                        int LA23_58 = input.LA(1);\r
-\r
-                        s = -1;\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_58>='0' && LA23_58<='9')) ) {s = 58;}\r
-\r
-                        else s = 39;\r
-\r
-                        if ( s>=0 ) return s;\r
-                        break;\r
-                    case 8 : \r
                         int LA23_0 = input.LA(1);\r
 \r
                          \r
@@ -2324,45 +2352,63 @@ public class SilkSchemaLexer extends Lexer {
 \r
                         else if ( (LA23_0=='r') ) {s = 23;}\r
 \r
-                        else if ( (LA23_0=='m') ) {s = 24;}\r
+                        else if ( (LA23_0=='b') ) {s = 24;}\r
 \r
-                        else if ( ((LA23_0>='\u0000' && LA23_0<='\b')||(LA23_0>='\u000B' && LA23_0<='\f')||(LA23_0>='\u000E' && LA23_0<='\u001F')||LA23_0=='!'||LA23_0=='$'||LA23_0=='&'||LA23_0=='+'||LA23_0=='/'||LA23_0==';'||LA23_0=='?'||(LA23_0>='A' && LA23_0<='Z')||(LA23_0>='^' && LA23_0<='b')||LA23_0=='d'||(LA23_0>='f' && LA23_0<='h')||(LA23_0>='j' && LA23_0<='l')||(LA23_0>='n' && LA23_0<='q')||(LA23_0>='s' && LA23_0<='z')||(LA23_0>='~' && LA23_0<='\uFFFF')) ) {s = 25;}\r
+                        else if ( (LA23_0=='m') ) {s = 25;}\r
 \r
-                        else if ( (LA23_0=='\t'||LA23_0==' ') ) {s = 26;}\r
+                        else if ( ((LA23_0>='\u0000' && LA23_0<='\b')||(LA23_0>='\u000B' && LA23_0<='\f')||(LA23_0>='\u000E' && LA23_0<='\u001F')||LA23_0=='!'||LA23_0=='$'||LA23_0=='&'||LA23_0=='+'||LA23_0=='/'||LA23_0==';'||LA23_0=='?'||(LA23_0>='A' && LA23_0<='Z')||(LA23_0>='^' && LA23_0<='a')||LA23_0=='d'||(LA23_0>='f' && LA23_0<='h')||(LA23_0>='j' && LA23_0<='l')||(LA23_0>='n' && LA23_0<='q')||(LA23_0>='s' && LA23_0<='z')||(LA23_0>='~' && LA23_0<='\uFFFF')) ) {s = 26;}\r
+\r
+                        else if ( (LA23_0=='\t'||LA23_0==' ') ) {s = 27;}\r
 \r
                          \r
                         input.seek(index23_0);\r
                         if ( s>=0 ) return s;\r
                         break;\r
+                    case 8 : \r
+                        int LA23_33 = input.LA(1);\r
+\r
+                        s = -1;\r
+                        if ( (LA23_33=='.') ) {s = 31;}\r
+\r
+                        else if ( (LA23_33=='E'||LA23_33=='e') ) {s = 32;}\r
+\r
+                        else if ( ((LA23_33>='0' && LA23_33<='9')) ) {s = 33;}\r
+\r
+                        else if ( ((LA23_33>='\u0000' && LA23_33<='\b')||(LA23_33>='\u000B' && LA23_33<='\f')||(LA23_33>='\u000E' && LA23_33<='\u001F')||LA23_33=='!'||LA23_33=='$'||LA23_33=='&'||LA23_33=='+'||LA23_33=='/'||LA23_33==';'||LA23_33=='='||LA23_33=='?'||(LA23_33>='A' && LA23_33<='D')||(LA23_33>='F' && LA23_33<='Z')||(LA23_33>='^' && LA23_33<='d')||(LA23_33>='f' && LA23_33<='z')||(LA23_33>='~' && LA23_33<='\uFFFF')) ) {s = 26;}\r
+\r
+                        else s = 30;\r
+\r
+                        if ( s>=0 ) return s;\r
+                        break;\r
                     case 9 : \r
-                        int LA23_43 = input.LA(1);\r
+                        int LA23_45 = input.LA(1);\r
 \r
                         s = -1;\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
+                        if ( ((LA23_45>='0' && LA23_45<='9')) ) {s = 45;}\r
 \r
-                        else if ( ((LA23_43>='0' && LA23_43<='9')) ) {s = 43;}\r
+                        else if ( ((LA23_45>='\u0000' && LA23_45<='\b')||(LA23_45>='\u000B' && LA23_45<='\f')||(LA23_45>='\u000E' && LA23_45<='\u001F')||LA23_45=='!'||LA23_45=='$'||LA23_45=='&'||LA23_45=='+'||(LA23_45>='.' && LA23_45<='/')||LA23_45==';'||LA23_45=='='||LA23_45=='?'||(LA23_45>='A' && LA23_45<='Z')||(LA23_45>='^' && LA23_45<='z')||(LA23_45>='~' && LA23_45<='\uFFFF')) ) {s = 26;}\r
 \r
-                        else s = 39;\r
+                        else s = 41;\r
 \r
                         if ( s>=0 ) return s;\r
                         break;\r
                     case 10 : \r
-                        int LA23_30 = input.LA(1);\r
+                        int LA23_13 = input.LA(1);\r
 \r
                         s = -1;\r
-                        if ( ((LA23_30>='0' && LA23_30<='9')) ) {s = 41;}\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 = 26;}\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 = 34;\r
 \r
                         if ( s>=0 ) return s;\r
                         break;\r
                     case 11 : \r
-                        int LA23_13 = input.LA(1);\r
+                        int LA23_63 = 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_63>='\u0000' && LA23_63<='\b')||(LA23_63>='\u000B' && LA23_63<='\f')||(LA23_63>='\u000E' && LA23_63<='\u001F')||LA23_63=='!'||LA23_63=='$'||LA23_63=='&'||LA23_63=='+'||(LA23_63>='.' && LA23_63<='9')||LA23_63==';'||LA23_63=='='||LA23_63=='?'||(LA23_63>='A' && LA23_63<='Z')||(LA23_63>='^' && LA23_63<='z')||(LA23_63>='~' && LA23_63<='\uFFFF')) ) {s = 26;}\r
 \r
-                        else s = 33;\r
+                        else s = 69;\r
 \r
                         if ( s>=0 ) return s;\r
                         break;\r
@@ -2370,25 +2416,35 @@ public class SilkSchemaLexer extends Lexer {
                         int LA23_7 = input.LA(1);\r
 \r
                         s = -1;\r
-                        if ( (LA23_7=='.') ) {s = 30;}\r
+                        if ( ((LA23_7>='0' && LA23_7<='9')) ) {s = 33;}\r
 \r
-                        else if ( ((LA23_7>='0' && LA23_7<='9')) ) {s = 32;}\r
+                        else if ( (LA23_7=='.') ) {s = 31;}\r
 \r
-                        else if ( (LA23_7=='E'||LA23_7=='e') ) {s = 31;}\r
+                        else if ( (LA23_7=='E'||LA23_7=='e') ) {s = 32;}\r
 \r
-                        else if ( ((LA23_7>='\u0000' && LA23_7<='\b')||(LA23_7>='\u000B' && LA23_7<='\f')||(LA23_7>='\u000E' && LA23_7<='\u001F')||LA23_7=='!'||LA23_7=='$'||LA23_7=='&'||LA23_7=='+'||LA23_7=='/'||LA23_7==';'||LA23_7=='='||LA23_7=='?'||(LA23_7>='A' && LA23_7<='D')||(LA23_7>='F' && LA23_7<='Z')||(LA23_7>='^' && LA23_7<='d')||(LA23_7>='f' && LA23_7<='z')||(LA23_7>='~' && LA23_7<='\uFFFF')) ) {s = 25;}\r
+                        else if ( ((LA23_7>='\u0000' && LA23_7<='\b')||(LA23_7>='\u000B' && LA23_7<='\f')||(LA23_7>='\u000E' && LA23_7<='\u001F')||LA23_7=='!'||LA23_7=='$'||LA23_7=='&'||LA23_7=='+'||LA23_7=='/'||LA23_7==';'||LA23_7=='='||LA23_7=='?'||(LA23_7>='A' && LA23_7<='D')||(LA23_7>='F' && LA23_7<='Z')||(LA23_7>='^' && LA23_7<='d')||(LA23_7>='f' && LA23_7<='z')||(LA23_7>='~' && LA23_7<='\uFFFF')) ) {s = 26;}\r
 \r
-                        else s = 29;\r
+                        else s = 30;\r
 \r
                         if ( s>=0 ) return s;\r
                         break;\r
                     case 13 : \r
-                        int LA23_73 = input.LA(1);\r
+                        int LA23_49 = input.LA(1);\r
+\r
+                        s = -1;\r
+                        if ( ((LA23_49>='\u0000' && LA23_49<='\b')||(LA23_49>='\u000B' && LA23_49<='\f')||(LA23_49>='\u000E' && LA23_49<='\u001F')||LA23_49=='!'||LA23_49=='$'||LA23_49=='&'||LA23_49=='+'||(LA23_49>='.' && LA23_49<='9')||LA23_49==';'||LA23_49=='='||LA23_49=='?'||(LA23_49>='A' && LA23_49<='Z')||(LA23_49>='^' && LA23_49<='z')||(LA23_49>='~' && LA23_49<='\uFFFF')) ) {s = 26;}\r
+\r
+                        else s = 57;\r
+\r
+                        if ( s>=0 ) return s;\r
+                        break;\r
+                    case 14 : \r
+                        int LA23_85 = input.LA(1);\r
 \r
                         s = -1;\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
+                        if ( ((LA23_85>='\u0000' && LA23_85<='\b')||(LA23_85>='\u000B' && LA23_85<='\f')||(LA23_85>='\u000E' && LA23_85<='\u001F')||LA23_85=='!'||LA23_85=='$'||LA23_85=='&'||LA23_85=='+'||(LA23_85>='.' && LA23_85<='9')||LA23_85==';'||LA23_85=='='||LA23_85=='?'||(LA23_85>='A' && LA23_85<='Z')||(LA23_85>='^' && LA23_85<='z')||(LA23_85>='~' && LA23_85<='\uFFFF')) ) {s = 26;}\r
 \r
-                        else s = 75;\r
+                        else s = 86;\r
 \r
                         if ( s>=0 ) return s;\r
                         break;\r
index b95b32c..54b8bdc 100644 (file)
@@ -1,4 +1,4 @@
-// $ANTLR 3.1.3 Mar 17, 2009 19:23:44 SilkSchema.g 2009-07-06 16:30:58\r
+// $ANTLR 3.1.3 Mar 17, 2009 19:23:44 SilkSchema.g 2009-07-07 12:10:45\r
 \r
 /*--------------------------------------------------------------------------\r
  *  Copyright 2009 Taro L. Saito\r
@@ -35,7 +35,7 @@ import org.antlr.runtime.tree.*;
 \r
 public class SilkSchemaParser extends Parser {\r
     public static final String[] tokenNames = new String[] {\r
-        "<invalid>", "<EOR>", "<DOWN>", "<UP>", "Schema", "Module", "ClassDef", "Name", "Parent", "Mixin", "Attribute", "IsArray", "TypeName", "DefaultValue", "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
+        "<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", "BelongsTo", "SafeFirstLetter", "SafeLetter", "ModuleName", "WhiteSpaces", "ModuleDef", "WhiteSpace", "QNameChar", "QName"\r
     };\r
     public static final int Includes=46;\r
     public static final int RBrace=31;\r
@@ -60,28 +60,29 @@ public class SilkSchemaParser extends Parser {
     public static final int Integer=26;\r
     public static final int Relation=48;\r
     public static final int Mixin=9;\r
-    public static final int WhiteSpace=55;\r
+    public static final int WhiteSpace=56;\r
     public static final int ClassDef=6;\r
     public static final int LineComment=16;\r
-    public static final int ModuleName=52;\r
-    public static final int SafeFirstLetter=50;\r
+    public static final int ModuleName=53;\r
+    public static final int BelongsTo=50;\r
+    public static final int SafeFirstLetter=51;\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=56;\r
+    public static final int QNameChar=57;\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=54;\r
+    public static final int ModuleDef=55;\r
     public static final int LParen=38;\r
     public static final int String=25;\r
-    public static final int SafeLetter=51;\r
+    public static final int SafeLetter=52;\r
     public static final int LineBreakChar=14;\r
     public static final int IsArray=11;\r
-    public static final int QName=57;\r
+    public static final int QName=58;\r
     public static final int EOF=-1;\r
     public static final int StringChar_s=24;\r
     public static final int UnsafeUnicodeChar=41;\r
@@ -91,7 +92,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=53;\r
+    public static final int WhiteSpaces=54;\r
 \r
     // delegates\r
     // delegators\r
@@ -124,7 +125,7 @@ public class SilkSchemaParser extends Parser {
     };\r
 \r
     // $ANTLR start "schema"\r
-    // SilkSchema.g:185:1: schema : ( Preamble )? ( schemaElement )* -> ^( Schema ( Preamble )? ( schemaElement )* ) ;\r
+    // SilkSchema.g:186: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
@@ -139,10 +140,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:185:7: ( ( Preamble )? ( schemaElement )* -> ^( Schema ( Preamble )? ( schemaElement )* ) )\r
-            // SilkSchema.g:185:10: ( Preamble )? ( schemaElement )*\r
+            // SilkSchema.g:186:7: ( ( Preamble )? ( schemaElement )* -> ^( Schema ( Preamble )? ( schemaElement )* ) )\r
+            // SilkSchema.g:186:10: ( Preamble )? ( schemaElement )*\r
             {\r
-            // SilkSchema.g:185:10: ( Preamble )?\r
+            // SilkSchema.g:186:10: ( Preamble )?\r
             int alt1=2;\r
             int LA1_0 = input.LA(1);\r
 \r
@@ -151,9 +152,9 @@ public class SilkSchemaParser extends Parser {
             }\r
             switch (alt1) {\r
                 case 1 :\r
-                    // SilkSchema.g:185:10: Preamble\r
+                    // SilkSchema.g:186:10: Preamble\r
                     {\r
-                    Preamble1=(Token)match(input,Preamble,FOLLOW_Preamble_in_schema835);  \r
+                    Preamble1=(Token)match(input,Preamble,FOLLOW_Preamble_in_schema841);  \r
                     stream_Preamble.add(Preamble1);\r
 \r
 \r
@@ -162,7 +163,7 @@ public class SilkSchemaParser extends Parser {
 \r
             }\r
 \r
-            // SilkSchema.g:185:20: ( schemaElement )*\r
+            // SilkSchema.g:186:20: ( schemaElement )*\r
             loop2:\r
             do {\r
                 int alt2=2;\r
@@ -175,9 +176,9 @@ public class SilkSchemaParser extends Parser {
 \r
                 switch (alt2) {\r
                case 1 :\r
-                   // SilkSchema.g:185:20: schemaElement\r
+                   // SilkSchema.g:186:20: schemaElement\r
                    {\r
-                   pushFollow(FOLLOW_schemaElement_in_schema838);\r
+                   pushFollow(FOLLOW_schemaElement_in_schema844);\r
                    schemaElement2=schemaElement();\r
 \r
                    state._fsp--;\r
@@ -205,20 +206,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
-            // 185:36: -> ^( Schema ( Preamble )? ( schemaElement )* )\r
+            // 186:36: -> ^( Schema ( Preamble )? ( schemaElement )* )\r
             {\r
-                // SilkSchema.g:185:39: ^( Schema ( Preamble )? ( schemaElement )* )\r
+                // SilkSchema.g:186: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:185:48: ( Preamble )?\r
+                // SilkSchema.g:186:48: ( Preamble )?\r
                 if ( stream_Preamble.hasNext() ) {\r
                     adaptor.addChild(root_1, stream_Preamble.nextNode());\r
 \r
                 }\r
                 stream_Preamble.reset();\r
-                // SilkSchema.g:185:58: ( schemaElement )*\r
+                // SilkSchema.g:186:58: ( schemaElement )*\r
                 while ( stream_schemaElement.hasNext() ) {\r
                     adaptor.addChild(root_1, stream_schemaElement.nextTree());\r
 \r
@@ -257,7 +258,7 @@ public class SilkSchemaParser extends Parser {
     };\r
 \r
     // $ANTLR start "schemaElement"\r
-    // SilkSchema.g:188:1: schemaElement : ( classDefinition | moduleDefinition );\r
+    // SilkSchema.g:189: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
@@ -271,7 +272,7 @@ public class SilkSchemaParser extends Parser {
 \r
 \r
         try {\r
-            // SilkSchema.g:189:3: ( classDefinition | moduleDefinition )\r
+            // SilkSchema.g:190:3: ( classDefinition | moduleDefinition )\r
             int alt3=2;\r
             int LA3_0 = input.LA(1);\r
 \r
@@ -289,11 +290,11 @@ public class SilkSchemaParser extends Parser {
             }\r
             switch (alt3) {\r
                 case 1 :\r
-                    // SilkSchema.g:189:5: classDefinition\r
+                    // SilkSchema.g:190:5: classDefinition\r
                     {\r
                     root_0 = (Object)adaptor.nil();\r
 \r
-                    pushFollow(FOLLOW_classDefinition_in_schemaElement866);\r
+                    pushFollow(FOLLOW_classDefinition_in_schemaElement872);\r
                     classDefinition3=classDefinition();\r
 \r
                     state._fsp--;\r
@@ -303,11 +304,11 @@ public class SilkSchemaParser extends Parser {
                     }\r
                     break;\r
                 case 2 :\r
-                    // SilkSchema.g:190:5: moduleDefinition\r
+                    // SilkSchema.g:191:5: moduleDefinition\r
                     {\r
                     root_0 = (Object)adaptor.nil();\r
 \r
-                    pushFollow(FOLLOW_moduleDefinition_in_schemaElement873);\r
+                    pushFollow(FOLLOW_moduleDefinition_in_schemaElement879);\r
                     moduleDefinition4=moduleDefinition();\r
 \r
                     state._fsp--;\r
@@ -342,7 +343,7 @@ public class SilkSchemaParser extends Parser {
     };\r
 \r
     // $ANTLR start "moduleDefinition"\r
-    // SilkSchema.g:194:1: moduleDefinition : ModuleDef ( classDefinition )* End -> ^( Module Name[$ModuleDef.text] ( classDefinition )* ) ;\r
+    // SilkSchema.g:195: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
@@ -360,13 +361,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:194:17: ( ModuleDef ( classDefinition )* End -> ^( Module Name[$ModuleDef.text] ( classDefinition )* ) )\r
-            // SilkSchema.g:195:2: ModuleDef ( classDefinition )* End\r
+            // SilkSchema.g:195:17: ( ModuleDef ( classDefinition )* End -> ^( Module Name[$ModuleDef.text] ( classDefinition )* ) )\r
+            // SilkSchema.g:196:2: ModuleDef ( classDefinition )* End\r
             {\r
-            ModuleDef5=(Token)match(input,ModuleDef,FOLLOW_ModuleDef_in_moduleDefinition885);  \r
+            ModuleDef5=(Token)match(input,ModuleDef,FOLLOW_ModuleDef_in_moduleDefinition891);  \r
             stream_ModuleDef.add(ModuleDef5);\r
 \r
-            // SilkSchema.g:195:12: ( classDefinition )*\r
+            // SilkSchema.g:196:12: ( classDefinition )*\r
             loop4:\r
             do {\r
                 int alt4=2;\r
@@ -379,9 +380,9 @@ public class SilkSchemaParser extends Parser {
 \r
                 switch (alt4) {\r
                case 1 :\r
-                   // SilkSchema.g:195:12: classDefinition\r
+                   // SilkSchema.g:196:12: classDefinition\r
                    {\r
-                   pushFollow(FOLLOW_classDefinition_in_moduleDefinition887);\r
+                   pushFollow(FOLLOW_classDefinition_in_moduleDefinition893);\r
                    classDefinition6=classDefinition();\r
 \r
                    state._fsp--;\r
@@ -396,7 +397,7 @@ public class SilkSchemaParser extends Parser {
                 }\r
             } while (true);\r
 \r
-            End7=(Token)match(input,End,FOLLOW_End_in_moduleDefinition890);  \r
+            End7=(Token)match(input,End,FOLLOW_End_in_moduleDefinition896);  \r
             stream_End.add(End7);\r
 \r
 \r
@@ -412,15 +413,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
-            // 196:2: -> ^( Module Name[$ModuleDef.text] ( classDefinition )* )\r
+            // 197:2: -> ^( Module Name[$ModuleDef.text] ( classDefinition )* )\r
             {\r
-                // SilkSchema.g:196:5: ^( Module Name[$ModuleDef.text] ( classDefinition )* )\r
+                // SilkSchema.g:197: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:196:36: ( classDefinition )*\r
+                // SilkSchema.g:197:36: ( classDefinition )*\r
                 while ( stream_classDefinition.hasNext() ) {\r
                     adaptor.addChild(root_1, stream_classDefinition.nextTree());\r
 \r
@@ -459,7 +460,7 @@ public class SilkSchemaParser extends Parser {
     };\r
 \r
     // $ANTLR start "classDefinition"\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
+    // SilkSchema.g:200: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
@@ -489,7 +490,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:200:3: ( Class QName classBody End -> ^( ClassDef Name[$QName.text] classBody ) | Relation QName classBody End -> ^( Relation Name[$QName.text] classBody ) )\r
+            // SilkSchema.g:201: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
@@ -507,21 +508,21 @@ public class SilkSchemaParser extends Parser {
             }\r
             switch (alt5) {\r
                 case 1 :\r
-                    // SilkSchema.g:200:5: Class QName classBody End\r
+                    // SilkSchema.g:201:5: Class QName classBody End\r
                     {\r
-                    Class8=(Token)match(input,Class,FOLLOW_Class_in_classDefinition920);  \r
+                    Class8=(Token)match(input,Class,FOLLOW_Class_in_classDefinition926);  \r
                     stream_Class.add(Class8);\r
 \r
-                    QName9=(Token)match(input,QName,FOLLOW_QName_in_classDefinition922);  \r
+                    QName9=(Token)match(input,QName,FOLLOW_QName_in_classDefinition928);  \r
                     stream_QName.add(QName9);\r
 \r
-                    pushFollow(FOLLOW_classBody_in_classDefinition924);\r
+                    pushFollow(FOLLOW_classBody_in_classDefinition930);\r
                     classBody10=classBody();\r
 \r
                     state._fsp--;\r
 \r
                     stream_classBody.add(classBody10.getTree());\r
-                    End11=(Token)match(input,End,FOLLOW_End_in_classDefinition926);  \r
+                    End11=(Token)match(input,End,FOLLOW_End_in_classDefinition932);  \r
                     stream_End.add(End11);\r
 \r
 \r
@@ -537,9 +538,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:31: -> ^( ClassDef Name[$QName.text] classBody )\r
+                    // 201:31: -> ^( ClassDef Name[$QName.text] classBody )\r
                     {\r
-                        // SilkSchema.g:200:34: ^( ClassDef Name[$QName.text] classBody )\r
+                        // SilkSchema.g:201: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
@@ -556,21 +557,21 @@ public class SilkSchemaParser extends Parser {
                     }\r
                     break;\r
                 case 2 :\r
-                    // SilkSchema.g:201:5: Relation QName classBody End\r
+                    // SilkSchema.g:202:5: Relation QName classBody End\r
                     {\r
-                    Relation12=(Token)match(input,Relation,FOLLOW_Relation_in_classDefinition943);  \r
+                    Relation12=(Token)match(input,Relation,FOLLOW_Relation_in_classDefinition949);  \r
                     stream_Relation.add(Relation12);\r
 \r
-                    QName13=(Token)match(input,QName,FOLLOW_QName_in_classDefinition945);  \r
+                    QName13=(Token)match(input,QName,FOLLOW_QName_in_classDefinition951);  \r
                     stream_QName.add(QName13);\r
 \r
-                    pushFollow(FOLLOW_classBody_in_classDefinition947);\r
+                    pushFollow(FOLLOW_classBody_in_classDefinition953);\r
                     classBody14=classBody();\r
 \r
                     state._fsp--;\r
 \r
                     stream_classBody.add(classBody14.getTree());\r
-                    End15=(Token)match(input,End,FOLLOW_End_in_classDefinition949);  \r
+                    End15=(Token)match(input,End,FOLLOW_End_in_classDefinition955);  \r
                     stream_End.add(End15);\r
 \r
 \r
@@ -586,9 +587,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
-                    // 201:34: -> ^( Relation Name[$QName.text] classBody )\r
+                    // 202:34: -> ^( Relation Name[$QName.text] classBody )\r
                     {\r
-                        // SilkSchema.g:201:37: ^( Relation Name[$QName.text] classBody )\r
+                        // SilkSchema.g:202: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
@@ -630,7 +631,7 @@ public class SilkSchemaParser extends Parser {
     };\r
 \r
     // $ANTLR start "classBody"\r
-    // SilkSchema.g:204:1: classBody : ( inheritance )? ( includeStatement | attributes | indexStatement )* ;\r
+    // SilkSchema.g:205:1: classBody : ( inheritance )? ( belongsToStatement | includeStatement | attributes | indexStatement )* ;\r
     public final SilkSchemaParser.classBody_return classBody() throws RecognitionException {\r
         SilkSchemaParser.classBody_return retval = new SilkSchemaParser.classBody_return();\r
         retval.start = input.LT(1);\r
@@ -639,21 +640,23 @@ public class SilkSchemaParser extends Parser {
 \r
         SilkSchemaParser.inheritance_return inheritance16 = null;\r
 \r
-        SilkSchemaParser.includeStatement_return includeStatement17 = null;\r
+        SilkSchemaParser.belongsToStatement_return belongsToStatement17 = null;\r
 \r
-        SilkSchemaParser.attributes_return attributes18 = null;\r
+        SilkSchemaParser.includeStatement_return includeStatement18 = null;\r
 \r
-        SilkSchemaParser.indexStatement_return indexStatement19 = null;\r
+        SilkSchemaParser.attributes_return attributes19 = null;\r
+\r
+        SilkSchemaParser.indexStatement_return indexStatement20 = null;\r
 \r
 \r
 \r
         try {\r
-            // SilkSchema.g:204:10: ( ( inheritance )? ( includeStatement | attributes | indexStatement )* )\r
-            // SilkSchema.g:204:12: ( inheritance )? ( includeStatement | attributes | indexStatement )*\r
+            // SilkSchema.g:205:10: ( ( inheritance )? ( belongsToStatement | includeStatement | attributes | indexStatement )* )\r
+            // SilkSchema.g:205:12: ( inheritance )? ( belongsToStatement | includeStatement | attributes | indexStatement )*\r
             {\r
             root_0 = (Object)adaptor.nil();\r
 \r
-            // SilkSchema.g:204:12: ( inheritance )?\r
+            // SilkSchema.g:205:12: ( inheritance )?\r
             int alt6=2;\r
             int LA6_0 = input.LA(1);\r
 \r
@@ -662,9 +665,9 @@ public class SilkSchemaParser extends Parser {
             }\r
             switch (alt6) {\r
                 case 1 :\r
-                    // SilkSchema.g:204:12: inheritance\r
+                    // SilkSchema.g:205:12: inheritance\r
                     {\r
-                    pushFollow(FOLLOW_inheritance_in_classBody973);\r
+                    pushFollow(FOLLOW_inheritance_in_classBody979);\r
                     inheritance16=inheritance();\r
 \r
                     state._fsp--;\r
@@ -676,25 +679,30 @@ public class SilkSchemaParser extends Parser {
 \r
             }\r
 \r
-            // SilkSchema.g:204:25: ( includeStatement | attributes | indexStatement )*\r
+            // SilkSchema.g:205:25: ( belongsToStatement | includeStatement | attributes | indexStatement )*\r
             loop7:\r
             do {\r
-                int alt7=4;\r
+                int alt7=5;\r
                 switch ( input.LA(1) ) {\r
-                case Includes:\r
+                case BelongsTo:\r
                     {\r
                     alt7=1;\r
                     }\r
                     break;\r
+                case Includes:\r
+                    {\r
+                    alt7=2;\r
+                    }\r
+                    break;\r
                 case Symbol:\r
                 case QName:\r
                     {\r
-                    alt7=2;\r
+                    alt7=3;\r
                     }\r
                     break;\r
                 case Index:\r
                     {\r
-                    alt7=3;\r
+                    alt7=4;\r
                     }\r
                     break;\r
 \r
@@ -702,38 +710,50 @@ public class SilkSchemaParser extends Parser {
 \r
                 switch (alt7) {\r
                case 1 :\r
-                   // SilkSchema.g:204:26: includeStatement\r
+                   // SilkSchema.g:205:26: belongsToStatement\r
                    {\r
-                   pushFollow(FOLLOW_includeStatement_in_classBody977);\r
-                   includeStatement17=includeStatement();\r
+                   pushFollow(FOLLOW_belongsToStatement_in_classBody983);\r
+                   belongsToStatement17=belongsToStatement();\r
 \r
                    state._fsp--;\r
 \r
-                   adaptor.addChild(root_0, includeStatement17.getTree());\r
+                   adaptor.addChild(root_0, belongsToStatement17.getTree());\r
 \r
                    }\r
                    break;\r
                case 2 :\r
-                   // SilkSchema.g:204:45: attributes\r
+                   // SilkSchema.g:205:47: includeStatement\r
                    {\r
-                   pushFollow(FOLLOW_attributes_in_classBody981);\r
-                   attributes18=attributes();\r
+                   pushFollow(FOLLOW_includeStatement_in_classBody987);\r
+                   includeStatement18=includeStatement();\r
 \r
                    state._fsp--;\r
 \r
-                   adaptor.addChild(root_0, attributes18.getTree());\r
+                   adaptor.addChild(root_0, includeStatement18.getTree());\r
 \r
                    }\r
                    break;\r
                case 3 :\r
-                   // SilkSchema.g:204:58: indexStatement\r
+                   // SilkSchema.g:205:66: attributes\r
+                   {\r
+                   pushFollow(FOLLOW_attributes_in_classBody991);\r
+                   attributes19=attributes();\r
+\r
+                   state._fsp--;\r
+\r
+                   adaptor.addChild(root_0, attributes19.getTree());\r
+\r
+                   }\r
+                   break;\r
+               case 4 :\r
+                   // SilkSchema.g:205:79: indexStatement\r
                    {\r
-                   pushFollow(FOLLOW_indexStatement_in_classBody985);\r
-                   indexStatement19=indexStatement();\r
+                   pushFollow(FOLLOW_indexStatement_in_classBody995);\r
+                   indexStatement20=indexStatement();\r
 \r
                    state._fsp--;\r
 \r
-                   adaptor.addChild(root_0, indexStatement19.getTree());\r
+                   adaptor.addChild(root_0, indexStatement20.getTree());\r
 \r
                    }\r
                    break;\r
@@ -764,36 +784,107 @@ public class SilkSchemaParser extends Parser {
     }\r
     // $ANTLR end "classBody"\r
 \r
+    public static class belongsToStatement_return extends ParserRuleReturnScope {\r
+        Object tree;\r
+        public Object getTree() { return tree; }\r
+    };\r
+\r
+    // $ANTLR start "belongsToStatement"\r
+    // SilkSchema.g:207:10: fragment belongsToStatement : BelongsTo QName -> BelongsTo[$QName.text] ;\r
+    public final SilkSchemaParser.belongsToStatement_return belongsToStatement() throws RecognitionException {\r
+        SilkSchemaParser.belongsToStatement_return retval = new SilkSchemaParser.belongsToStatement_return();\r
+        retval.start = input.LT(1);\r
+\r
+        Object root_0 = null;\r
+\r
+        Token BelongsTo21=null;\r
+        Token QName22=null;\r
+\r
+        Object BelongsTo21_tree=null;\r
+        Object QName22_tree=null;\r
+        RewriteRuleTokenStream stream_BelongsTo=new RewriteRuleTokenStream(adaptor,"token BelongsTo");\r
+        RewriteRuleTokenStream stream_QName=new RewriteRuleTokenStream(adaptor,"token QName");\r
+\r
+        try {\r
+            // SilkSchema.g:207:28: ( BelongsTo QName -> BelongsTo[$QName.text] )\r
+            // SilkSchema.g:207:30: BelongsTo QName\r
+            {\r
+            BelongsTo21=(Token)match(input,BelongsTo,FOLLOW_BelongsTo_in_belongsToStatement1006);  \r
+            stream_BelongsTo.add(BelongsTo21);\r
+\r
+            QName22=(Token)match(input,QName,FOLLOW_QName_in_belongsToStatement1008);  \r
+            stream_QName.add(QName22);\r
+\r
+\r
+\r
+            // AST REWRITE\r
+            // elements: BelongsTo\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
+            // 207:46: -> BelongsTo[$QName.text]\r
+            {\r
+                adaptor.addChild(root_0, (Object)adaptor.create(BelongsTo, (QName22!=null?QName22.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 "belongsToStatement"\r
+\r
     public static class inheritance_return extends ParserRuleReturnScope {\r
         Object tree;\r
         public Object getTree() { return tree; }\r
     };\r
 \r
     // $ANTLR start "inheritance"\r
-    // SilkSchema.g:206:10: fragment inheritance : Lt QName -> Parent[$QName.text] ;\r
+    // SilkSchema.g:209: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 Lt20=null;\r
-        Token QName21=null;\r
+        Token Lt23=null;\r
+        Token QName24=null;\r
 \r
-        Object Lt20_tree=null;\r
-        Object QName21_tree=null;\r
+        Object Lt23_tree=null;\r
+        Object QName24_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:206:21: ( Lt QName -> Parent[$QName.text] )\r
-            // SilkSchema.g:206:23: Lt QName\r
+            // SilkSchema.g:209:21: ( Lt QName -> Parent[$QName.text] )\r
+            // SilkSchema.g:209:23: Lt QName\r
             {\r
-            Lt20=(Token)match(input,Lt,FOLLOW_Lt_in_inheritance998);  \r
-            stream_Lt.add(Lt20);\r
+            Lt23=(Token)match(input,Lt,FOLLOW_Lt_in_inheritance1025);  \r
+            stream_Lt.add(Lt23);\r
 \r
-            QName21=(Token)match(input,QName,FOLLOW_QName_in_inheritance1000);  \r
-            stream_QName.add(QName21);\r
+            QName24=(Token)match(input,QName,FOLLOW_QName_in_inheritance1027);  \r
+            stream_QName.add(QName24);\r
 \r
 \r
 \r
@@ -808,9 +899,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
-            // 206:32: -> Parent[$QName.text]\r
+            // 209:32: -> Parent[$QName.text]\r
             {\r
-                adaptor.addChild(root_0, (Object)adaptor.create(Parent, (QName21!=null?QName21.getText():null)));\r
+                adaptor.addChild(root_0, (Object)adaptor.create(Parent, (QName24!=null?QName24.getText():null)));\r
 \r
             }\r
 \r
@@ -841,39 +932,39 @@ public class SilkSchemaParser extends Parser {
     };\r
 \r
     // $ANTLR start "includeStatement"\r
-    // SilkSchema.g:208:10: fragment includeStatement : Includes includeItem ( Comma includeItem )* -> ( includeItem )+ ;\r
+    // SilkSchema.g:211: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 Includes22=null;\r
-        Token Comma24=null;\r
-        SilkSchemaParser.includeItem_return includeItem23 = null;\r
+        Token Includes25=null;\r
+        Token Comma27=null;\r
+        SilkSchemaParser.includeItem_return includeItem26 = null;\r
 \r
-        SilkSchemaParser.includeItem_return includeItem25 = null;\r
+        SilkSchemaParser.includeItem_return includeItem28 = null;\r
 \r
 \r
-        Object Includes22_tree=null;\r
-        Object Comma24_tree=null;\r
+        Object Includes25_tree=null;\r
+        Object Comma27_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:208:26: ( Includes includeItem ( Comma includeItem )* -> ( includeItem )+ )\r
-            // SilkSchema.g:208:28: Includes includeItem ( Comma includeItem )*\r
+            // SilkSchema.g:211:26: ( Includes includeItem ( Comma includeItem )* -> ( includeItem )+ )\r
+            // SilkSchema.g:211:28: Includes includeItem ( Comma includeItem )*\r
             {\r
-            Includes22=(Token)match(input,Includes,FOLLOW_Includes_in_includeStatement1016);  \r
-            stream_Includes.add(Includes22);\r
+            Includes25=(Token)match(input,Includes,FOLLOW_Includes_in_includeStatement1043);  \r
+            stream_Includes.add(Includes25);\r
 \r
-            pushFollow(FOLLOW_includeItem_in_includeStatement1018);\r
-            includeItem23=includeItem();\r
+            pushFollow(FOLLOW_includeItem_in_includeStatement1045);\r
+            includeItem26=includeItem();\r
 \r
             state._fsp--;\r
 \r
-            stream_includeItem.add(includeItem23.getTree());\r
-            // SilkSchema.g:208:49: ( Comma includeItem )*\r
+            stream_includeItem.add(includeItem26.getTree());\r
+            // SilkSchema.g:211:49: ( Comma includeItem )*\r
             loop8:\r
             do {\r
                 int alt8=2;\r
@@ -886,17 +977,17 @@ public class SilkSchemaParser extends Parser {
 \r
                 switch (alt8) {\r
                case 1 :\r
-                   // SilkSchema.g:208:50: Comma includeItem\r
+                   // SilkSchema.g:211:50: Comma includeItem\r
                    {\r
-                   Comma24=(Token)match(input,Comma,FOLLOW_Comma_in_includeStatement1021);  \r
-                   stream_Comma.add(Comma24);\r
+                   Comma27=(Token)match(input,Comma,FOLLOW_Comma_in_includeStatement1048);  \r
+                   stream_Comma.add(Comma27);\r
 \r
-                   pushFollow(FOLLOW_includeItem_in_includeStatement1023);\r
-                   includeItem25=includeItem();\r
+                   pushFollow(FOLLOW_includeItem_in_includeStatement1050);\r
+                   includeItem28=includeItem();\r
 \r
                    state._fsp--;\r
 \r
-                   stream_includeItem.add(includeItem25.getTree());\r
+                   stream_includeItem.add(includeItem28.getTree());\r
 \r
                    }\r
                    break;\r
@@ -919,7 +1010,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
-            // 208:70: -> ( includeItem )+\r
+            // 211:70: -> ( includeItem )+\r
             {\r
                 if ( !(stream_includeItem.hasNext()) ) {\r
                     throw new RewriteEarlyExitException();\r
@@ -959,24 +1050,24 @@ public class SilkSchemaParser extends Parser {
     };\r
 \r
     // $ANTLR start "includeItem"\r
-    // SilkSchema.g:210:10: fragment includeItem : QName -> Mixin[$QName.text] ;\r
+    // SilkSchema.g:213: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 QName26=null;\r
+        Token QName29=null;\r
 \r
-        Object QName26_tree=null;\r
+        Object QName29_tree=null;\r
         RewriteRuleTokenStream stream_QName=new RewriteRuleTokenStream(adaptor,"token QName");\r
 \r
         try {\r
-            // SilkSchema.g:210:21: ( QName -> Mixin[$QName.text] )\r
-            // SilkSchema.g:210:23: QName\r
+            // SilkSchema.g:213:21: ( QName -> Mixin[$QName.text] )\r
+            // SilkSchema.g:213:23: QName\r
             {\r
-            QName26=(Token)match(input,QName,FOLLOW_QName_in_includeItem1039);  \r
-            stream_QName.add(QName26);\r
+            QName29=(Token)match(input,QName,FOLLOW_QName_in_includeItem1066);  \r
+            stream_QName.add(QName29);\r
 \r
 \r
 \r
@@ -991,9 +1082,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
-            // 210:29: -> Mixin[$QName.text]\r
+            // 213:29: -> Mixin[$QName.text]\r
             {\r
-                adaptor.addChild(root_0, (Object)adaptor.create(Mixin, (QName26!=null?QName26.getText():null)));\r
+                adaptor.addChild(root_0, (Object)adaptor.create(Mixin, (QName29!=null?QName29.getText():null)));\r
 \r
             }\r
 \r
@@ -1024,45 +1115,45 @@ public class SilkSchemaParser extends Parser {
     };\r
 \r
     // $ANTLR start "indexStatement"\r
-    // SilkSchema.g:212:10: fragment indexStatement : Index QName indexTarget ( Comma indexTarget )* -> ^( Index TypeName[$QName.text] ( indexTarget )+ ) ;\r
+    // SilkSchema.g:215: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 Index27=null;\r
-        Token QName28=null;\r
-        Token Comma30=null;\r
-        SilkSchemaParser.indexTarget_return indexTarget29 = null;\r
+        Token Index30=null;\r
+        Token QName31=null;\r
+        Token Comma33=null;\r
+        SilkSchemaParser.indexTarget_return indexTarget32 = null;\r
 \r
-        SilkSchemaParser.indexTarget_return indexTarget31 = null;\r
+        SilkSchemaParser.indexTarget_return indexTarget34 = null;\r
 \r
 \r
-        Object Index27_tree=null;\r
-        Object QName28_tree=null;\r
-        Object Comma30_tree=null;\r
+        Object Index30_tree=null;\r
+        Object QName31_tree=null;\r
+        Object Comma33_tree=null;\r
         RewriteRuleTokenStream stream_Index=new RewriteRuleTokenStream(adaptor,"token Index");\r
         RewriteRuleTokenStream stream_Comma=new RewriteRuleTokenStream(adaptor,"token Comma");\r
         RewriteRuleTokenStream stream_QName=new RewriteRuleTokenStream(adaptor,"token QName");\r
         RewriteRuleSubtreeStream stream_indexTarget=new RewriteRuleSubtreeStream(adaptor,"rule indexTarget");\r
         try {\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
+            // SilkSchema.g:215:24: ( Index QName indexTarget ( Comma indexTarget )* -> ^( Index TypeName[$QName.text] ( indexTarget )+ ) )\r
+            // SilkSchema.g:215:26: Index QName indexTarget ( Comma indexTarget )*\r
             {\r
-            Index27=(Token)match(input,Index,FOLLOW_Index_in_indexStatement1053);  \r
-            stream_Index.add(Index27);\r
+            Index30=(Token)match(input,Index,FOLLOW_Index_in_indexStatement1080);  \r
+            stream_Index.add(Index30);\r
 \r
-            QName28=(Token)match(input,QName,FOLLOW_QName_in_indexStatement1055);  \r
-            stream_QName.add(QName28);\r
+            QName31=(Token)match(input,QName,FOLLOW_QName_in_indexStatement1082);  \r
+            stream_QName.add(QName31);\r
 \r
-            pushFollow(FOLLOW_indexTarget_in_indexStatement1057);\r
-            indexTarget29=indexTarget();\r
+            pushFollow(FOLLOW_indexTarget_in_indexStatement1084);\r
+            indexTarget32=indexTarget();\r
 \r
             state._fsp--;\r
 \r
-            stream_indexTarget.add(indexTarget29.getTree());\r
-            // SilkSchema.g:212:50: ( Comma indexTarget )*\r
+            stream_indexTarget.add(indexTarget32.getTree());\r
+            // SilkSchema.g:215:50: ( Comma indexTarget )*\r
             loop9:\r
             do {\r
                 int alt9=2;\r
@@ -1075,17 +1166,17 @@ public class SilkSchemaParser extends Parser {
 \r
                 switch (alt9) {\r
                case 1 :\r
-                   // SilkSchema.g:212:51: Comma indexTarget\r
+                   // SilkSchema.g:215:51: Comma indexTarget\r
                    {\r
-                   Comma30=(Token)match(input,Comma,FOLLOW_Comma_in_indexStatement1060);  \r
-                   stream_Comma.add(Comma30);\r
+                   Comma33=(Token)match(input,Comma,FOLLOW_Comma_in_indexStatement1087);  \r
+                   stream_Comma.add(Comma33);\r
 \r
-                   pushFollow(FOLLOW_indexTarget_in_indexStatement1062);\r
-                   indexTarget31=indexTarget();\r
+                   pushFollow(FOLLOW_indexTarget_in_indexStatement1089);\r
+                   indexTarget34=indexTarget();\r
 \r
                    state._fsp--;\r
 \r
-                   stream_indexTarget.add(indexTarget31.getTree());\r
+                   stream_indexTarget.add(indexTarget34.getTree());\r
 \r
                    }\r
                    break;\r
@@ -1098,7 +1189,7 @@ public class SilkSchemaParser extends Parser {
 \r
 \r
             // AST REWRITE\r
-            // elements: Index, indexTarget\r
+            // elements: indexTarget, Index\r
             // token labels: \r
             // rule labels: retval\r
             // token list labels: \r
@@ -1108,14 +1199,14 @@ 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: -> ^( Index TypeName[$QName.text] ( indexTarget )+ )\r
+            // 216:3: -> ^( Index TypeName[$QName.text] ( indexTarget )+ )\r
             {\r
-                // SilkSchema.g:213:6: ^( Index TypeName[$QName.text] ( indexTarget )+ )\r
+                // SilkSchema.g:216: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
+                adaptor.addChild(root_1, (Object)adaptor.create(TypeName, (QName31!=null?QName31.getText():null)));\r
                 if ( !(stream_indexTarget.hasNext()) ) {\r
                     throw new RewriteEarlyExitException();\r
                 }\r
@@ -1157,24 +1248,24 @@ public class SilkSchemaParser extends Parser {
     };\r
 \r
     // $ANTLR start "indexTarget"\r
-    // SilkSchema.g:216:10: fragment indexTarget : Symbol -> Attribute[$Symbol.text] ;\r
+    // SilkSchema.g:219: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
+        Token Symbol35=null;\r
 \r
-        Object Symbol32_tree=null;\r
+        Object Symbol35_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
+            // SilkSchema.g:219:21: ( Symbol -> Attribute[$Symbol.text] )\r
+            // SilkSchema.g:219:23: Symbol\r
             {\r
-            Symbol32=(Token)match(input,Symbol,FOLLOW_Symbol_in_indexTarget1089);  \r
-            stream_Symbol.add(Symbol32);\r
+            Symbol35=(Token)match(input,Symbol,FOLLOW_Symbol_in_indexTarget1116);  \r
+            stream_Symbol.add(Symbol35);\r
 \r
 \r
 \r
@@ -1189,9 +1280,9 @@ public class SilkSchemaParser extends Parser {
             RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"rule retval",retval!=null?retval.tree:null);\r
 \r
             root_0 = (Object)adaptor.nil();\r
-            // 216:30: -> Attribute[$Symbol.text]\r
+            // 219:30: -> Attribute[$Symbol.text]\r
             {\r
-                adaptor.addChild(root_0, (Object)adaptor.create(Attribute, (Symbol32!=null?Symbol32.getText():null)));\r
+                adaptor.addChild(root_0, (Object)adaptor.create(Attribute, (Symbol35!=null?Symbol35.getText():null)));\r
 \r
             }\r
 \r
@@ -1222,33 +1313,33 @@ public class SilkSchemaParser extends Parser {
     };\r
 \r
     // $ANTLR start "attributes"\r
-    // SilkSchema.g:220:10: fragment attributes : attribute ( Comma attribute )* -> ( attribute )+ ;\r
+    // SilkSchema.g:223: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
+        Token Comma37=null;\r
+        SilkSchemaParser.attribute_return attribute36 = null;\r
 \r
-        SilkSchemaParser.attribute_return attribute35 = null;\r
+        SilkSchemaParser.attribute_return attribute38 = null;\r
 \r
 \r
-        Object Comma34_tree=null;\r
+        Object Comma37_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
+            // SilkSchema.g:223:20: ( attribute ( Comma attribute )* -> ( attribute )+ )\r
+            // SilkSchema.g:223:22: attribute ( Comma attribute )*\r
             {\r
-            pushFollow(FOLLOW_attribute_in_attributes1108);\r
-            attribute33=attribute();\r
+            pushFollow(FOLLOW_attribute_in_attributes1135);\r
+            attribute36=attribute();\r
 \r
             state._fsp--;\r
 \r
-            stream_attribute.add(attribute33.getTree());\r
-            // SilkSchema.g:220:32: ( Comma attribute )*\r
+            stream_attribute.add(attribute36.getTree());\r
+            // SilkSchema.g:223:32: ( Comma attribute )*\r
             loop10:\r
             do {\r
                 int alt10=2;\r
@@ -1261,17 +1352,17 @@ public class SilkSchemaParser extends Parser {
 \r
                 switch (alt10) {\r
                case 1 :\r
-                   // SilkSchema.g:220:33: Comma attribute\r
+                   // SilkSchema.g:223:33: Comma attribute\r
                    {\r
-                   Comma34=(Token)match(input,Comma,FOLLOW_Comma_in_attributes1111);  \r
-                   stream_Comma.add(Comma34);\r
+                   Comma37=(Token)match(input,Comma,FOLLOW_Comma_in_attributes1138);  \r
+                   stream_Comma.add(Comma37);\r
 \r
-                   pushFollow(FOLLOW_attribute_in_attributes1113);\r
-                   attribute35=attribute();\r
+                   pushFollow(FOLLOW_attribute_in_attributes1140);\r
+                   attribute38=attribute();\r
 \r
                    state._fsp--;\r
 \r
-                   stream_attribute.add(attribute35.getTree());\r
+                   stream_attribute.add(attribute38.getTree());\r
 \r
                    }\r
                    break;\r
@@ -1294,7 +1385,7 @@ public class SilkSchemaParser extends Parser {
             RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"rule retval",retval!=null?retval.tree:null);\r
 \r
             root_0 = (Object)adaptor.nil();\r
-            // 221:3: -> ( attribute )+\r
+            // 224:3: -> ( attribute )+\r
             {\r
                 if ( !(stream_attribute.hasNext()) ) {\r
                     throw new RewriteEarlyExitException();\r
@@ -1334,31 +1425,31 @@ public class SilkSchemaParser extends Parser {
     };\r
 \r
     // $ANTLR start "attribute"\r
-    // SilkSchema.g:224:10: fragment attribute : ( attributeType )? Symbol ( Eq attributeValue )? -> ^( Attribute Name[$Symbol.text] ( attributeType )? ( attributeValue )? ) ;\r
+    // SilkSchema.g:227: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 Symbol37=null;\r
-        Token Eq38=null;\r
-        SilkSchemaParser.attributeType_return attributeType36 = null;\r
+        Token Symbol40=null;\r
+        Token Eq41=null;\r
+        SilkSchemaParser.attributeType_return attributeType39 = null;\r
 \r
-        SilkSchemaParser.attributeValue_return attributeValue39 = null;\r
+        SilkSchemaParser.attributeValue_return attributeValue42 = null;\r
 \r
 \r
-        Object Symbol37_tree=null;\r
-        Object Eq38_tree=null;\r
+        Object Symbol40_tree=null;\r
+        Object Eq41_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:224:19: ( ( attributeType )? Symbol ( Eq attributeValue )? -> ^( Attribute Name[$Symbol.text] ( attributeType )? ( attributeValue )? ) )\r
-            // SilkSchema.g:225:3: ( attributeType )? Symbol ( Eq attributeValue )?\r
+            // SilkSchema.g:227:19: ( ( attributeType )? Symbol ( Eq attributeValue )? -> ^( Attribute Name[$Symbol.text] ( attributeType )? ( attributeValue )? ) )\r
+            // SilkSchema.g:228:3: ( attributeType )? Symbol ( Eq attributeValue )?\r
             {\r
-            // SilkSchema.g:225:3: ( attributeType )?\r
+            // SilkSchema.g:228:3: ( attributeType )?\r
             int alt11=2;\r
             int LA11_0 = input.LA(1);\r
 \r
@@ -1367,24 +1458,24 @@ public class SilkSchemaParser extends Parser {
             }\r
             switch (alt11) {\r
                 case 1 :\r
-                    // SilkSchema.g:225:3: attributeType\r
+                    // SilkSchema.g:228:3: attributeType\r
                     {\r
-                    pushFollow(FOLLOW_attributeType_in_attribute1139);\r
-                    attributeType36=attributeType();\r
+                    pushFollow(FOLLOW_attributeType_in_attribute1166);\r
+                    attributeType39=attributeType();\r
 \r
                     state._fsp--;\r
 \r
-                    stream_attributeType.add(attributeType36.getTree());\r
+                    stream_attributeType.add(attributeType39.getTree());\r
 \r
                     }\r
                     break;\r
 \r
             }\r
 \r
-            Symbol37=(Token)match(input,Symbol,FOLLOW_Symbol_in_attribute1142);  \r
-            stream_Symbol.add(Symbol37);\r
+            Symbol40=(Token)match(input,Symbol,FOLLOW_Symbol_in_attribute1169);  \r
+            stream_Symbol.add(Symbol40);\r
 \r
-            // SilkSchema.g:225:25: ( Eq attributeValue )?\r
+            // SilkSchema.g:228:25: ( Eq attributeValue )?\r
             int alt12=2;\r
             int LA12_0 = input.LA(1);\r
 \r
@@ -1393,17 +1484,17 @@ public class SilkSchemaParser extends Parser {
             }\r
             switch (alt12) {\r
                 case 1 :\r
-                    // SilkSchema.g:225:26: Eq attributeValue\r
+                    // SilkSchema.g:228:26: Eq attributeValue\r
                     {\r
-                    Eq38=(Token)match(input,Eq,FOLLOW_Eq_in_attribute1145);  \r
-                    stream_Eq.add(Eq38);\r
+                    Eq41=(Token)match(input,Eq,FOLLOW_Eq_in_attribute1172);  \r
+                    stream_Eq.add(Eq41);\r
 \r
-                    pushFollow(FOLLOW_attributeValue_in_attribute1147);\r
-                    attributeValue39=attributeValue();\r
+                    pushFollow(FOLLOW_attributeValue_in_attribute1174);\r
+                    attributeValue42=attributeValue();\r
 \r
                     state._fsp--;\r
 \r
-                    stream_attributeValue.add(attributeValue39.getTree());\r
+                    stream_attributeValue.add(attributeValue42.getTree());\r
 \r
                     }\r
                     break;\r
@@ -1423,21 +1514,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
-            // 226:3: -> ^( Attribute Name[$Symbol.text] ( attributeType )? ( attributeValue )? )\r
+            // 229:3: -> ^( Attribute Name[$Symbol.text] ( attributeType )? ( attributeValue )? )\r
             {\r
-                // SilkSchema.g:226:6: ^( Attribute Name[$Symbol.text] ( attributeType )? ( attributeValue )? )\r
+                // SilkSchema.g:229: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, (Symbol37!=null?Symbol37.getText():null)));\r
-                // SilkSchema.g:226:37: ( attributeType )?\r
+                adaptor.addChild(root_1, (Object)adaptor.create(Name, (Symbol40!=null?Symbol40.getText():null)));\r
+                // SilkSchema.g:229:37: ( attributeType )?\r
                 if ( stream_attributeType.hasNext() ) {\r
                     adaptor.addChild(root_1, stream_attributeType.nextTree());\r
 \r
                 }\r
                 stream_attributeType.reset();\r
-                // SilkSchema.g:226:52: ( attributeValue )?\r
+                // SilkSchema.g:229:52: ( attributeValue )?\r
                 if ( stream_attributeValue.hasNext() ) {\r
                     adaptor.addChild(root_1, stream_attributeValue.nextTree());\r
 \r
@@ -1476,29 +1567,29 @@ public class SilkSchemaParser extends Parser {
     };\r
 \r
     // $ANTLR start "attributeValue"\r
-    // SilkSchema.g:229:1: attributeValue : ( String | Double | Integer ) -> DefaultValue[$attributeValue.text] ;\r
+    // SilkSchema.g:232: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 String40=null;\r
-        Token Double41=null;\r
-        Token Integer42=null;\r
+        Token String43=null;\r
+        Token Double44=null;\r
+        Token Integer45=null;\r
 \r
-        Object String40_tree=null;\r
-        Object Double41_tree=null;\r
-        Object Integer42_tree=null;\r
+        Object String43_tree=null;\r
+        Object Double44_tree=null;\r
+        Object Integer45_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:230:3: ( ( String | Double | Integer ) -> DefaultValue[$attributeValue.text] )\r
-            // SilkSchema.g:230:5: ( String | Double | Integer )\r
+            // SilkSchema.g:233:3: ( ( String | Double | Integer ) -> DefaultValue[$attributeValue.text] )\r
+            // SilkSchema.g:233:5: ( String | Double | Integer )\r
             {\r
-            // SilkSchema.g:230:5: ( String | Double | Integer )\r
+            // SilkSchema.g:233:5: ( String | Double | Integer )\r
             int alt13=3;\r
             switch ( input.LA(1) ) {\r
             case String:\r
@@ -1525,28 +1616,28 @@ public class SilkSchemaParser extends Parser {
 \r
             switch (alt13) {\r
                 case 1 :\r
-                    // SilkSchema.g:230:6: String\r
+                    // SilkSchema.g:233:6: String\r
                     {\r
-                    String40=(Token)match(input,String,FOLLOW_String_in_attributeValue1185);  \r
-                    stream_String.add(String40);\r
+                    String43=(Token)match(input,String,FOLLOW_String_in_attributeValue1212);  \r
+                    stream_String.add(String43);\r
 \r
 \r
                     }\r
                     break;\r
                 case 2 :\r
-                    // SilkSchema.g:230:15: Double\r
+                    // SilkSchema.g:233:15: Double\r
                     {\r
-                    Double41=(Token)match(input,Double,FOLLOW_Double_in_attributeValue1189);  \r
-                    stream_Double.add(Double41);\r
+                    Double44=(Token)match(input,Double,FOLLOW_Double_in_attributeValue1216);  \r
+                    stream_Double.add(Double44);\r
 \r
 \r
                     }\r
                     break;\r
                 case 3 :\r
-                    // SilkSchema.g:230:24: Integer\r
+                    // SilkSchema.g:233:24: Integer\r
                     {\r
-                    Integer42=(Token)match(input,Integer,FOLLOW_Integer_in_attributeValue1193);  \r
-                    stream_Integer.add(Integer42);\r
+                    Integer45=(Token)match(input,Integer,FOLLOW_Integer_in_attributeValue1220);  \r
+                    stream_Integer.add(Integer45);\r
 \r
 \r
                     }\r
@@ -1567,7 +1658,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
-            // 230:33: -> DefaultValue[$attributeValue.text]\r
+            // 233:33: -> DefaultValue[$attributeValue.text]\r
             {\r
                 adaptor.addChild(root_0, (Object)adaptor.create(DefaultValue, input.toString(retval.start,input.LT(-1))));\r
 \r
@@ -1600,25 +1691,25 @@ public class SilkSchemaParser extends Parser {
     };\r
 \r
     // $ANTLR start "attributeType"\r
-    // SilkSchema.g:232:10: fragment attributeType : ( QName -> TypeName[$QName.text] | QName Star -> TypeName[$QName.text] IsArray[\"true\"] );\r
+    // SilkSchema.g:235: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 QName43=null;\r
-        Token QName44=null;\r
-        Token Star45=null;\r
+        Token QName46=null;\r
+        Token QName47=null;\r
+        Token Star48=null;\r
 \r
-        Object QName43_tree=null;\r
-        Object QName44_tree=null;\r
-        Object Star45_tree=null;\r
+        Object QName46_tree=null;\r
+        Object QName47_tree=null;\r
+        Object Star48_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:233:3: ( QName -> TypeName[$QName.text] | QName Star -> TypeName[$QName.text] IsArray[\"true\"] )\r
+            // SilkSchema.g:236: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
@@ -1646,10 +1737,10 @@ public class SilkSchemaParser extends Parser {
             }\r
             switch (alt14) {\r
                 case 1 :\r
-                    // SilkSchema.g:233:5: QName\r
+                    // SilkSchema.g:236:5: QName\r
                     {\r
-                    QName43=(Token)match(input,QName,FOLLOW_QName_in_attributeType1214);  \r
-                    stream_QName.add(QName43);\r
+                    QName46=(Token)match(input,QName,FOLLOW_QName_in_attributeType1241);  \r
+                    stream_QName.add(QName46);\r
 \r
 \r
 \r
@@ -1664,9 +1755,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
-                    // 233:11: -> TypeName[$QName.text]\r
+                    // 236:11: -> TypeName[$QName.text]\r
                     {\r
-                        adaptor.addChild(root_0, (Object)adaptor.create(TypeName, (QName43!=null?QName43.getText():null)));\r
+                        adaptor.addChild(root_0, (Object)adaptor.create(TypeName, (QName46!=null?QName46.getText():null)));\r
 \r
                     }\r
 \r
@@ -1674,13 +1765,13 @@ public class SilkSchemaParser extends Parser {
                     }\r
                     break;\r
                 case 2 :\r
-                    // SilkSchema.g:234:5: QName Star\r
+                    // SilkSchema.g:237:5: QName Star\r
                     {\r
-                    QName44=(Token)match(input,QName,FOLLOW_QName_in_attributeType1226);  \r
-                    stream_QName.add(QName44);\r
+                    QName47=(Token)match(input,QName,FOLLOW_QName_in_attributeType1253);  \r
+                    stream_QName.add(QName47);\r
 \r
-                    Star45=(Token)match(input,Star,FOLLOW_Star_in_attributeType1228);  \r
-                    stream_Star.add(Star45);\r
+                    Star48=(Token)match(input,Star,FOLLOW_Star_in_attributeType1255);  \r
+                    stream_Star.add(Star48);\r
 \r
 \r
 \r
@@ -1695,9 +1786,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
-                    // 234:16: -> TypeName[$QName.text] IsArray[\"true\"]\r
+                    // 237:16: -> TypeName[$QName.text] IsArray[\"true\"]\r
                     {\r
-                        adaptor.addChild(root_0, (Object)adaptor.create(TypeName, (QName44!=null?QName44.getText():null)));\r
+                        adaptor.addChild(root_0, (Object)adaptor.create(TypeName, (QName47!=null?QName47.getText():null)));\r
                         adaptor.addChild(root_0, (Object)adaptor.create(IsArray, "true"));\r
 \r
                     }\r
@@ -1730,50 +1821,53 @@ public class SilkSchemaParser extends Parser {
 \r
  \r
 \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
+    public static final BitSet FOLLOW_Preamble_in_schema841 = new BitSet(new long[]{0x0081200000000002L});\r
+    public static final BitSet FOLLOW_schemaElement_in_schema844 = new BitSet(new long[]{0x0081200000000002L});\r
+    public static final BitSet FOLLOW_classDefinition_in_schemaElement872 = new BitSet(new long[]{0x0000000000000002L});\r
+    public static final BitSet FOLLOW_moduleDefinition_in_schemaElement879 = new BitSet(new long[]{0x0000000000000002L});\r
+    public static final BitSet FOLLOW_ModuleDef_in_moduleDefinition891 = new BitSet(new long[]{0x0001A00000000000L});\r
+    public static final BitSet FOLLOW_classDefinition_in_moduleDefinition893 = new BitSet(new long[]{0x0001A00000000000L});\r
+    public static final BitSet FOLLOW_End_in_moduleDefinition896 = new BitSet(new long[]{0x0000000000000002L});\r
+    public static final BitSet FOLLOW_Class_in_classDefinition926 = new BitSet(new long[]{0x0400000000000000L});\r
+    public static final BitSet FOLLOW_QName_in_classDefinition928 = new BitSet(new long[]{0x0406D00400000000L});\r
+    public static final BitSet FOLLOW_classBody_in_classDefinition930 = new BitSet(new long[]{0x0000800000000000L});\r
+    public static final BitSet FOLLOW_End_in_classDefinition932 = new BitSet(new long[]{0x0000000000000002L});\r
+    public static final BitSet FOLLOW_Relation_in_classDefinition949 = new BitSet(new long[]{0x0400000000000000L});\r
+    public static final BitSet FOLLOW_QName_in_classDefinition951 = new BitSet(new long[]{0x0406D00400000000L});\r
+    public static final BitSet FOLLOW_classBody_in_classDefinition953 = new BitSet(new long[]{0x0000800000000000L});\r
+    public static final BitSet FOLLOW_End_in_classDefinition955 = new BitSet(new long[]{0x0000000000000002L});\r
+    public static final BitSet FOLLOW_inheritance_in_classBody979 = new BitSet(new long[]{0x0406500000000002L});\r
+    public static final BitSet FOLLOW_belongsToStatement_in_classBody983 = new BitSet(new long[]{0x0406500000000002L});\r
+    public static final BitSet FOLLOW_includeStatement_in_classBody987 = new BitSet(new long[]{0x0406500000000002L});\r
+    public static final BitSet FOLLOW_attributes_in_classBody991 = new BitSet(new long[]{0x0406500000000002L});\r
+    public static final BitSet FOLLOW_indexStatement_in_classBody995 = new BitSet(new long[]{0x0406500000000002L});\r
+    public static final BitSet FOLLOW_BelongsTo_in_belongsToStatement1006 = new BitSet(new long[]{0x0400000000000000L});\r
+    public static final BitSet FOLLOW_QName_in_belongsToStatement1008 = new BitSet(new long[]{0x0000000000000002L});\r
+    public static final BitSet FOLLOW_Lt_in_inheritance1025 = new BitSet(new long[]{0x0400000000000000L});\r
+    public static final BitSet FOLLOW_QName_in_inheritance1027 = new BitSet(new long[]{0x0000000000000002L});\r
+    public static final BitSet FOLLOW_Includes_in_includeStatement1043 = new BitSet(new long[]{0x0400000000000000L});\r
+    public static final BitSet FOLLOW_includeItem_in_includeStatement1045 = new BitSet(new long[]{0x0000002000000002L});\r
+    public static final BitSet FOLLOW_Comma_in_includeStatement1048 = new BitSet(new long[]{0x0400000000000000L});\r
+    public static final BitSet FOLLOW_includeItem_in_includeStatement1050 = new BitSet(new long[]{0x0000002000000002L});\r
+    public static final BitSet FOLLOW_QName_in_includeItem1066 = new BitSet(new long[]{0x0000000000000002L});\r
+    public static final BitSet FOLLOW_Index_in_indexStatement1080 = new BitSet(new long[]{0x0400000000000000L});\r
+    public static final BitSet FOLLOW_QName_in_indexStatement1082 = new BitSet(new long[]{0x0000100000000000L});\r
+    public static final BitSet FOLLOW_indexTarget_in_indexStatement1084 = new BitSet(new long[]{0x0000002000000002L});\r
+    public static final BitSet FOLLOW_Comma_in_indexStatement1087 = new BitSet(new long[]{0x0000100000000000L});\r
+    public static final BitSet FOLLOW_indexTarget_in_indexStatement1089 = new BitSet(new long[]{0x0000002000000002L});\r
+    public static final BitSet FOLLOW_Symbol_in_indexTarget1116 = new BitSet(new long[]{0x0000000000000002L});\r
+    public static final BitSet FOLLOW_attribute_in_attributes1135 = new BitSet(new long[]{0x0000002000000002L});\r
+    public static final BitSet FOLLOW_Comma_in_attributes1138 = new BitSet(new long[]{0x0400100000000000L});\r
+    public static final BitSet FOLLOW_attribute_in_attributes1140 = new BitSet(new long[]{0x0000002000000002L});\r
+    public static final BitSet FOLLOW_attributeType_in_attribute1166 = new BitSet(new long[]{0x0000100000000000L});\r
+    public static final BitSet FOLLOW_Symbol_in_attribute1169 = new BitSet(new long[]{0x0000000800000002L});\r
+    public static final BitSet FOLLOW_Eq_in_attribute1172 = new BitSet(new long[]{0x0000000026000000L});\r
+    public static final BitSet FOLLOW_attributeValue_in_attribute1174 = new BitSet(new long[]{0x0000000000000002L});\r
+    public static final BitSet FOLLOW_String_in_attributeValue1212 = new BitSet(new long[]{0x0000000000000002L});\r
+    public static final BitSet FOLLOW_Double_in_attributeValue1216 = new BitSet(new long[]{0x0000000000000002L});\r
+    public static final BitSet FOLLOW_Integer_in_attributeValue1220 = new BitSet(new long[]{0x0000000000000002L});\r
+    public static final BitSet FOLLOW_QName_in_attributeType1241 = new BitSet(new long[]{0x0000000000000002L});\r
+    public static final BitSet FOLLOW_QName_in_attributeType1253 = new BitSet(new long[]{0x0000010000000000L});\r
+    public static final BitSet FOLLOW_Star_in_attributeType1255 = new BitSet(new long[]{0x0000000000000002L});\r
 \r
 }
\ No newline at end of file
index 4612816..ff4da8c 100644 (file)
@@ -92,7 +92,7 @@ public class SilkSchemaTest {
 \r
         _logger.info(Lens.toJSON(schema));\r
 \r
-        _logger.info(schema.toGraphviz());\r
+        //_logger.info(schema.toGraphviz());\r
 \r
     }\r
 \r
index 520d307..1c98ce4 100644 (file)
@@ -12,6 +12,8 @@ end
 \r
 # region on a genome sequence\r
 class Locus\r
+  belongs_to Coordinate\r
+\r
   :id \r
   integer :start\r
   integer :end \r
@@ -23,34 +25,28 @@ end
 # gene data with sequence data\r
 class Gene < Locus\r
   sequence :sequence \r
-\r
-  # A gene may have many exons and CDSs\r
-  Exon* :exon\r
-  CDS* :cds\r
 end\r
 \r
 class Exon < Locus\r
+  belongs_to Gene\r
 end\r
 \r
 class CDS < Locus\r
+  belongs_to Gene\r
 end\r
 \r
 # reference sequence\r
 class Reference < Locus\r
-  Coordinate :coodinate\r
   sequence :sequence \r
-  \r
-  # Reference has many reads\r
-  Read* :read\r
 end\r
 \r
 # short-read data\r
-class Read \r
-  includes Locus\r
+class Read < Locus\r
+  belongs_to Reference\r
+\r
   string :sequence \r
   integer* :qv \r
 end \r
 \r
 \r
-\r
 end \r