Commits

Michael Tindal committed e2d75ec

Fix bug in instace_eval, add attachable comments, and add modules and include statement.

Comments (0)

Files changed (18)

Classes/Core/SVIncludeStatement.h

+//
+//  SVIncludeStatement.h
+//  Silver
+//
+//  Created by Michael Tindal on 2/4/12.
+//  Copyright (c) 2012 __MyCompanyName__. All rights reserved.
+//
+
+#import "SVNode.h"
+
+@interface SVIncludeStatement : SVNode {
+    id argument_;
+}
+
++ (SVIncludeStatement *) includeStatementWithArgument:(id)argument;
+
+- (id) initWithArgument:(id) argument;
+
+@property (retain) id argument;
+@end

Classes/Core/SVIncludeStatement.m

+//
+//  SVIncludeStatement.m
+//  Silver
+//
+//  Created by Michael Tindal on 2/4/12.
+//  Copyright (c) 2012 __MyCompanyName__. All rights reserved.
+//
+
+#import "SVIncludeStatement.h"
+#import "SVVariable.h"
+
+@implementation SVIncludeStatement
+
++ (SVIncludeStatement *) includeStatementWithArgument:(id)argument {
+    return [[self alloc] initWithArgument:argument];
+}
+
+- (id) initWithArgument:(id)argument {
+    if((self = [super init])) {
+        self.argument = argument;
+    }
+    return self;
+}
+
+- (id) evaluateWithContext:(NSMutableDictionary *)context {
+    id arg;
+    if([self.argument isKindOfClass:[NSString class]])
+        arg = [SVVariable variableWithName:self.argument];
+    else
+        arg = self.argument;
+    
+    return [arg evaluateWithContext:context];
+}
+
+@synthesize argument = argument_;
+@end

Classes/Core/SVNode.h

 
 @interface SVNode : NSObject <NSCopying> {
     NSString * source_;
+    NSString * comments_; // Comments attached to the source
 }
 
 + (SVNode *)createNodeFromFile:(NSString *)path;
 
 - (NSString *) stringValueWithDepth:(NSInteger)d;
 
-@property (copy) NSString * source;
+@property (copy) NSString * source, * comments;
 @end
 
 @interface SVContextGrab : SVNode
 
 @end
 
+@interface SVNoEvalNode : SVNode {
+    NSString* identifier_;
+}
+
++ (SVNoEvalNode *) noEvalNodeWithIdentifier:(NSString *)identifier;
+
+- (id) initWithIdentifier:(NSString *)identifier;
+
+@property (copy) NSString * identifier;
+@end
+
 #define SV_PARENT_CONTEXT_KEY @"_SVParentContext"
 #define __sv_nil (SVNode *)[NSNull null]
+#ifndef N
 #define N(n) [NSNumber numberWithFloat : n]
+#endif
+#ifndef BL
 #define BL(n) [NSNumber numberWithBool : n]
+#endif
 #define V_(v) [v isKindOfClass:[SVVariable class]] ? [v varName] : nil
 #define R_(l,v,r) SVInstanceRef * ref = [SVInstanceRef refWithLValue:l key:v]
 #define A_(r) [SVFunctionArgument argumentWithName:nil value:r]

Classes/Core/SVNode.m

 #import "SVFunction.h"
 #import "SVInstanceRef.h"
 #import "SVObjcBridgeTypes.h"
+#import "SVVariable.h"
 #import "NSObject+AssociatedObjects.h"
 
 @implementation NSObject (SVevaluateWithContext)
 }
 
 
-@synthesize source = source_;
+@synthesize source = source_, comments = comments_;
 @end
 
 @implementation SVContextGrab
 
 @end
 
+@implementation SVNoEvalNode
+
++ (SVNoEvalNode *) noEvalNodeWithIdentifier:(NSString *)identifier {
+    return [[self alloc] initWithIdentifier:identifier];
+}
+
+- (id) initWithIdentifier:(NSString *)identifier {
+    if((self = [super init])) {
+        self.identifier = identifier;
+    }
+    return self;
+}
+
+- (id) evaluateWithContext:(NSMutableDictionary *)context {
+    SVSymbolTable* table = [context objectForKey:SV_SYMBOL_TABLE_KEY];
+	NSString * varName = self.identifier;
+    
+    if([table lookupSymbol:varName]) {
+		SVSymbol* symbol = [table symbolWithName:varName];
+		return symbol.value;
+	} else if([context objectForKey:SV_PARENT_CONTEXT_KEY]) {
+		return [self evaluateWithContext:[context objectForKey:SV_PARENT_CONTEXT_KEY]];
+	}
+	
+	table = [SVSymbolTable sharedTable];
+	
+	if([table lookupSymbol:varName]) {
+		SVSymbol* symbol = [table symbolWithName:varName];
+		return symbol.value;
+	}
+	
+	return nil;
+}
+
+@synthesize identifier = identifier_;
+@end
+
 NSInteger depthLength(NSInteger d)
 {
     return 0;

Classes/Parser/SVToken.h

         Parse(context.parser,TK_REGEX,TK_(TK_REGEX,[str substringWithRange:NSMakeRange(2,[str length]-3)]),context);
 #define SYMBOL() Parse(context.parser,TK_SYMBOL,TK(TK_SYMBOL),context);
 #define OP() Parse(context.parser,TK_OP,TK(TK_OP),context);
+#define RI() NSString* str = STCFRetain(); \
+        Parse(context.parser,TK_RAWIDENTIFIER,TK_(TK_RAWIDENTIFIER,[str substringWithRange:NSMakeRange(2,[str length]-4)]),context);
 
 @interface SVToken : NSObject {
     @private

Classes/Parser/silver.lemon

 #import "SVProtocol.h"
 #import "Silver.h"
 #import "SVRequireStatement.h"
+#import "SVIncludeStatement.h"
+#import "SVModule.h"
 
 extern int __sv_numOfAnon;
 extern int __sv_numOfAnonTypes;
 %nonassoc CASE DEFAULT.
 %left COPENING.
 %left REP.
+%right ATTACHCOMMENT.
 
 %start_symbol program
 
 expr(P) ::= rescue_construct(R). { P = R; }
 expr(P) ::= sync_construct(S). { P = S; }
 expr(P) ::= class_declaration(D). { P = D; }
+expr(P) ::= module_declaration(D). { P = D; }
+expr(P) ::= INCLUDE LPAREN include_arg(I) RPAREN. { P = [SVIncludeStatement includeStatementWithArgument:I]; }
+expr(P) ::= INCLUDE include_arg(I). { P = [SVIncludeStatement includeStatementWithArgument:I]; }
 expr(P) ::= class_opening(O). { P = O; }
 expr(P) ::= protocol_declaration(D). { P = D; }
 expr(E) ::= arg(A). [COMMA] { E = A; }
+expr(P) ::= ATTACHCOMMENT(A) expr(E). { SVNode * node = E; node.comments = [A tokenData]; P = node; }
+
+include_arg(I) ::= include_arg(L) LAMBDA IDENTIFIER(S). { I = CFRetain([SVSubmodulePart subModule:[S tokenData] fromOwner:L]); }
+include_arg(I) ::= IDENTIFIER(S). { I = CFRetain([S tokenData]); }
 
 singleton(S) ::= variable(V). { S = V; }
 singleton(S) ::= LPAREN expr(E) RPAREN. { S = E; }
 arg(A) ::= REP arg(O) REPF arg(F) COLON arg(T) RBRACE. [REP] {
     A = CFRetain([SVStringRepStatement statementWithObject:O replace:F with:T]);
 }
+arg(A) ::= primary(L) DCOLON. {
+    SVInstanceRef * ref = [SVInstanceRef refWithLValue:L key:@"::"]; 
+    A = CFRetain([SVFunction functionCallWithName:ref arguments:[NSArray array]]);
+}    
 arg(P) ::= LPAREN expr(E) RPAREN. { P = E; }
 arg(A) ::= primary(P). [COMMA] { A = P; }
 
     }
 }
 
+module_declaration(D) ::= MODULE IDENTIFIER(N) LBRACE compstmt(B) RBRACE. {
+    D = CFRetain([SVModule moduleWithName:[N tokenData] contents:B]);
+}
+
 protocol_declaration(D) ::= PROTOCOL IDENTIFIER(N) LESSTHAN IDENTIFIER(P) GREATERTHAN identifiers(L) LBRACE pcompstmt(B) RBRACE. {
     D = CFRetain([SVProtocol classWithName:[N tokenData] parent:[P tokenData] protocols:L contents:B]);
 }
     L = CFRetain([SVFunction functionCallWithName:ref arguments:A]);
 }
 lhs(L) ::= instance_ref(R). [ASSIGN] { L = R; }
+lhs(L) ::= RAWIDENTIFIER(I). { L = CFRetain([SVNoEvalNode noEvalNodeWithIdentifier:[I tokenData]]); }
 
 variable(V) ::= IDENTIFIER(I). { V = CFRetain([SVVariable variableWithName:[I tokenData]]); }
 variable(V) ::= POUND. { V = CFRetain([SVVariable variableWithName:@"#"]); }
 fname(F) ::= UMINUS. { F = CFRetain(@"-@"); }
 fname(F) ::= BRACKETS. { F = CFRetain(@"[]"); }
 fname(F) ::= BRACKETSASSIGN. { F = CFRetain(@"[]="); }
+fname(F) ::= DCOLON. { F = CFRetain(@"::"); }
 fname(F) ::= OP(O). { F = CFRetain([O tokenData]); }

Classes/Parser/silver.rl

 
     c_comment := any_count_line* :>> '*/' @{fgoto main;};
 
+    attach_comment := |*
+        '*/' { Parse(context.parser,TK_ATTACHCOMMENT,CFRetain([SVToken token:TK_ATTACHCOMMENT data:[string_buf copy]]),context); fgoto main; };
+        
+        any { AP; };
+    *|;
+        
     heredoc := |*
         space       { if(!delimiterFound) { delimiterFound = YES; } else { [string_buf appendCharacter:*ts]; } };
         
     '#' [^\n]* newline { context.currentLine++; };
     '//' [^\n]* newline { context.currentLine++; };
     '/*' { fgoto c_comment; };
+    '//*' { SB; fgoto attach_comment; };
 
     # Keywords
     'class'         { KW(CLASS)     };
     'req'           { KW(REQ)       };
     'opt'           { KW(OPT)       };
     'require'       { KW(REQUIRE)   };
+    'module'        { KW(MODULE)    };
+    'include'       { KW(INCLUDE)   };
 
     # symbols
     '|>'             { SYM(FORWARDPIPE) };
     '<|'             { SYM(BACKWARDPIPE) };
     '->'            { SYM(LAMBDA)   };
     ':'             { SYM(COLON)    };
-    #'::'            { SYM(DCOLON)   };
+    '::'            { SYM(DCOLON)   };
     ':='            { SYM(REPF)     };
     ';'             { SYM(SEMICOLON) };
     '#'             { SYM(POUND) };
     # identifiers for things like variables and such
     alpha_u alnum_u* { TOK(IDENTIFIER) };
 
+    '<|' . alpha_u alnum_u* . '|>' { RI() };
+    
     # single quoted string
     sliteralChar = [^'\\] | newline | ( '\\' . any_count_line );
     '\'' . sliteralChar* . '\'' { STRING() };
     # regular expression string
     '%/' . [^/]* . '/' { REGEX() };
 
-    ('+' | '-' | '=' | '!' | '~' | '<' | '>' | '&' | '|' | '^' | '%' | '*' | '/' | '@' | '?')+ { OP() };
+    ('+' | '-' | '=' | '!' | '~' | '<' | '>' | '&' | '|' | '^' | '%' | '*' | '/' | '@' | '?' )+ { OP() };
 
     '@selector(' { SB; fgoto selector; };
 

Classes/Types/SVCategory.m

 #import "SVVariableAssignment.h"
 #import "SVVariable.h"
 #import "NSMutableDictionary+SVExtensions.h"
+#import "SVIncludeStatement.h"
 #import <objc/runtime.h>
 
 @interface SVFunction (SVClassExtension)
     SVClass * klass = sym.value;
     if (!klass) { // since we know that the class exists, this only means it isn't a silver class, but we need
                   // a silver class for lookup to work
-        klass = [[[SVClass alloc] initWithName:self.className parent:nil protocols:nil contents:nil] autorelease];
+        klass = [[SVClass alloc] initWithName:self.className parent:nil protocols:nil contents:nil];
         sym.value = klass;
     }
     Class _svClass = NSClassFromString(self.className);
     SVSymbol * _super = [table symbolWithName:@"super" isConst:YES];
     _super.value = class_getSuperclass(_svClass);
     [context setObject:self.className forKey:@"__SV_CLASS_DEF"];
+    /* Now two-pass to check for include statements */
+    NSMutableArray* contents = [NSMutableArray array];
     for (id content in self.contents) {
+        if([content isKindOfClass:[SVIncludeStatement class]]) {
+            id res = [content evaluateWithContext:context];
+            if([res respondsToSelector:@selector(contents)]) {
+                [contents addObjectsFromArray:[res contents]];
+            } else {
+                [contents addObject:res];
+            }
+        } else {
+            [contents addObject:content];
+        }
+    }
+
+    
+    for (id content in contents) {
         if([content isKindOfClass:[SVClass class]]) {
             [(SVClass*)content setName:[NSString stringWithFormat:@"%@#%@",self.className,[content name]]];
             [content evaluateWithContext:context];

Classes/Types/SVClass.h

 
 @property (retain) NSMutableArray * protocols;
 @property (copy) NSString *name, *parentName;
-@end
+@end

Classes/Types/SVClass.m

 #import "SVVariableAssignment.h"
 #import "SVVariable.h"
 #import "SVClassWrapper.h"
+#import "SVIncludeStatement.h"
 #import <objc/runtime.h>
 
 NSMutableDictionary * sv_block_table;
         name_ = n;
         parentName_ = par;
         protocols_ = p;
-        contents_ = _contents;
+        NSMutableArray * c = [NSMutableArray arrayWithArray:_contents];
+        [c insertObject:[SVIncludeStatement includeStatementWithArgument:@"SVDynamicIvarKeyValueSupport"] atIndex:0];
+        contents_ = c;
     }
     return self;
 }
     _super.value = class_getSuperclass(_svClass);
     [context setObject:name forKey:@"__SV_CLASS_DEF"];
     
+    /* Now two-pass to check for include statements */
+    NSMutableArray* contents = [NSMutableArray array];
     for (id content in self.contents) {
+        if([content isKindOfClass:[SVIncludeStatement class]]) {
+            id res = [content evaluateWithContext:context];
+            if([res respondsToSelector:@selector(contents)]) {
+                [contents addObjectsFromArray:[res contents]];
+            } else {
+                [contents addObject:res];
+            }
+        } else {
+            [contents addObject:content];
+        }
+    }
+    
+    for (id content in contents) {
         if([content isKindOfClass:[SVClass class]]) {
             [(SVClass*)content setName:[NSString stringWithFormat:@"%@#%@",name,[content name]]];
             [content evaluateWithContext:context];

Classes/Types/SVModule.h

+//
+//  SVModule.h
+//  Silver
+//
+//  Created by Michael Tindal on 2/4/12.
+//  Copyright (c) 2012 __MyCompanyName__. All rights reserved.
+//
+
+#import "SVClass.h"
+
+@interface SVModule : SVClass {
+    NSMutableDictionary * mappedContents_;
+}
+
++ (SVModule *) moduleWithName:(NSString *)name contents:(NSMutableArray *)contents;
+
+- (id) initWithName:(NSString *)name contents:(NSMutableArray *)contents;
+
+@property (retain,readonly) NSMutableDictionary * mappedContents;
+@end
+
+@interface SVSubmodulePart : SVNode {
+    id owner_;
+    NSString * submodule_;
+}
+
++ (SVSubmodulePart *) subModule:(NSString *)submodule fromOwner:(id)owner;
+
+- (id) initWithSubModule:(NSString *)submodule fromOwner:(id)owner;
+
+@property (copy) NSString * submodule;
+@property (retain) id owner;
+@end

Classes/Types/SVModule.m

+//
+//  SVModule.m
+//  Silver
+//
+//  Created by Michael Tindal on 2/4/12.
+//  Copyright (c) 2012 __MyCompanyName__. All rights reserved.
+//
+
+#import "SVModule.h"
+#import "SVFunction.h"
+#import "SVCategory.h"
+#import "NSMutableDictionary+SVExtensions.h"
+#import "SVControlOperations.h"
+#import "SVVariableAssignment.h"
+#import "SVVariable.h"
+#import "SVClassWrapper.h"
+#import "SVClass.h"
+#import "SVCategory.h"
+#import "SVProtocol.h"
+#import "SVIncludeStatement.h"
+#import <objc/runtime.h>
+
+@interface SVClass ()
+
+@property (retain) NSMutableArray * contents;
+
+@end
+
+@implementation SVModule
+
++ (SVModule *) moduleWithName:(NSString *)name contents:(NSMutableArray *)contents {
+    return [[self alloc] initWithName:name contents:contents];
+}
+
+- (id) initWithName:(NSString *)name contents:(NSMutableArray *)contents {
+    if((self = [super init])) {
+        self.name = name;
+        self.contents = contents;
+        mappedContents_ = [NSMutableDictionary dictionary];
+    }
+    return self;
+}
+
+- (id) evaluateWithContext:(NSMutableDictionary *)context {
+    NSMutableDictionary * _context = [NSMutableDictionary dictionary];
+    [_context setObject:context forKey:SV_PARENT_CONTEXT_KEY];
+    [_context setObject:BL(YES) forKey:self.name];
+    [context createSymbolTable];
+    SVSymbolTable * table = [context objectForKey:@"__SV_CLASS_DEF"] ? [context symbolTable] : [SVSymbolTable sharedTable];
+    [_context setObject:self.name forKey:@"__SV_CLASS_DEF"];
+    
+    
+    /* Now two-pass to check for include statements */
+    NSMutableArray* contents = [NSMutableArray array];
+    for (id content in self.contents) {
+        if([content isKindOfClass:[SVIncludeStatement class]]) {
+            id res = [content evaluateWithContext:context];
+            if([res respondsToSelector:@selector(contents)]) {
+                [contents addObjectsFromArray:[res contents]];
+            } else {
+                [contents addObject:res];
+            }
+        } else {
+            [contents addObject:content];
+        }
+    }
+    
+    for (id content in contents) {
+        if([content isKindOfClass:[SVClass class]] || [content isKindOfClass:[SVFunction class]] || [content isKindOfClass:[SVCategory class]]) {
+            if(![content isKindOfClass:[SVCategory class]]) {
+                [self.mappedContents setObject:content forKey:[content name]]; 
+            } else {
+                [self.mappedContents setObject:content forKey:[content className]];
+            }
+        }
+    }
+    
+    SVSymbol * modsym = [table symbolWithName:self.name];
+    modsym.value = self;
+    
+    return self;
+
+}
+@synthesize mappedContents = mappedContents_;
+@end
+
+@implementation SVSubmodulePart
+
++(SVSubmodulePart *) subModule:(NSString *)submodule fromOwner:(id)owner {
+    return [[self alloc] initWithSubModule:submodule fromOwner:owner];
+}
+
+-(id) initWithSubModule:(NSString *)submodule fromOwner:(id)owner {
+    if((self = [super init])) {
+        self.submodule = submodule;
+        self.owner = owner;
+    }
+    return self;
+}
+
+-(id) evaluateWithContext:(NSMutableDictionary *)context {
+    id res = [self.owner evaluateWithContext:context];
+    if(![res isKindOfClass:[SVModule class]])
+        return nil;
+    return [((SVModule *)res).mappedContents objectForKey:self.submodule];
+}
+
+@synthesize owner = owner_, submodule = submodule_;
+
+@end
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+

Silver.xcodeproj/project.pbxproj

 	objects = {
 
 /* Begin PBXBuildFile section */
-		3A01002012A9CFA8005A9772 /* SVBlock.h in Headers */ = {isa = PBXBuildFile; fileRef = 3A01000D12A9CFA8005A9772 /* SVBlock.h */; settings = {ATTRIBUTES = (Public, ); }; };
-		3A01002112A9CFA8005A9772 /* SVBlock.m in Sources */ = {isa = PBXBuildFile; fileRef = 3A01000E12A9CFA8005A9772 /* SVBlock.m */; };
-		3A01002212A9CFA8005A9772 /* SVBridgeSupport.h in Headers */ = {isa = PBXBuildFile; fileRef = 3A01000F12A9CFA8005A9772 /* SVBridgeSupport.h */; settings = {ATTRIBUTES = (Public, ); }; };
-		3A01002312A9CFA8005A9772 /* SVBridgeSupport.m in Sources */ = {isa = PBXBuildFile; fileRef = 3A01001012A9CFA8005A9772 /* SVBridgeSupport.m */; };
-		3A01002612A9CFA8005A9772 /* Silver.h in Headers */ = {isa = PBXBuildFile; fileRef = 3A01001312A9CFA8005A9772 /* Silver.h */; settings = {ATTRIBUTES = (Public, ); }; };
-		3A01002712A9CFA8005A9772 /* SVExceptionSystem.h in Headers */ = {isa = PBXBuildFile; fileRef = 3A01001412A9CFA8005A9772 /* SVExceptionSystem.h */; settings = {ATTRIBUTES = (Public, ); }; };
-		3A01002812A9CFA8005A9772 /* SVExceptionSystem.m in Sources */ = {isa = PBXBuildFile; fileRef = 3A01001512A9CFA8005A9772 /* SVExceptionSystem.m */; };
-		3A01002912A9CFA8005A9772 /* SVFlowBlock.h in Headers */ = {isa = PBXBuildFile; fileRef = 3A01001612A9CFA8005A9772 /* SVFlowBlock.h */; settings = {ATTRIBUTES = (Public, ); }; };
-		3A01002A12A9CFA8005A9772 /* SVFlowBlock.m in Sources */ = {isa = PBXBuildFile; fileRef = 3A01001712A9CFA8005A9772 /* SVFlowBlock.m */; };
-		3A01002B12A9CFA8005A9772 /* SVFunction.h in Headers */ = {isa = PBXBuildFile; fileRef = 3A01001812A9CFA8005A9772 /* SVFunction.h */; settings = {ATTRIBUTES = (Public, ); }; };
-		3A01002C12A9CFA8005A9772 /* SVFunction.m in Sources */ = {isa = PBXBuildFile; fileRef = 3A01001912A9CFA8005A9772 /* SVFunction.m */; };
-		3A01002D12A9CFA8005A9772 /* SVNode.h in Headers */ = {isa = PBXBuildFile; fileRef = 3A01001A12A9CFA8005A9772 /* SVNode.h */; settings = {ATTRIBUTES = (Public, ); }; };
-		3A01002E12A9CFA8005A9772 /* SVNode.m in Sources */ = {isa = PBXBuildFile; fileRef = 3A01001B12A9CFA8005A9772 /* SVNode.m */; };
-		3A01003D12A9D05D005A9772 /* SVCategory.h in Headers */ = {isa = PBXBuildFile; fileRef = 3A01003312A9D05D005A9772 /* SVCategory.h */; settings = {ATTRIBUTES = (Public, ); }; };
-		3A01003E12A9D05D005A9772 /* SVCategory.m in Sources */ = {isa = PBXBuildFile; fileRef = 3A01003412A9D05D005A9772 /* SVCategory.m */; };
-		3A01003F12A9D05D005A9772 /* SVClass.h in Headers */ = {isa = PBXBuildFile; fileRef = 3A01003512A9D05D005A9772 /* SVClass.h */; settings = {ATTRIBUTES = (Public, ); }; };
-		3A01004012A9D05D005A9772 /* SVClass.m in Sources */ = {isa = PBXBuildFile; fileRef = 3A01003612A9D05D005A9772 /* SVClass.m */; };
-		3A01004312A9D05D005A9772 /* SVObjcBridgeTypes.h in Headers */ = {isa = PBXBuildFile; fileRef = 3A01003912A9D05D005A9772 /* SVObjcBridgeTypes.h */; settings = {ATTRIBUTES = (Public, ); }; };
-		3A01004412A9D05D005A9772 /* SVObjcBridgeTypes.m in Sources */ = {isa = PBXBuildFile; fileRef = 3A01003A12A9D05D005A9772 /* SVObjcBridgeTypes.m */; };
-		3A01004512A9D05D005A9772 /* SVInstanceRef.h in Headers */ = {isa = PBXBuildFile; fileRef = 3A01003B12A9D05D005A9772 /* SVInstanceRef.h */; settings = {ATTRIBUTES = (Public, ); }; };
-		3A01004612A9D05D005A9772 /* SVInstanceRef.m in Sources */ = {isa = PBXBuildFile; fileRef = 3A01003C12A9D05D005A9772 /* SVInstanceRef.m */; };
-		3A01005512A9D081005A9772 /* SVParserContext.h in Headers */ = {isa = PBXBuildFile; fileRef = 3A01004A12A9D081005A9772 /* SVParserContext.h */; settings = {ATTRIBUTES = (Public, ); }; };
-		3A01005612A9D081005A9772 /* SVParserContext.m in Sources */ = {isa = PBXBuildFile; fileRef = 3A01004B12A9D081005A9772 /* SVParserContext.m */; };
-		3A01005712A9D081005A9772 /* SVSymbol.h in Headers */ = {isa = PBXBuildFile; fileRef = 3A01004C12A9D081005A9772 /* SVSymbol.h */; settings = {ATTRIBUTES = (Public, ); }; };
-		3A01005812A9D081005A9772 /* SVSymbol.m in Sources */ = {isa = PBXBuildFile; fileRef = 3A01004D12A9D081005A9772 /* SVSymbol.m */; };
-		3A01005912A9D081005A9772 /* SVSymbolTable.h in Headers */ = {isa = PBXBuildFile; fileRef = 3A01004E12A9D081005A9772 /* SVSymbolTable.h */; settings = {ATTRIBUTES = (Public, ); }; };
-		3A01005A12A9D081005A9772 /* SVSymbolTable.m in Sources */ = {isa = PBXBuildFile; fileRef = 3A01004F12A9D081005A9772 /* SVSymbolTable.m */; };
-		3A01006512A9D0AB005A9772 /* SVBinaryOperator.h in Headers */ = {isa = PBXBuildFile; fileRef = 3A01005D12A9D0AB005A9772 /* SVBinaryOperator.h */; settings = {ATTRIBUTES = (Public, ); }; };
-		3A01006612A9D0AB005A9772 /* SVBinaryOperator.m in Sources */ = {isa = PBXBuildFile; fileRef = 3A01005E12A9D0AB005A9772 /* SVBinaryOperator.m */; };
-		3A01006712A9D0AB005A9772 /* SVControlOperations.h in Headers */ = {isa = PBXBuildFile; fileRef = 3A01005F12A9D0AB005A9772 /* SVControlOperations.h */; settings = {ATTRIBUTES = (Public, ); }; };
-		3A01006812A9D0AB005A9772 /* SVControlOperations.m in Sources */ = {isa = PBXBuildFile; fileRef = 3A01006012A9D0AB005A9772 /* SVControlOperations.m */; };
-		3A01006912A9D0AB005A9772 /* SVOperator.h in Headers */ = {isa = PBXBuildFile; fileRef = 3A01006112A9D0AB005A9772 /* SVOperator.h */; settings = {ATTRIBUTES = (Public, ); }; };
-		3A01006A12A9D0AB005A9772 /* SVOperator.m in Sources */ = {isa = PBXBuildFile; fileRef = 3A01006212A9D0AB005A9772 /* SVOperator.m */; };
-		3A01006B12A9D0AB005A9772 /* SVUnaryOperator.h in Headers */ = {isa = PBXBuildFile; fileRef = 3A01006312A9D0AB005A9772 /* SVUnaryOperator.h */; settings = {ATTRIBUTES = (Public, ); }; };
-		3A01006C12A9D0AB005A9772 /* SVUnaryOperator.m in Sources */ = {isa = PBXBuildFile; fileRef = 3A01006412A9D0AB005A9772 /* SVUnaryOperator.m */; };
 		3A01FFE012A9CE70005A9772 /* Cocoa.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 3A01FFDF12A9CE70005A9772 /* Cocoa.framework */; };
 		3A01FFE512A9CE70005A9772 /* InfoPlist.strings in Resources */ = {isa = PBXBuildFile; fileRef = 3A01FFE312A9CE70005A9772 /* InfoPlist.strings */; };
 		3A01FFED12A9CE70005A9772 /* Cocoa.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 3A01FFDF12A9CE70005A9772 /* Cocoa.framework */; };
 		3A92C77713746D97000B7A76 /* regversion.c in Sources */ = {isa = PBXBuildFile; fileRef = 3A92C75F13746D97000B7A76 /* regversion.c */; };
 		3A92C77813746D97000B7A76 /* st.c in Sources */ = {isa = PBXBuildFile; fileRef = 3A92C76013746D97000B7A76 /* st.c */; };
 		3A92C77913746D97000B7A76 /* st.h in Headers */ = {isa = PBXBuildFile; fileRef = 3A92C76113746D97000B7A76 /* st.h */; settings = {ATTRIBUTES = (Public, ); }; };
-		3A960E5E13B05F390036B5FE /* NSObject+AssociatedObjects.h in Headers */ = {isa = PBXBuildFile; fileRef = 3A960E5C13B05F390036B5FE /* NSObject+AssociatedObjects.h */; };
+		3A960E5E13B05F390036B5FE /* NSObject+AssociatedObjects.h in Headers */ = {isa = PBXBuildFile; fileRef = 3A960E5C13B05F390036B5FE /* NSObject+AssociatedObjects.h */; settings = {ATTRIBUTES = (Public, ); }; };
 		3A960E5F13B05F390036B5FE /* NSObject+AssociatedObjects.m in Sources */ = {isa = PBXBuildFile; fileRef = 3A960E5D13B05F390036B5FE /* NSObject+AssociatedObjects.m */; };
-		3A9EE90D13B11A2200AA8A94 /* SVProtocol.h in Headers */ = {isa = PBXBuildFile; fileRef = 3A9EE90B13B11A2200AA8A94 /* SVProtocol.h */; };
+		3A9EE90D13B11A2200AA8A94 /* SVProtocol.h in Headers */ = {isa = PBXBuildFile; fileRef = 3A9EE90B13B11A2200AA8A94 /* SVProtocol.h */; settings = {ATTRIBUTES = (Public, ); }; };
 		3A9EE90E13B11A2200AA8A94 /* SVProtocol.m in Sources */ = {isa = PBXBuildFile; fileRef = 3A9EE90C13B11A2200AA8A94 /* SVProtocol.m */; };
-		3AA2A0E713D606A5005A1B33 /* SVBuiltinRange.h in Headers */ = {isa = PBXBuildFile; fileRef = 3AA2A0E513D606A5005A1B33 /* SVBuiltinRange.h */; };
+		3AA2A0E713D606A5005A1B33 /* SVBuiltinRange.h in Headers */ = {isa = PBXBuildFile; fileRef = 3AA2A0E513D606A5005A1B33 /* SVBuiltinRange.h */; settings = {ATTRIBUTES = (Public, ); }; };
 		3AA2A0E813D606A5005A1B33 /* SVBuiltinRange.m in Sources */ = {isa = PBXBuildFile; fileRef = 3AA2A0E613D606A5005A1B33 /* SVBuiltinRange.m */; };
 		3AAEC483139AC5FA00E47B93 /* silver.rl in Sources */ = {isa = PBXBuildFile; fileRef = 3AAEC482139AC5F900E47B93 /* silver.rl */; };
 		3AC2F11C13A4355600069808 /* silver.lemon in Sources */ = {isa = PBXBuildFile; fileRef = 3AC2F11B13A4355600069808 /* silver.lemon */; };
-		3AC5B7E513A7A6A400594730 /* OCLog.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 3AC5B7D013A7A33B00594730 /* OCLog.framework */; };
 		3AC5B7EB13A7A6BB00594730 /* OCLog.framework in CopyFiles */ = {isa = PBXBuildFile; fileRef = 3AC5B7EA13A7A6BB00594730 /* OCLog.framework */; };
 		3AC5B7F013A7A6DE00594730 /* OCHamcrest.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 3AC5B7EE13A7A6DE00594730 /* OCHamcrest.framework */; };
 		3AC5B7F113A7A6DE00594730 /* OCMock.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 3AC5B7EF13A7A6DE00594730 /* OCMock.framework */; };
-		3AC5B7F213A7A6E800594730 /* OCLog.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 3AC5B7D013A7A33B00594730 /* OCLog.framework */; };
-		3AC5B7F313A7A9A700594730 /* OCLog.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 3AC5B7D013A7A33B00594730 /* OCLog.framework */; };
 		3AC934281335CDE7009CB7C6 /* libreadline.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = 3AC934271335CDE7009CB7C6 /* libreadline.dylib */; };
 		3AC9342B1335D002009CB7C6 /* SVMiscFunctions.h in Headers */ = {isa = PBXBuildFile; fileRef = 3AC934291335D002009CB7C6 /* SVMiscFunctions.h */; settings = {ATTRIBUTES = (Public, ); }; };
 		3AC9342C1335D002009CB7C6 /* SVMiscFunctions.m in Sources */ = {isa = PBXBuildFile; fileRef = 3AC9342A1335D002009CB7C6 /* SVMiscFunctions.m */; };
 		3AD8EC6B1396056200D5645A /* ruby.sv in Resources */ = {isa = PBXBuildFile; fileRef = 3AD8EC6A1396056200D5645A /* ruby.sv */; };
 		3AE1606A13486C3B000AC7DF /* MABlockClosure.h in Headers */ = {isa = PBXBuildFile; fileRef = 3AE1606813486C3A000AC7DF /* MABlockClosure.h */; settings = {ATTRIBUTES = (Public, ); }; };
 		3AE1606B13486C3B000AC7DF /* MABlockClosure.m in Sources */ = {isa = PBXBuildFile; fileRef = 3AE1606913486C3A000AC7DF /* MABlockClosure.m */; };
+		3AE4325F14DBF1280012D70A /* sdoc in Resources */ = {isa = PBXBuildFile; fileRef = 3AE4325E14DBF1280012D70A /* sdoc */; };
+		3AE4326C14DCB13B0012D70A /* OCLog.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 3AC5B7EA13A7A6BB00594730 /* OCLog.framework */; };
+		3AE4326D14DCB1470012D70A /* OCLog.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 3AC5B7EA13A7A6BB00594730 /* OCLog.framework */; };
+		3AE4326E14DCB2100012D70A /* OCLog.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 3AC5B7EA13A7A6BB00594730 /* OCLog.framework */; };
+		3AE4338714DCBBA60012D70A /* Silver.h in Headers */ = {isa = PBXBuildFile; fileRef = 3AE4337A14DCBBA60012D70A /* Silver.h */; settings = {ATTRIBUTES = (Public, ); }; };
+		3AE4338814DCBBA60012D70A /* SVBlock.h in Headers */ = {isa = PBXBuildFile; fileRef = 3AE4337B14DCBBA60012D70A /* SVBlock.h */; settings = {ATTRIBUTES = (Public, ); }; };
+		3AE4338914DCBBA60012D70A /* SVBlock.m in Sources */ = {isa = PBXBuildFile; fileRef = 3AE4337C14DCBBA60012D70A /* SVBlock.m */; };
+		3AE4338A14DCBBA60012D70A /* SVBridgeSupport.h in Headers */ = {isa = PBXBuildFile; fileRef = 3AE4337D14DCBBA60012D70A /* SVBridgeSupport.h */; settings = {ATTRIBUTES = (Public, ); }; };
+		3AE4338B14DCBBA60012D70A /* SVBridgeSupport.m in Sources */ = {isa = PBXBuildFile; fileRef = 3AE4337E14DCBBA60012D70A /* SVBridgeSupport.m */; };
+		3AE4338C14DCBBA60012D70A /* SVExceptionSystem.h in Headers */ = {isa = PBXBuildFile; fileRef = 3AE4337F14DCBBA60012D70A /* SVExceptionSystem.h */; settings = {ATTRIBUTES = (Public, ); }; };
+		3AE4338D14DCBBA60012D70A /* SVExceptionSystem.m in Sources */ = {isa = PBXBuildFile; fileRef = 3AE4338014DCBBA60012D70A /* SVExceptionSystem.m */; };
+		3AE4338E14DCBBA60012D70A /* SVFlowBlock.h in Headers */ = {isa = PBXBuildFile; fileRef = 3AE4338114DCBBA60012D70A /* SVFlowBlock.h */; settings = {ATTRIBUTES = (Public, ); }; };
+		3AE4338F14DCBBA60012D70A /* SVFlowBlock.m in Sources */ = {isa = PBXBuildFile; fileRef = 3AE4338214DCBBA60012D70A /* SVFlowBlock.m */; };
+		3AE4339014DCBBA60012D70A /* SVFunction.h in Headers */ = {isa = PBXBuildFile; fileRef = 3AE4338314DCBBA60012D70A /* SVFunction.h */; settings = {ATTRIBUTES = (Public, ); }; };
+		3AE4339114DCBBA60012D70A /* SVFunction.m in Sources */ = {isa = PBXBuildFile; fileRef = 3AE4338414DCBBA60012D70A /* SVFunction.m */; };
+		3AE4339214DCBBA60012D70A /* SVNode.h in Headers */ = {isa = PBXBuildFile; fileRef = 3AE4338514DCBBA60012D70A /* SVNode.h */; settings = {ATTRIBUTES = (Public, ); }; };
+		3AE4339314DCBBA60012D70A /* SVNode.m in Sources */ = {isa = PBXBuildFile; fileRef = 3AE4338614DCBBA60012D70A /* SVNode.m */; };
+		3AE4339C14DCBBB70012D70A /* SVBinaryOperator.h in Headers */ = {isa = PBXBuildFile; fileRef = 3AE4339414DCBBB70012D70A /* SVBinaryOperator.h */; settings = {ATTRIBUTES = (Public, ); }; };
+		3AE4339D14DCBBB70012D70A /* SVBinaryOperator.m in Sources */ = {isa = PBXBuildFile; fileRef = 3AE4339514DCBBB70012D70A /* SVBinaryOperator.m */; };
+		3AE4339E14DCBBB70012D70A /* SVControlOperations.h in Headers */ = {isa = PBXBuildFile; fileRef = 3AE4339614DCBBB70012D70A /* SVControlOperations.h */; settings = {ATTRIBUTES = (Public, ); }; };
+		3AE4339F14DCBBB70012D70A /* SVControlOperations.m in Sources */ = {isa = PBXBuildFile; fileRef = 3AE4339714DCBBB70012D70A /* SVControlOperations.m */; };
+		3AE433A014DCBBB70012D70A /* SVOperator.h in Headers */ = {isa = PBXBuildFile; fileRef = 3AE4339814DCBBB70012D70A /* SVOperator.h */; settings = {ATTRIBUTES = (Public, ); }; };
+		3AE433A114DCBBB70012D70A /* SVOperator.m in Sources */ = {isa = PBXBuildFile; fileRef = 3AE4339914DCBBB70012D70A /* SVOperator.m */; };
+		3AE433A214DCBBB70012D70A /* SVUnaryOperator.h in Headers */ = {isa = PBXBuildFile; fileRef = 3AE4339A14DCBBB70012D70A /* SVUnaryOperator.h */; settings = {ATTRIBUTES = (Public, ); }; };
+		3AE433A314DCBBB70012D70A /* SVUnaryOperator.m in Sources */ = {isa = PBXBuildFile; fileRef = 3AE4339B14DCBBB70012D70A /* SVUnaryOperator.m */; };
+		3AE433AA14DCBBC70012D70A /* SVParserContext.h in Headers */ = {isa = PBXBuildFile; fileRef = 3AE433A414DCBBC70012D70A /* SVParserContext.h */; settings = {ATTRIBUTES = (Public, ); }; };
+		3AE433AB14DCBBC70012D70A /* SVParserContext.m in Sources */ = {isa = PBXBuildFile; fileRef = 3AE433A514DCBBC70012D70A /* SVParserContext.m */; };
+		3AE433AC14DCBBC70012D70A /* SVSymbol.h in Headers */ = {isa = PBXBuildFile; fileRef = 3AE433A614DCBBC70012D70A /* SVSymbol.h */; settings = {ATTRIBUTES = (Public, ); }; };
+		3AE433AD14DCBBC70012D70A /* SVSymbol.m in Sources */ = {isa = PBXBuildFile; fileRef = 3AE433A714DCBBC70012D70A /* SVSymbol.m */; };
+		3AE433AE14DCBBC70012D70A /* SVSymbolTable.h in Headers */ = {isa = PBXBuildFile; fileRef = 3AE433A814DCBBC70012D70A /* SVSymbolTable.h */; settings = {ATTRIBUTES = (Public, ); }; };
+		3AE433AF14DCBBC70012D70A /* SVSymbolTable.m in Sources */ = {isa = PBXBuildFile; fileRef = 3AE433A914DCBBC70012D70A /* SVSymbolTable.m */; };
+		3AE433B814DCBBD70012D70A /* SVCategory.h in Headers */ = {isa = PBXBuildFile; fileRef = 3AE433B014DCBBD70012D70A /* SVCategory.h */; settings = {ATTRIBUTES = (Public, ); }; };
+		3AE433B914DCBBD70012D70A /* SVCategory.m in Sources */ = {isa = PBXBuildFile; fileRef = 3AE433B114DCBBD70012D70A /* SVCategory.m */; };
+		3AE433BA14DCBBD70012D70A /* SVClass.h in Headers */ = {isa = PBXBuildFile; fileRef = 3AE433B214DCBBD70012D70A /* SVClass.h */; settings = {ATTRIBUTES = (Public, ); }; };
+		3AE433BB14DCBBD70012D70A /* SVClass.m in Sources */ = {isa = PBXBuildFile; fileRef = 3AE433B314DCBBD70012D70A /* SVClass.m */; };
+		3AE433BC14DCBBD70012D70A /* SVInstanceRef.h in Headers */ = {isa = PBXBuildFile; fileRef = 3AE433B414DCBBD70012D70A /* SVInstanceRef.h */; settings = {ATTRIBUTES = (Public, ); }; };
+		3AE433BD14DCBBD70012D70A /* SVInstanceRef.m in Sources */ = {isa = PBXBuildFile; fileRef = 3AE433B514DCBBD70012D70A /* SVInstanceRef.m */; };
+		3AE433BE14DCBBD70012D70A /* SVObjcBridgeTypes.h in Headers */ = {isa = PBXBuildFile; fileRef = 3AE433B614DCBBD70012D70A /* SVObjcBridgeTypes.h */; settings = {ATTRIBUTES = (Public, ); }; };
+		3AE433BF14DCBBD70012D70A /* SVObjcBridgeTypes.m in Sources */ = {isa = PBXBuildFile; fileRef = 3AE433B714DCBBD70012D70A /* SVObjcBridgeTypes.m */; };
+		3AE433D014DD5FFC0012D70A /* SVModule.h in Headers */ = {isa = PBXBuildFile; fileRef = 3AE433CE14DD5FFC0012D70A /* SVModule.h */; };
+		3AE433D114DD5FFC0012D70A /* SVModule.m in Sources */ = {isa = PBXBuildFile; fileRef = 3AE433CF14DD5FFC0012D70A /* SVModule.m */; };
+		3AE433D414DD64A90012D70A /* SVIncludeStatement.h in Headers */ = {isa = PBXBuildFile; fileRef = 3AE433D214DD64A90012D70A /* SVIncludeStatement.h */; };
+		3AE433D514DD64A90012D70A /* SVIncludeStatement.m in Sources */ = {isa = PBXBuildFile; fileRef = 3AE433D314DD64A90012D70A /* SVIncludeStatement.m */; };
 		3AE88EFB139964100001D84D /* core.sv in Resources */ = {isa = PBXBuildFile; fileRef = 3AE88EFA139964100001D84D /* core.sv */; };
 		3AE88EFE139964C60001D84D /* svvm.h in Headers */ = {isa = PBXBuildFile; fileRef = 3AE88EFC139964C60001D84D /* svvm.h */; settings = {ATTRIBUTES = (Public, ); }; };
 		3AE88EFF139964C60001D84D /* svvm.m in Sources */ = {isa = PBXBuildFile; fileRef = 3AE88EFD139964C60001D84D /* svvm.m */; };
-		3AEC11DA14BCC0FF00D25677 /* SVRequireStatement.h in Headers */ = {isa = PBXBuildFile; fileRef = 3AEC11D814BCC0FF00D25677 /* SVRequireStatement.h */; };
+		3AEC11DA14BCC0FF00D25677 /* SVRequireStatement.h in Headers */ = {isa = PBXBuildFile; fileRef = 3AEC11D814BCC0FF00D25677 /* SVRequireStatement.h */; settings = {ATTRIBUTES = (Public, ); }; };
 		3AEC11DB14BCC0FF00D25677 /* SVRequireStatement.m in Sources */ = {isa = PBXBuildFile; fileRef = 3AEC11D914BCC0FF00D25677 /* SVRequireStatement.m */; };
 /* End PBXBuildFile section */
 
 			remoteGlobalIDString = 3A01FFEB12A9CE70005A9772;
 			remoteInfo = SilverTests;
 		};
-		3AC5B7CF13A7A33B00594730 /* PBXContainerItemProxy */ = {
+		3AE4326814DCB1070012D70A /* PBXContainerItemProxy */ = {
 			isa = PBXContainerItemProxy;
-			containerPortal = 3AC5B7C813A7A33A00594730 /* OCLog.xcodeproj */;
+			containerPortal = 3AE4326114DCB1060012D70A /* OCLog.xcodeproj */;
 			proxyType = 2;
 			remoteGlobalIDString = 3A01FF3C12A9CC3A005A9772;
 			remoteInfo = OCLog;
 		};
-		3AC5B7E613A7A6A900594730 /* PBXContainerItemProxy */ = {
+		3AE4326A14DCB1100012D70A /* PBXContainerItemProxy */ = {
 			isa = PBXContainerItemProxy;
-			containerPortal = 3AC5B7C813A7A33A00594730 /* OCLog.xcodeproj */;
+			containerPortal = 3AE4326114DCB1060012D70A /* OCLog.xcodeproj */;
 			proxyType = 1;
 			remoteGlobalIDString = 3A01FF3B12A9CC3A005A9772;
 			remoteInfo = OCLog;
 /* End PBXCopyFilesBuildPhase section */
 
 /* Begin PBXFileReference section */
-		3A01000D12A9CFA8005A9772 /* SVBlock.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = SVBlock.h; path = /Users/mtindal/Projects/Silver/Classes/Core/SVBlock.h; sourceTree = "<absolute>"; };
-		3A01000E12A9CFA8005A9772 /* SVBlock.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = SVBlock.m; path = /Users/mtindal/Projects/Silver/Classes/Core/SVBlock.m; sourceTree = "<absolute>"; };
-		3A01000F12A9CFA8005A9772 /* SVBridgeSupport.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = SVBridgeSupport.h; path = /Users/mtindal/Projects/Silver/Classes/Core/SVBridgeSupport.h; sourceTree = "<absolute>"; };
-		3A01001012A9CFA8005A9772 /* SVBridgeSupport.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = SVBridgeSupport.m; path = /Users/mtindal/Projects/Silver/Classes/Core/SVBridgeSupport.m; sourceTree = "<absolute>"; };
-		3A01001312A9CFA8005A9772 /* Silver.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = Silver.h; path = /Users/mtindal/Projects/Silver/Classes/Core/Silver.h; sourceTree = "<absolute>"; };
-		3A01001412A9CFA8005A9772 /* SVExceptionSystem.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = SVExceptionSystem.h; path = /Users/mtindal/Projects/Silver/Classes/Core/SVExceptionSystem.h; sourceTree = "<absolute>"; };
-		3A01001512A9CFA8005A9772 /* SVExceptionSystem.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = SVExceptionSystem.m; path = /Users/mtindal/Projects/Silver/Classes/Core/SVExceptionSystem.m; sourceTree = "<absolute>"; };
-		3A01001612A9CFA8005A9772 /* SVFlowBlock.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = SVFlowBlock.h; path = /Users/mtindal/Projects/Silver/Classes/Core/SVFlowBlock.h; sourceTree = "<absolute>"; };
-		3A01001712A9CFA8005A9772 /* SVFlowBlock.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = SVFlowBlock.m; path = /Users/mtindal/Projects/Silver/Classes/Core/SVFlowBlock.m; sourceTree = "<absolute>"; };
-		3A01001812A9CFA8005A9772 /* SVFunction.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = SVFunction.h; path = /Users/mtindal/Projects/Silver/Classes/Core/SVFunction.h; sourceTree = "<absolute>"; };
-		3A01001912A9CFA8005A9772 /* SVFunction.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = SVFunction.m; path = /Users/mtindal/Projects/Silver/Classes/Core/SVFunction.m; sourceTree = "<absolute>"; };
-		3A01001A12A9CFA8005A9772 /* SVNode.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = SVNode.h; path = /Users/mtindal/Projects/Silver/Classes/Core/SVNode.h; sourceTree = "<absolute>"; };
-		3A01001B12A9CFA8005A9772 /* SVNode.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = SVNode.m; path = /Users/mtindal/Projects/Silver/Classes/Core/SVNode.m; sourceTree = "<absolute>"; };
-		3A01003312A9D05D005A9772 /* SVCategory.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = SVCategory.h; path = /Users/mtindal/Projects/Silver/Classes/Types/SVCategory.h; sourceTree = "<absolute>"; };
-		3A01003412A9D05D005A9772 /* SVCategory.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = SVCategory.m; path = /Users/mtindal/Projects/Silver/Classes/Types/SVCategory.m; sourceTree = "<absolute>"; };
-		3A01003512A9D05D005A9772 /* SVClass.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = SVClass.h; path = /Users/mtindal/Projects/Silver/Classes/Types/SVClass.h; sourceTree = "<absolute>"; };
-		3A01003612A9D05D005A9772 /* SVClass.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = SVClass.m; path = /Users/mtindal/Projects/Silver/Classes/Types/SVClass.m; sourceTree = "<absolute>"; };
-		3A01003912A9D05D005A9772 /* SVObjcBridgeTypes.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = SVObjcBridgeTypes.h; path = /Users/mtindal/Projects/Silver/Classes/Types/SVObjcBridgeTypes.h; sourceTree = "<absolute>"; };
-		3A01003A12A9D05D005A9772 /* SVObjcBridgeTypes.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = SVObjcBridgeTypes.m; path = /Users/mtindal/Projects/Silver/Classes/Types/SVObjcBridgeTypes.m; sourceTree = "<absolute>"; };
-		3A01003B12A9D05D005A9772 /* SVInstanceRef.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = SVInstanceRef.h; path = /Users/mtindal/Projects/Silver/Classes/Types/SVInstanceRef.h; sourceTree = "<absolute>"; };
-		3A01003C12A9D05D005A9772 /* SVInstanceRef.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = SVInstanceRef.m; path = /Users/mtindal/Projects/Silver/Classes/Types/SVInstanceRef.m; sourceTree = "<absolute>"; };
-		3A01004A12A9D081005A9772 /* SVParserContext.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = SVParserContext.h; path = /Users/mtindal/Projects/Silver/Classes/Parser/SVParserContext.h; sourceTree = "<absolute>"; };
-		3A01004B12A9D081005A9772 /* SVParserContext.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = SVParserContext.m; path = /Users/mtindal/Projects/Silver/Classes/Parser/SVParserContext.m; sourceTree = "<absolute>"; };
-		3A01004C12A9D081005A9772 /* SVSymbol.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = SVSymbol.h; path = /Users/mtindal/Projects/Silver/Classes/Parser/SVSymbol.h; sourceTree = "<absolute>"; };
-		3A01004D12A9D081005A9772 /* SVSymbol.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = SVSymbol.m; path = /Users/mtindal/Projects/Silver/Classes/Parser/SVSymbol.m; sourceTree = "<absolute>"; };
-		3A01004E12A9D081005A9772 /* SVSymbolTable.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = SVSymbolTable.h; path = /Users/mtindal/Projects/Silver/Classes/Parser/SVSymbolTable.h; sourceTree = "<absolute>"; };
-		3A01004F12A9D081005A9772 /* SVSymbolTable.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = SVSymbolTable.m; path = /Users/mtindal/Projects/Silver/Classes/Parser/SVSymbolTable.m; sourceTree = "<absolute>"; };
-		3A01005D12A9D0AB005A9772 /* SVBinaryOperator.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = SVBinaryOperator.h; path = /Users/mtindal/Projects/Silver/Classes/Operators/SVBinaryOperator.h; sourceTree = "<absolute>"; };
-		3A01005E12A9D0AB005A9772 /* SVBinaryOperator.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = SVBinaryOperator.m; path = /Users/mtindal/Projects/Silver/Classes/Operators/SVBinaryOperator.m; sourceTree = "<absolute>"; };
-		3A01005F12A9D0AB005A9772 /* SVControlOperations.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = SVControlOperations.h; path = /Users/mtindal/Projects/Silver/Classes/Operators/SVControlOperations.h; sourceTree = "<absolute>"; };
-		3A01006012A9D0AB005A9772 /* SVControlOperations.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = SVControlOperations.m; path = /Users/mtindal/Projects/Silver/Classes/Operators/SVControlOperations.m; sourceTree = "<absolute>"; };
-		3A01006112A9D0AB005A9772 /* SVOperator.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = SVOperator.h; path = /Users/mtindal/Projects/Silver/Classes/Operators/SVOperator.h; sourceTree = "<absolute>"; };
-		3A01006212A9D0AB005A9772 /* SVOperator.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = SVOperator.m; path = /Users/mtindal/Projects/Silver/Classes/Operators/SVOperator.m; sourceTree = "<absolute>"; };
-		3A01006312A9D0AB005A9772 /* SVUnaryOperator.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = SVUnaryOperator.h; path = /Users/mtindal/Projects/Silver/Classes/Operators/SVUnaryOperator.h; sourceTree = "<absolute>"; };
-		3A01006412A9D0AB005A9772 /* SVUnaryOperator.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = SVUnaryOperator.m; path = /Users/mtindal/Projects/Silver/Classes/Operators/SVUnaryOperator.m; sourceTree = "<absolute>"; };
 		3A01FFDD12A9CE70005A9772 /* Silver.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Silver.framework; sourceTree = BUILT_PRODUCTS_DIR; };
 		3A01FFDF12A9CE70005A9772 /* Cocoa.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Cocoa.framework; path = System/Library/Frameworks/Cocoa.framework; sourceTree = SDKROOT; };
 		3A01FFE112A9CE70005A9772 /* Silver-Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = "Silver-Info.plist"; sourceTree = "<group>"; };
 		3AA2A0E613D606A5005A1B33 /* SVBuiltinRange.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SVBuiltinRange.m; sourceTree = "<group>"; };
 		3AAEC482139AC5F900E47B93 /* silver.rl */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = silver.rl; sourceTree = "<group>"; };
 		3AC2F11B13A4355600069808 /* silver.lemon */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = silver.lemon; sourceTree = "<group>"; };
-		3AC5B7C813A7A33A00594730 /* OCLog.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = OCLog.xcodeproj; path = external/oclog/OCLog.xcodeproj; sourceTree = "<group>"; };
 		3AC5B7EA13A7A6BB00594730 /* OCLog.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; path = OCLog.framework; sourceTree = BUILT_PRODUCTS_DIR; };
 		3AC5B7EE13A7A6DE00594730 /* OCHamcrest.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = OCHamcrest.framework; path = Library/Frameworks/OCHamcrest.framework; sourceTree = SDKROOT; };
 		3AC5B7EF13A7A6DE00594730 /* OCMock.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = OCMock.framework; path = Library/Frameworks/OCMock.framework; sourceTree = SDKROOT; };
 		3AD8EC6A1396056200D5645A /* ruby.sv */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = ruby.sv; sourceTree = "<group>"; };
 		3AE1606813486C3A000AC7DF /* MABlockClosure.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MABlockClosure.h; sourceTree = "<group>"; };
 		3AE1606913486C3A000AC7DF /* MABlockClosure.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = MABlockClosure.m; sourceTree = "<group>"; };
+		3AE4325E14DBF1280012D70A /* sdoc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = sdoc; sourceTree = "<group>"; xcLanguageSpecificationIdentifier = "<none>"; };
+		3AE4326114DCB1060012D70A /* OCLog.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = OCLog.xcodeproj; path = ../oclog/OCLog.xcodeproj; sourceTree = "<group>"; };
+		3AE4337A14DCBBA60012D70A /* Silver.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Silver.h; sourceTree = "<group>"; };
+		3AE4337B14DCBBA60012D70A /* SVBlock.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SVBlock.h; sourceTree = "<group>"; };
+		3AE4337C14DCBBA60012D70A /* SVBlock.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SVBlock.m; sourceTree = "<group>"; };
+		3AE4337D14DCBBA60012D70A /* SVBridgeSupport.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SVBridgeSupport.h; sourceTree = "<group>"; };
+		3AE4337E14DCBBA60012D70A /* SVBridgeSupport.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SVBridgeSupport.m; sourceTree = "<group>"; };
+		3AE4337F14DCBBA60012D70A /* SVExceptionSystem.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SVExceptionSystem.h; sourceTree = "<group>"; };
+		3AE4338014DCBBA60012D70A /* SVExceptionSystem.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SVExceptionSystem.m; sourceTree = "<group>"; };
+		3AE4338114DCBBA60012D70A /* SVFlowBlock.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SVFlowBlock.h; sourceTree = "<group>"; };
+		3AE4338214DCBBA60012D70A /* SVFlowBlock.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SVFlowBlock.m; sourceTree = "<group>"; };
+		3AE4338314DCBBA60012D70A /* SVFunction.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SVFunction.h; sourceTree = "<group>"; };
+		3AE4338414DCBBA60012D70A /* SVFunction.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SVFunction.m; sourceTree = "<group>"; };
+		3AE4338514DCBBA60012D70A /* SVNode.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SVNode.h; sourceTree = "<group>"; };
+		3AE4338614DCBBA60012D70A /* SVNode.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SVNode.m; sourceTree = "<group>"; };
+		3AE4339414DCBBB70012D70A /* SVBinaryOperator.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SVBinaryOperator.h; sourceTree = "<group>"; };
+		3AE4339514DCBBB70012D70A /* SVBinaryOperator.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SVBinaryOperator.m; sourceTree = "<group>"; };
+		3AE4339614DCBBB70012D70A /* SVControlOperations.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SVControlOperations.h; sourceTree = "<group>"; };
+		3AE4339714DCBBB70012D70A /* SVControlOperations.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SVControlOperations.m; sourceTree = "<group>"; };
+		3AE4339814DCBBB70012D70A /* SVOperator.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SVOperator.h; sourceTree = "<group>"; };
+		3AE4339914DCBBB70012D70A /* SVOperator.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SVOperator.m; sourceTree = "<group>"; };
+		3AE4339A14DCBBB70012D70A /* SVUnaryOperator.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SVUnaryOperator.h; sourceTree = "<group>"; };
+		3AE4339B14DCBBB70012D70A /* SVUnaryOperator.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SVUnaryOperator.m; sourceTree = "<group>"; };
+		3AE433A414DCBBC70012D70A /* SVParserContext.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SVParserContext.h; sourceTree = "<group>"; };
+		3AE433A514DCBBC70012D70A /* SVParserContext.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SVParserContext.m; sourceTree = "<group>"; };
+		3AE433A614DCBBC70012D70A /* SVSymbol.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SVSymbol.h; sourceTree = "<group>"; };
+		3AE433A714DCBBC70012D70A /* SVSymbol.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SVSymbol.m; sourceTree = "<group>"; };
+		3AE433A814DCBBC70012D70A /* SVSymbolTable.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SVSymbolTable.h; sourceTree = "<group>"; };
+		3AE433A914DCBBC70012D70A /* SVSymbolTable.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SVSymbolTable.m; sourceTree = "<group>"; };
+		3AE433B014DCBBD70012D70A /* SVCategory.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SVCategory.h; sourceTree = "<group>"; };
+		3AE433B114DCBBD70012D70A /* SVCategory.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SVCategory.m; sourceTree = "<group>"; };
+		3AE433B214DCBBD70012D70A /* SVClass.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SVClass.h; sourceTree = "<group>"; };
+		3AE433B314DCBBD70012D70A /* SVClass.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SVClass.m; sourceTree = "<group>"; };
+		3AE433B414DCBBD70012D70A /* SVInstanceRef.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SVInstanceRef.h; sourceTree = "<group>"; };
+		3AE433B514DCBBD70012D70A /* SVInstanceRef.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SVInstanceRef.m; sourceTree = "<group>"; };
+		3AE433B614DCBBD70012D70A /* SVObjcBridgeTypes.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SVObjcBridgeTypes.h; sourceTree = "<group>"; };
+		3AE433B714DCBBD70012D70A /* SVObjcBridgeTypes.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SVObjcBridgeTypes.m; sourceTree = "<group>"; };
+		3AE433CE14DD5FFC0012D70A /* SVModule.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SVModule.h; sourceTree = "<group>"; };
+		3AE433CF14DD5FFC0012D70A /* SVModule.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SVModule.m; sourceTree = "<group>"; };
+		3AE433D214DD64A90012D70A /* SVIncludeStatement.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SVIncludeStatement.h; sourceTree = "<group>"; };
+		3AE433D314DD64A90012D70A /* SVIncludeStatement.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SVIncludeStatement.m; sourceTree = "<group>"; };
 		3AE88EFA139964100001D84D /* core.sv */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = core.sv; sourceTree = "<group>"; };
 		3AE88EFC139964C60001D84D /* svvm.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = svvm.h; sourceTree = "<group>"; };
 		3AE88EFD139964C60001D84D /* svvm.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = svvm.m; sourceTree = "<group>"; };
 			isa = PBXFrameworksBuildPhase;
 			buildActionMask = 2147483647;
 			files = (
-				3AC5B7E513A7A6A400594730 /* OCLog.framework in Frameworks */,
 				3AC934281335CDE7009CB7C6 /* libreadline.dylib in Frameworks */,
 				3ACD0FCF12A9E5BD00CE8E92 /* libffi.dylib in Frameworks */,
 				3A01FFE012A9CE70005A9772 /* Cocoa.framework in Frameworks */,
+				3AE4326C14DCB13B0012D70A /* OCLog.framework in Frameworks */,
 			);
 			runOnlyForDeploymentPostprocessing = 0;
 		};
 			isa = PBXFrameworksBuildPhase;
 			buildActionMask = 2147483647;
 			files = (
-				3AC5B7F213A7A6E800594730 /* OCLog.framework in Frameworks */,
 				3AC5B7F013A7A6DE00594730 /* OCHamcrest.framework in Frameworks */,
 				3AC5B7F113A7A6DE00594730 /* OCMock.framework in Frameworks */,
+				3AE4326D14DCB1470012D70A /* OCLog.framework in Frameworks */,
 				3A10048A12B5D83E008A01E3 /* Silver.framework in Frameworks */,
 				3A01FFED12A9CE70005A9772 /* Cocoa.framework in Frameworks */,
 			);
 			isa = PBXFrameworksBuildPhase;
 			buildActionMask = 2147483647;
 			files = (
-				3AC5B7F313A7A9A700594730 /* OCLog.framework in Frameworks */,
 				3A0398F6139C9CD40065D102 /* Silver.framework in Frameworks */,
+				3AE4326E14DCB2100012D70A /* OCLog.framework in Frameworks */,
 				3A0398E5139C9CB60065D102 /* Foundation.framework in Frameworks */,
 			);
 			runOnlyForDeploymentPostprocessing = 0;
 		3A01000812A9CF2E005A9772 /* Core */ = {
 			isa = PBXGroup;
 			children = (
+				3AE4337A14DCBBA60012D70A /* Silver.h */,
+				3AE4337B14DCBBA60012D70A /* SVBlock.h */,
+				3AE4337C14DCBBA60012D70A /* SVBlock.m */,
+				3AE4337D14DCBBA60012D70A /* SVBridgeSupport.h */,
+				3AE4337E14DCBBA60012D70A /* SVBridgeSupport.m */,
+				3AE4337F14DCBBA60012D70A /* SVExceptionSystem.h */,
+				3AE4338014DCBBA60012D70A /* SVExceptionSystem.m */,
+				3AE4338114DCBBA60012D70A /* SVFlowBlock.h */,
+				3AE4338214DCBBA60012D70A /* SVFlowBlock.m */,
+				3AE4338314DCBBA60012D70A /* SVFunction.h */,
+				3AE4338414DCBBA60012D70A /* SVFunction.m */,
+				3AE4338514DCBBA60012D70A /* SVNode.h */,
+				3AE4338614DCBBA60012D70A /* SVNode.m */,
 				3A960E5C13B05F390036B5FE /* NSObject+AssociatedObjects.h */,
 				3A960E5D13B05F390036B5FE /* NSObject+AssociatedObjects.m */,
 				3A0398FD139CA7E70065D102 /* SVVariableAssignment.h */,
 				3A0398FA139C9F1E0065D102 /* SVVariable.m */,
 				3AE1606813486C3A000AC7DF /* MABlockClosure.h */,
 				3AE1606913486C3A000AC7DF /* MABlockClosure.m */,
-				3A01000D12A9CFA8005A9772 /* SVBlock.h */,
-				3A01000E12A9CFA8005A9772 /* SVBlock.m */,
-				3A01000F12A9CFA8005A9772 /* SVBridgeSupport.h */,
-				3A01001012A9CFA8005A9772 /* SVBridgeSupport.m */,
-				3A01001312A9CFA8005A9772 /* Silver.h */,
-				3A01001412A9CFA8005A9772 /* SVExceptionSystem.h */,
-				3A01001512A9CFA8005A9772 /* SVExceptionSystem.m */,
-				3A01001612A9CFA8005A9772 /* SVFlowBlock.h */,
-				3A01001712A9CFA8005A9772 /* SVFlowBlock.m */,
-				3A01001812A9CFA8005A9772 /* SVFunction.h */,
-				3A01001912A9CFA8005A9772 /* SVFunction.m */,
-				3A01001A12A9CFA8005A9772 /* SVNode.h */,
-				3A01001B12A9CFA8005A9772 /* SVNode.m */,
 				3AC9340A1335CB51009CB7C6 /* silver.m */,
 				3AC934291335D002009CB7C6 /* SVMiscFunctions.h */,
 				3AC9342A1335D002009CB7C6 /* SVMiscFunctions.m */,
 				3AE88EFD139964C60001D84D /* svvm.m */,
 				3AEC11D814BCC0FF00D25677 /* SVRequireStatement.h */,
 				3AEC11D914BCC0FF00D25677 /* SVRequireStatement.m */,
+				3AE433D214DD64A90012D70A /* SVIncludeStatement.h */,
+				3AE433D314DD64A90012D70A /* SVIncludeStatement.m */,
 			);
 			path = Core;
 			sourceTree = "<group>";
 		3A01000A12A9CF4A005A9772 /* Operators */ = {
 			isa = PBXGroup;
 			children = (
-				3A01005D12A9D0AB005A9772 /* SVBinaryOperator.h */,
-				3A01005E12A9D0AB005A9772 /* SVBinaryOperator.m */,
-				3A01005F12A9D0AB005A9772 /* SVControlOperations.h */,
-				3A01006012A9D0AB005A9772 /* SVControlOperations.m */,
-				3A01006112A9D0AB005A9772 /* SVOperator.h */,
-				3A01006212A9D0AB005A9772 /* SVOperator.m */,
-				3A01006312A9D0AB005A9772 /* SVUnaryOperator.h */,
-				3A01006412A9D0AB005A9772 /* SVUnaryOperator.m */,
+				3AE4339414DCBBB70012D70A /* SVBinaryOperator.h */,
+				3AE4339514DCBBB70012D70A /* SVBinaryOperator.m */,
+				3AE4339614DCBBB70012D70A /* SVControlOperations.h */,
+				3AE4339714DCBBB70012D70A /* SVControlOperations.m */,
+				3AE4339814DCBBB70012D70A /* SVOperator.h */,
+				3AE4339914DCBBB70012D70A /* SVOperator.m */,
+				3AE4339A14DCBBB70012D70A /* SVUnaryOperator.h */,
+				3AE4339B14DCBBB70012D70A /* SVUnaryOperator.m */,
 			);
 			path = Operators;
 			sourceTree = "<group>";
 		3A01000B12A9CF5B005A9772 /* Parser */ = {
 			isa = PBXGroup;
 			children = (
+				3AE433A414DCBBC70012D70A /* SVParserContext.h */,
+				3AE433A514DCBBC70012D70A /* SVParserContext.m */,
+				3AE433A614DCBBC70012D70A /* SVSymbol.h */,
+				3AE433A714DCBBC70012D70A /* SVSymbol.m */,
+				3AE433A814DCBBC70012D70A /* SVSymbolTable.h */,
+				3AE433A914DCBBC70012D70A /* SVSymbolTable.m */,
 				3AC2F11B13A4355600069808 /* silver.lemon */,
-				3A01004A12A9D081005A9772 /* SVParserContext.h */,
-				3A01004B12A9D081005A9772 /* SVParserContext.m */,
-				3A01004C12A9D081005A9772 /* SVSymbol.h */,
-				3A01004D12A9D081005A9772 /* SVSymbol.m */,
-				3A01004E12A9D081005A9772 /* SVSymbolTable.h */,
-				3A01004F12A9D081005A9772 /* SVSymbolTable.m */,
 				3A0AD57C1399FFEA003B37B0 /* SVToken.h */,
 				3A0AD57D1399FFEA003B37B0 /* SVToken.m */,
 				3AAEC482139AC5F900E47B93 /* silver.rl */,
 		3A01000C12A9CF65005A9772 /* Types */ = {
 			isa = PBXGroup;
 			children = (
+				3AE433B014DCBBD70012D70A /* SVCategory.h */,
+				3AE433B114DCBBD70012D70A /* SVCategory.m */,
+				3AE433B214DCBBD70012D70A /* SVClass.h */,
+				3AE433B314DCBBD70012D70A /* SVClass.m */,
+				3AE433B414DCBBD70012D70A /* SVInstanceRef.h */,
+				3AE433B514DCBBD70012D70A /* SVInstanceRef.m */,
+				3AE433B614DCBBD70012D70A /* SVObjcBridgeTypes.h */,
+				3AE433B714DCBBD70012D70A /* SVObjcBridgeTypes.m */,
 				3A92C74713746D97000B7A76 /* core */,
-				3A01003312A9D05D005A9772 /* SVCategory.h */,
-				3A01003412A9D05D005A9772 /* SVCategory.m */,
-				3A01003512A9D05D005A9772 /* SVClass.h */,
-				3A01003612A9D05D005A9772 /* SVClass.m */,
-				3A01003912A9D05D005A9772 /* SVObjcBridgeTypes.h */,
-				3A01003A12A9D05D005A9772 /* SVObjcBridgeTypes.m */,
-				3A01003B12A9D05D005A9772 /* SVInstanceRef.h */,
-				3A01003C12A9D05D005A9772 /* SVInstanceRef.m */,
 				3A9EE90B13B11A2200AA8A94 /* SVProtocol.h */,
 				3A9EE90C13B11A2200AA8A94 /* SVProtocol.m */,
 				3AA2A0E513D606A5005A1B33 /* SVBuiltinRange.h */,
 				3AA2A0E613D606A5005A1B33 /* SVBuiltinRange.m */,
+				3AE433CE14DD5FFC0012D70A /* SVModule.h */,
+				3AE433CF14DD5FFC0012D70A /* SVModule.m */,
 			);
 			path = Types;
 			sourceTree = "<group>";
 		3A01FFD712A9CE70005A9772 /* Frameworks */ = {
 			isa = PBXGroup;
 			children = (
-				3AC5B7C813A7A33A00594730 /* OCLog.xcodeproj */,
+				3AE4326114DCB1060012D70A /* OCLog.xcodeproj */,
 				3A01FFDF12A9CE70005A9772 /* Cocoa.framework */,
 				3AC934151335CD57009CB7C6 /* Foundation.framework */,
 			);
 			children = (
 				3A1CC9E013841D48006F33D5 /* sv */,
 				3A7B0EF713818FA5001705C6 /* smelt */,
+				3AE4325E14DBF1280012D70A /* sdoc */,
 			);
 			path = tools;
 			sourceTree = "<group>";
 			path = enc;
 			sourceTree = "<group>";
 		};
-		3AC5B7C913A7A33A00594730 /* Products */ = {
+		3AE4326214DCB1060012D70A /* Products */ = {
 			isa = PBXGroup;
 			children = (
-				3AC5B7D013A7A33B00594730 /* OCLog.framework */,
+				3AE4326914DCB1070012D70A /* OCLog.framework */,
 			);
 			name = Products;
 			sourceTree = "<group>";
 			isa = PBXHeadersBuildPhase;
 			buildActionMask = 2147483647;
 			files = (
-				3A01002012A9CFA8005A9772 /* SVBlock.h in Headers */,
-				3A01002212A9CFA8005A9772 /* SVBridgeSupport.h in Headers */,
-				3A01002612A9CFA8005A9772 /* Silver.h in Headers */,
-				3A01002712A9CFA8005A9772 /* SVExceptionSystem.h in Headers */,
-				3A01002912A9CFA8005A9772 /* SVFlowBlock.h in Headers */,
-				3A01002B12A9CFA8005A9772 /* SVFunction.h in Headers */,
-				3A01002D12A9CFA8005A9772 /* SVNode.h in Headers */,
-				3A01003D12A9D05D005A9772 /* SVCategory.h in Headers */,
-				3A01003F12A9D05D005A9772 /* SVClass.h in Headers */,
-				3A01004312A9D05D005A9772 /* SVObjcBridgeTypes.h in Headers */,
-				3A01004512A9D05D005A9772 /* SVInstanceRef.h in Headers */,
-				3A01005512A9D081005A9772 /* SVParserContext.h in Headers */,
-				3A01005712A9D081005A9772 /* SVSymbol.h in Headers */,
-				3A01005912A9D081005A9772 /* SVSymbolTable.h in Headers */,
-				3A01006512A9D0AB005A9772 /* SVBinaryOperator.h in Headers */,
-				3A01006712A9D0AB005A9772 /* SVControlOperations.h in Headers */,
-				3A01006912A9D0AB005A9772 /* SVOperator.h in Headers */,
-				3A01006B12A9D0AB005A9772 /* SVUnaryOperator.h in Headers */,
 				3AC9342B1335D002009CB7C6 /* SVMiscFunctions.h in Headers */,
 				3A360F11133B7E2A00B85BE0 /* SVObjcExtensions.h in Headers */,
 				3A360F13133B7E2A00B85BE0 /* NSMutableArray+SVAdditions.h in Headers */,
 				3A9EE90D13B11A2200AA8A94 /* SVProtocol.h in Headers */,
 				3AA2A0E713D606A5005A1B33 /* SVBuiltinRange.h in Headers */,
 				3AEC11DA14BCC0FF00D25677 /* SVRequireStatement.h in Headers */,
+				3AE4338714DCBBA60012D70A /* Silver.h in Headers */,
+				3AE4338814DCBBA60012D70A /* SVBlock.h in Headers */,
+				3AE4338A14DCBBA60012D70A /* SVBridgeSupport.h in Headers */,
+				3AE4338C14DCBBA60012D70A /* SVExceptionSystem.h in Headers */,
+				3AE4338E14DCBBA60012D70A /* SVFlowBlock.h in Headers */,
+				3AE4339014DCBBA60012D70A /* SVFunction.h in Headers */,
+				3AE4339214DCBBA60012D70A /* SVNode.h in Headers */,
+				3AE4339C14DCBBB70012D70A /* SVBinaryOperator.h in Headers */,
+				3AE4339E14DCBBB70012D70A /* SVControlOperations.h in Headers */,
+				3AE433A014DCBBB70012D70A /* SVOperator.h in Headers */,
+				3AE433A214DCBBB70012D70A /* SVUnaryOperator.h in Headers */,
+				3AE433AA14DCBBC70012D70A /* SVParserContext.h in Headers */,
+				3AE433AC14DCBBC70012D70A /* SVSymbol.h in Headers */,
+				3AE433AE14DCBBC70012D70A /* SVSymbolTable.h in Headers */,
+				3AE433B814DCBBD70012D70A /* SVCategory.h in Headers */,
+				3AE433BA14DCBBD70012D70A /* SVClass.h in Headers */,
+				3AE433BC14DCBBD70012D70A /* SVInstanceRef.h in Headers */,
+				3AE433BE14DCBBD70012D70A /* SVObjcBridgeTypes.h in Headers */,
+				3AE433D014DD5FFC0012D70A /* SVModule.h in Headers */,
+				3AE433D414DD64A90012D70A /* SVIncludeStatement.h in Headers */,
 			);
 			runOnlyForDeploymentPostprocessing = 0;
 		};
 				3A8D7FFD139B4D7C00CB5259 /* PBXBuildRule */,
 			);
 			dependencies = (
-				3AC5B7E713A7A6A900594730 /* PBXTargetDependency */,
+				3AE4326B14DCB1100012D70A /* PBXTargetDependency */,
 			);
 			name = Silver;
 			productName = Silver;
 			projectDirPath = "";
 			projectReferences = (
 				{
-					ProductGroup = 3AC5B7C913A7A33A00594730 /* Products */;
-					ProjectRef = 3AC5B7C813A7A33A00594730 /* OCLog.xcodeproj */;
+					ProductGroup = 3AE4326214DCB1060012D70A /* Products */;
+					ProjectRef = 3AE4326114DCB1060012D70A /* OCLog.xcodeproj */;
 				},
 			);
 			projectRoot = "";
 /* End PBXProject section */
 
 /* Begin PBXReferenceProxy section */
-		3AC5B7D013A7A33B00594730 /* OCLog.framework */ = {
+		3AE4326914DCB1070012D70A /* OCLog.framework */ = {
 			isa = PBXReferenceProxy;
 			fileType = wrapper.framework;
 			path = OCLog.framework;
-			remoteRef = 3AC5B7CF13A7A33B00594730 /* PBXContainerItemProxy */;
+			remoteRef = 3AE4326814DCB1070012D70A /* PBXContainerItemProxy */;
 			sourceTree = BUILT_PRODUCTS_DIR;
 		};
 /* End PBXReferenceProxy section */
 				3A6E425C1388BC1B00138ABA /* dylib.sv in Resources */,
 				3AD8EC6B1396056200D5645A /* ruby.sv in Resources */,
 				3AE88EFB139964100001D84D /* core.sv in Resources */,
+				3AE4325F14DBF1280012D70A /* sdoc in Resources */,
 			);
 			runOnlyForDeploymentPostprocessing = 0;
 		};
 			isa = PBXSourcesBuildPhase;
 			buildActionMask = 2147483647;
 			files = (
-				3A01002112A9CFA8005A9772 /* SVBlock.m in Sources */,
-				3A01002312A9CFA8005A9772 /* SVBridgeSupport.m in Sources */,
-				3A01002812A9CFA8005A9772 /* SVExceptionSystem.m in Sources */,
-				3A01002A12A9CFA8005A9772 /* SVFlowBlock.m in Sources */,
-				3A01002C12A9CFA8005A9772 /* SVFunction.m in Sources */,
-				3A01002E12A9CFA8005A9772 /* SVNode.m in Sources */,
-				3A01003E12A9D05D005A9772 /* SVCategory.m in Sources */,
-				3A01004012A9D05D005A9772 /* SVClass.m in Sources */,
-				3A01004412A9D05D005A9772 /* SVObjcBridgeTypes.m in Sources */,
-				3A01004612A9D05D005A9772 /* SVInstanceRef.m in Sources */,
-				3A01005612A9D081005A9772 /* SVParserContext.m in Sources */,
-				3A01005812A9D081005A9772 /* SVSymbol.m in Sources */,
-				3A01005A12A9D081005A9772 /* SVSymbolTable.m in Sources */,
-				3A01006612A9D0AB005A9772 /* SVBinaryOperator.m in Sources */,
-				3A01006812A9D0AB005A9772 /* SVControlOperations.m in Sources */,
-				3A01006A12A9D0AB005A9772 /* SVOperator.m in Sources */,
-				3A01006C12A9D0AB005A9772 /* SVUnaryOperator.m in Sources */,
 				3AC9342C1335D002009CB7C6 /* SVMiscFunctions.m in Sources */,
 				3A360F12133B7E2A00B85BE0 /* SVObjcExtensions.m in Sources */,
 				3A360F14133B7E2A00B85BE0 /* NSMutableArray+SVAdditions.m in Sources */,
 				3A9EE90E13B11A2200AA8A94 /* SVProtocol.m in Sources */,
 				3AA2A0E813D606A5005A1B33 /* SVBuiltinRange.m in Sources */,
 				3AEC11DB14BCC0FF00D25677 /* SVRequireStatement.m in Sources */,
+				3AE4338914DCBBA60012D70A /* SVBlock.m in Sources */,
+				3AE4338B14DCBBA60012D70A /* SVBridgeSupport.m in Sources */,
+				3AE4338D14DCBBA60012D70A /* SVExceptionSystem.m in Sources */,
+				3AE4338F14DCBBA60012D70A /* SVFlowBlock.m in Sources */,
+				3AE4339114DCBBA60012D70A /* SVFunction.m in Sources */,
+				3AE4339314DCBBA60012D70A /* SVNode.m in Sources */,
+				3AE4339D14DCBBB70012D70A /* SVBinaryOperator.m in Sources */,
+				3AE4339F14DCBBB70012D70A /* SVControlOperations.m in Sources */,
+				3AE433A114DCBBB70012D70A /* SVOperator.m in Sources */,
+				3AE433A314DCBBB70012D70A /* SVUnaryOperator.m in Sources */,
+				3AE433AB14DCBBC70012D70A /* SVParserContext.m in Sources */,
+				3AE433AD14DCBBC70012D70A /* SVSymbol.m in Sources */,
+				3AE433AF14DCBBC70012D70A /* SVSymbolTable.m in Sources */,
+				3AE433B914DCBBD70012D70A /* SVCategory.m in Sources */,
+				3AE433BB14DCBBD70012D70A /* SVClass.m in Sources */,
+				3AE433BD14DCBBD70012D70A /* SVInstanceRef.m in Sources */,
+				3AE433BF14DCBBD70012D70A /* SVObjcBridgeTypes.m in Sources */,
+				3AE433D114DD5FFC0012D70A /* SVModule.m in Sources */,
+				3AE433D514DD64A90012D70A /* SVIncludeStatement.m in Sources */,
 			);
 			runOnlyForDeploymentPostprocessing = 0;
 		};
 			target = 3A01FFEB12A9CE70005A9772 /* SilverTests */;
 			targetProxy = 3A7E2C5313AAB5BD00D5BE98 /* PBXContainerItemProxy */;
 		};
-		3AC5B7E713A7A6A900594730 /* PBXTargetDependency */ = {
+		3AE4326B14DCB1100012D70A /* PBXTargetDependency */ = {
 			isa = PBXTargetDependency;
 			name = OCLog;
-			targetProxy = 3AC5B7E613A7A6A900594730 /* PBXContainerItemProxy */;
+			targetProxy = 3AE4326A14DCB1100012D70A /* PBXContainerItemProxy */;
 		};
 /* End PBXTargetDependency section */
 

Tests/SVClassSystemTests.m

         "def task(__x,&body) {"
         "  name='';deps=[];"
         "  if(__x.is?(:NSDictionary)) {"
-        "    name = __x.allKeys[0];"
+        "    name = __x::[0];"
         "    deps = __x[name];"
         "    if(!deps.is?(:NSArray)) { deps = [deps]; };"
         "  } else {"
     P(var);
     assertThat(var,is(equalTo(N(30))));
 }
+
+-(void) testModule {
+    PC(@"module TestModule { def testModuleFunc(x) { return x*2; }; }; class ModuleTestClass { include TestModule; }; x = ModuleTestClass.alloc.init; x.testModuleFunc(10);");
+    P(var);
+    
+    assertThat(var,is(equalTo(N(20))));
+}
 @end

Tests/SVFunctionTests.m

 }
 
 -(void) testEval2 {
-    PC(@"n = 'x = 3'; eval(n); x + 4;");
+    PC(@"n = 'x = 3;'; eval(n); x + 4;");
     P(var);
     assertThat(var,is(equalTo(N(7))));
 }
 
 -(void) testForeachDefined {
     PC(@"def foreach(__d,&body) {" 
-        "   var = __d.allKeys[0];" 
+        "   var = __d::[0];" 
         "   arr = __d[var];"
         "   for(i = 0; i < arr.count; i+=1) {" 
         "       eval('#{var} = arr[i]; body();');" 
     
     assertThat(var,is(equalTo([NSArray arrayWithObjects:N(10),N(4),N(2),nil])));
 }
+
+-(void) testAttachCommentFunction {
+    PC(@"//* @desc:[This function returns a multiple of 10.] @arg(x):[This argument specifies which multiple to return.] */ def mul10(x) { return x*10; };");
+    SVBlock* node = [context parse];
+    SVFunction* func = [node.statements objectAtIndex:0];
+    assertThat(func.comments,is(equalTo(@" @desc:[This function returns a multiple of 10.] @arg(x):[This argument specifies which multiple to return.] ")));
+}
+
+-(void) testSdocQuickTest {
+    PC(@"class SDocNode { def init { @desc = ''; @args = {}; self; }; };"
+       "def sdoc(node) { n = SDocNode.alloc.init; n.instance_eval(node); n; };"
+       "code = <<-CODE @desc='This function returns a multiple of 10.'; @args['x']='This argument specifies which multiple to return.'; CODE;"
+       "n = sdoc(code);"
+       "[n.desc,n.args];"
+       );
+    
+    P(var);
+    assertThat(var,is(equalTo([NSArray arrayWithObjects:@"This function returns a multiple of 10.",[NSDictionary dictionaryWithObjectsAndKeys:@"This argument specifies which multiple to return.",@"x",nil],nil])));
+}
+
+-(void) testSdocQuickTest2 {
+    PC(@"//* @desc:[Test method] @arg(x):[Test argument] */ def test(x) { x + 10; };");
+    
+    SVFunction* func = [[[context parse] statements] objectAtIndex:0];
+    assertThat(func.comments,is(equalTo(@" @desc:[Test method] @arg(x):[Test argument] ")));
+    assertThat(func.name,is(equalTo(@"test")));
+    assertThat(func.arguments,is(equalTo([NSArray arrayWithObjects:[SVFunctionArgument argumentWithName:@"x"],nil])));
+}
+
+-(void) testDynamicScope {
+    PC(@"def add() { x + 5; }; x = 5; y = add(); x = 10; z = add(); [y,z];");
+    P(var);
+    assertThat(var,is(equalTo([NSArray arrayWithObjects:N(10),N(15),nil])));
+}
 @end
 
     def instance_eval(n) {
         def node(s) { SVNode.createNodeFromSource(s); };
-        b = node(n);
-        nd = b.statements[0];
+
+        nd = node(n);
+        nd = nd.statements[0] if nd.statements.count == 1;
+        
         c = { '_SVParentContext' => $:, '__SV_IN_OBJECT' => YES, '__SV_OBJECT_CLASS' => self.class };
         c.createSymbolTable;
         t = c.symbolTable;
         sl = t.symbolWithName('self');
-        sl.value = self;
         sp = t.symbolWithName('super');
-        sp.value = self;
-        nd.evaluateWithContext(c);
+        sp.value = sl.value = self;
+        nd.evaluateWithContext( c );
     };
 }
 
         return self.objectForKey(k)
     }
 
+    def :: {
+        return self.allKeys
+    }
+    
     def k(i) {
         return self.allKeys[i]
     }
     }
 }
 
+module SVDynamicIvarKeyValueSupport {
+    def setValue(value,forUndefinedKey:key) {
+        eval('@#{key} = #{value};');
+    };
+    
+    def valueForUndefinedKey(key) {
+        eval('@#{key}');
+    };
+};
 
 def isNode?(n) { return n.isKindOfClass(SVNode.class); };
 
-def eval(n) { nslog(n); def node(s) { SVNode.createNodeFromSource(s); }; b = node(n); return b.evaluateWithContext($:); };
+def eval(n) { def node(s) { SVNode.createNodeFromSource(s); }; b = node(n); return b.evaluateWithContext($:); };
+#!/usr/bin/env silver
+
+// Documentation Generator for Silver
+
+class SilverDocNode {
+    def init {
+        @desc = '';
+}