Просмотр исходного кода

Function name use objc-selector style, paragraph support argument label, support call objc method

xcbosa mbp16 2 лет назад
Родитель
Сommit
adae4bc3c9
33 измененных файлов с 1353 добавлено и 52 удалено
  1. 214 0
      Interop/Invocation.swift
  2. 125 0
      Interop/TypeMapping.swift
  3. 9 0
      TestApp/RootViewController.m
  4. 16 0
      XCTreeLang.xcodeproj/project.pbxproj
  5. 792 30
      XCTreeLang.xcodeproj/xcuserdata/xcbosa.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist
  6. 1 0
      XCTreeLang/InitializerImpl/XCTLViewController.swift
  7. 4 0
      XCTreeLang/Lex/XCTLLexer.swift
  8. 2 0
      XCTreeLang/Lex/XCTLTokenType.swift
  9. 2 0
      XCTreeLang/Runtime/Type/Instance/XCTLRuntimeTypeInstance.h
  10. 11 0
      XCTreeLang/Runtime/Type/Instance/XCTLRuntimeTypeInstance.m
  11. 25 13
      XCTreeLang/Runtime/XCTLRuntimeContext.swift
  12. 4 4
      XCTreeLang/Runtime/XCTLRuntimeVariable.swift
  13. 2 0
      XCTreeLang/Statements/XCTLBreakStatement.swift
  14. 2 0
      XCTreeLang/Statements/XCTLContinueStatement.swift
  15. 2 0
      XCTreeLang/Statements/XCTLElseStatement.swift
  16. 2 0
      XCTreeLang/Statements/XCTLEqualthanStatement.swift
  17. 2 0
      XCTreeLang/Statements/XCTLExportStatement.swift
  18. 2 0
      XCTreeLang/Statements/XCTLForStatement.swift
  19. 37 1
      XCTreeLang/Statements/XCTLFunctionCallStatement.swift
  20. 2 0
      XCTreeLang/Statements/XCTLImmediateStatement.swift
  21. 2 0
      XCTreeLang/Statements/XCTLImportStatement.swift
  22. 2 0
      XCTreeLang/Statements/XCTLInitStatement.swift
  23. 2 0
      XCTreeLang/Statements/XCTLLazyEqualStatement.swift
  24. 2 0
      XCTreeLang/Statements/XCTLLessthanStatement.swift
  25. 2 0
      XCTreeLang/Statements/XCTLMorethanStatement.swift
  26. 2 0
      XCTreeLang/Statements/XCTLNextthanStatement.swift
  27. 29 0
      XCTreeLang/Statements/XCTLParagraphStatement.swift
  28. 2 0
      XCTreeLang/Statements/XCTLReturnStatement.swift
  29. 2 0
      XCTreeLang/Statements/XCTLRootStatement.swift
  30. 2 0
      XCTreeLang/Statements/XCTLSetStatement.swift
  31. 2 0
      XCTreeLang/Statements/XCTLSwitchStatement.swift
  32. 46 4
      XCTreeLang/Statements/XCTLVariableRefStatement.swift
  33. 2 0
      XCTreeLang/XCTLCompileTimeError.swift

+ 214 - 0
Interop/Invocation.swift

@@ -0,0 +1,214 @@
+//
+//  Dynamic
+//  Created by Mhd Hejazi on 4/15/20.
+//  Copyright © 2020 Samabox. All rights reserved.
+//
+
+import Foundation
+
+class Invocation {
+    public static var loggingEnabled: Bool = false
+
+    private let target: NSObject
+    private let selector: Selector
+
+    var invocation: NSObject?
+
+    var numberOfArguments: Int = 0
+    var returnLength: Int = 0
+    var returnType: UnsafePointer<CChar>?
+    var returnTypeString: String? {
+        guard let returnType = returnType else { return nil }
+        return String(cString: returnType)
+    }
+    var returnsObject: Bool {
+        /// `@` is the type encoding for an object
+        returnTypeString == "@"
+    }
+    var returnsAny: Bool {
+        /// `v` is the type encoding for Void
+        returnTypeString != "v"
+    }
+    lazy var returnedObject: AnyObject? = {
+        returnedObjectValue()
+    }()
+    private(set) var isInvoked: Bool = false
+
+    init(target: NSObject, selector: Selector) throws {
+        self.target = target
+        self.selector = selector
+        try initialize()
+    }
+
+    private func initialize() throws {
+        /// `NSMethodSignature *methodSignature = [target methodSignatureForSelector: selector]`
+        let methodSignature: NSObject
+        do {
+            let selector = NSSelectorFromString("methodSignatureForSelector:")
+            let signature = (@convention(c)(NSObject, Selector, Selector) -> Any).self
+            let method = unsafeBitCast(target.method(for: selector), to: signature)
+            guard let result = method(target, selector, self.selector) as? NSObject else {
+                let error = InvocationError.unrecognizedSelector(type(of: target), self.selector)
+                throw error
+            }
+            methodSignature = result
+        }
+
+        /// `numberOfArguments = methodSignature.numberOfArguments`
+        self.numberOfArguments = methodSignature.value(forKeyPath: "numberOfArguments") as? Int ?? 0
+
+        /// `methodReturnLength = methodSignature.methodReturnLength`
+        self.returnLength = methodSignature.value(forKeyPath: "methodReturnLength") as? Int ?? 0
+
+        /// `methodReturnType = methodSignature.methodReturnType`
+        let methodReturnType: UnsafePointer<CChar>
+        do {
+            let selector = NSSelectorFromString("methodReturnType")
+            let signature = (@convention(c)(NSObject, Selector) -> UnsafePointer<CChar>).self
+            let method = unsafeBitCast(methodSignature.method(for: selector), to: signature)
+            methodReturnType = method(methodSignature, selector)
+        }
+        self.returnType = methodReturnType
+
+        /// `NSInvocation *invocation = [NSInvocation invocationWithMethodSignature: methodSignature]`
+        let invocation: NSObject
+        do {
+            let NSInvocation = NSClassFromString("NSInvocation") as AnyObject
+            let selector = NSSelectorFromString("invocationWithMethodSignature:")
+            let signature = (@convention(c)(AnyObject, Selector, AnyObject) -> AnyObject).self
+            let method = unsafeBitCast(NSInvocation.method(for: selector), to: signature)
+            guard let result = method(NSInvocation, selector, methodSignature) as? NSObject else {
+                let error = InvocationError.unrecognizedSelector(type(of: target), self.selector)
+                throw error
+            }
+            invocation = result
+        }
+        self.invocation = invocation
+
+        /// `invocation.selector = selector`
+        do {
+            let selector = NSSelectorFromString("setSelector:")
+            let signature = (@convention(c)(NSObject, Selector, Selector) -> Void).self
+            let method = unsafeBitCast(invocation.method(for: selector), to: signature)
+            method(invocation, selector, self.selector)
+        }
+
+        /// `[invocation retainArguments]`
+        do {
+            let selector = NSSelectorFromString("retainArguments")
+            let signature = (@convention(c)(NSObject, Selector) -> Void).self
+            let method = unsafeBitCast(invocation.method(for: selector), to: signature)
+            method(invocation, selector)
+        }
+    }
+
+    func setArgument(_ argument: Any?, at index: NSInteger) {
+        guard let invocation = invocation else { return }
+
+        /// `[invocation setArgument:&argument atIndex:i + 2]`
+        let selector = NSSelectorFromString("setArgument:atIndex:")
+        let signature = (@convention(c)(NSObject, Selector, UnsafeRawPointer, Int) -> Void).self
+        let method = unsafeBitCast(invocation.method(for: selector), to: signature)
+
+        if var valueArgument = argument as? NSValue {
+            /// Get the type byte size
+//            valueArgument = NSNumber(floatLiteral: argument as! Double)
+            let typeSize = UnsafeMutablePointer<Int>.allocate(capacity: 1)
+            defer { typeSize.deallocate() }
+            NSGetSizeAndAlignment(valueArgument.objCType, typeSize, nil)
+
+            /// Get the actual value
+            let buffer = UnsafeMutablePointer<Int8>.allocate(capacity: typeSize.pointee)
+            defer { buffer.deallocate() }
+            valueArgument.getValue(buffer)
+
+            method(invocation, selector, buffer, index)
+        } else {
+            withUnsafePointer(to: argument) { pointer in
+                method(invocation, selector, pointer, index)
+            }
+        }
+    }
+
+    func invoke() {
+        guard let invocation = invocation, !isInvoked else { return }
+
+        isInvoked = true
+
+        /// `[invocation invokeWithTarget: target]`
+        do {
+            let selector = NSSelectorFromString("invokeWithTarget:")
+            let signature = (@convention(c)(NSObject, Selector, AnyObject) -> Void).self
+            let method = unsafeBitCast(invocation.method(for: selector), to: signature)
+            method(invocation, selector, target)
+        }
+    }
+
+    func getReturnValue<T>(result: inout T) {
+        guard let invocation = invocation else { return }
+
+        /// `[invocation getReturnValue: returnValue]`
+        do {
+            let selector = NSSelectorFromString("getReturnValue:")
+            let signature = (@convention(c)(NSObject, Selector, UnsafeMutableRawPointer) -> Void).self
+            let method = unsafeBitCast(invocation.method(for: selector), to: signature)
+            withUnsafeMutablePointer(to: &result) { pointer in
+                method(invocation, selector, pointer)
+            }
+        }
+    }
+
+    private func returnedObjectValue() -> AnyObject? {
+        guard returnsObject, returnLength > 0 else {
+            return nil
+        }
+
+        var result: AnyObject?
+
+        getReturnValue(result: &result)
+
+        guard let object = result else {
+            return nil
+        }
+
+        /// Take the ownership of the initialized objects to ensure they're deallocated properly.
+        if isRetainingMethod() {
+            return Unmanaged.passRetained(object).takeRetainedValue()
+        }
+
+        /// `NSInvocation.getReturnValue()` doesn't give us the ownership of the returned object, but the compiler
+        /// tries to release this object anyway. So, we are retaining it to balance with the compiler's release.
+        return Unmanaged.passRetained(object).takeUnretainedValue()
+    }
+
+    private func isRetainingMethod() -> Bool {
+        /// Refer to: https://bit.ly/308okXm
+        let selector = NSStringFromSelector(self.selector)
+        return selector == "alloc" ||
+            selector.hasPrefix("new") ||
+            selector.hasPrefix("copy") ||
+            selector.hasPrefix("mutableCopy")
+    }
+}
+
+internal enum InvocationError: CustomNSError {
+    case unrecognizedSelector(_ classType: AnyClass, _ selector: Selector)
+
+    internal static var errorDomain: String { String(describing: Invocation.self) }
+
+    internal var errorCode: Int {
+        switch self {
+        case .unrecognizedSelector:
+            return 404
+        }
+    }
+
+    internal var errorUserInfo: [String: Any] {
+        var message: String
+        switch self {
+        case .unrecognizedSelector(let classType, let selector):
+            message = "'\(String(describing: classType))' doesn't recognize selector '\(selector)'"
+        }
+        return [NSLocalizedDescriptionKey: message]
+    }
+}

+ 125 - 0
Interop/TypeMapping.swift

@@ -0,0 +1,125 @@
+//
+//  Dynamic
+//  Created by Mhd Hejazi on 4/18/20.
+//  Copyright © 2020 Samabox. All rights reserved.
+//
+
+// swiftlint:disable cyclomatic_complexity syntactic_sugar
+
+import Foundation
+
+/// The type mapping table can be found here:
+///   https://developer.apple.com/documentation/swift/imported_c_and_objective-c_apis/working_with_foundation_types
+class TypeMapping {
+    private static let typePairs: [(swiftType: Any.Type, objCType: AnyObject.Type)] = [
+        (Array<Any>.self, NSArray.self),
+        (Calendar.self, NSCalendar.self),
+        (CharacterSet.self, NSCharacterSet.self),
+        (Data.self, NSData.self),
+        (DateComponents.self, NSDateComponents.self),
+        (DateInterval.self, NSDateInterval.self),
+        (Date.self, NSDate.self),
+        (Decimal.self, NSDecimalNumber.self),
+        (Dictionary<AnyHashable, Any>.self, NSDictionary.self),
+        (IndexPath.self, NSIndexPath.self),
+        (IndexSet.self, NSIndexSet.self),
+        (Locale.self, NSLocale.self),
+        (Notification.self, NSNotification.self),
+        (PersonNameComponents.self, NSPersonNameComponents.self),
+        (Set<AnyHashable>.self, NSSet.self),
+        (String.self, NSString.self),
+        (TimeZone.self, NSTimeZone.self),
+        (URL.self, NSURL.self),
+        (URLComponents.self, NSURLComponents.self),
+        (URLQueryItem.self, NSURLQueryItem.self),
+        (URLRequest.self, NSURLRequest.self),
+        (UUID.self, NSUUID.self)
+    ]
+
+    private static let swiftToObjCTypes: [ObjectIdentifier: AnyObject.Type] = {
+        let pairs = typePairs.map {
+            (ObjectIdentifier($0.swiftType), $0.objCType)
+        }
+        return [ObjectIdentifier: AnyObject.Type](uniqueKeysWithValues: pairs)
+    }()
+
+    private static let objCToSwiftTypes: [ObjectIdentifier: Any.Type] = {
+        let pairs = typePairs.map {
+            (ObjectIdentifier($0.objCType), $0.swiftType)
+        }
+        return [ObjectIdentifier: Any.Type](uniqueKeysWithValues: pairs)
+    }()
+
+    static func swiftType(for type: Any.Type) -> Any.Type? {
+        objCToSwiftTypes[ObjectIdentifier(type)]
+    }
+
+    static func objCType(for type: Any.Type) -> Any.Type? {
+        swiftToObjCTypes[ObjectIdentifier(type)]
+    }
+
+    static func mappedType(for type: Any.Type) -> Any.Type? {
+        swiftType(for: type) ?? objCType(for: type)
+    }
+
+    static func convertToObjCType(_ object: Any?) -> Any? {
+        switch object {
+        case is Array<Any>: return object as? NSArray
+        case is Calendar: return object as? NSCalendar
+        case is CharacterSet: return object as? NSCharacterSet
+        case is Data: return object as? NSData
+        case is DateComponents: return object as? NSDateComponents
+        case is DateInterval: return object as? NSDateInterval
+        case is Date: return object as? NSDate
+        case is Decimal: return object as? NSDecimalNumber
+        case is Dictionary<AnyHashable, Any>: return object as? NSDictionary
+        case is IndexPath: return object as? NSIndexPath
+        case is IndexSet: return object as? NSIndexSet
+        case is Locale: return object as? NSLocale
+        case is Notification: return object as? NSNotification
+        case is PersonNameComponents: return object as? NSPersonNameComponents
+        case is Set<AnyHashable>: return object as? NSSet
+        case is String: return object as? NSString
+        case is TimeZone: return object as? NSTimeZone
+        case is URL: return object as? NSURL
+        case is URLComponents: return object as? NSURLComponents
+        case is URLQueryItem: return object as? NSURLQueryItem
+        case is URLRequest: return object as? NSURLRequest
+        case is UUID: return object as? NSUUID
+        default: return nil
+        }
+    }
+
+    static func convertToSwiftType(_ object: Any?) -> Any? {
+        switch object {
+        case is NSArray: return object as? Array<Any>
+        case is NSCalendar: return object as? Calendar
+        case is NSCharacterSet: return object as? CharacterSet
+        case is NSData: return object as? Data
+        case is NSDateComponents: return object as? DateComponents
+        case is NSDateInterval: return object as? DateInterval
+        case is NSDate: return object as? Date
+        case is NSDecimalNumber: return object as? Decimal
+        case is NSDictionary: return object as? Dictionary<AnyHashable, Any>
+        case is NSIndexPath: return object as? IndexPath
+        case is NSIndexSet: return object as? IndexSet
+        case is NSLocale: return object as? Locale
+        case is NSMeasurement: return object as? Measurement
+        case is NSNotification: return object as? Notification
+        case is NSPersonNameComponents: return object as? PersonNameComponents
+        case is NSSet: return object as? Set<AnyHashable>
+        case is NSString: return object as? String
+        case is NSTimeZone: return object as? TimeZone
+        case is NSURL: return object as? URL
+        case is NSURLComponents: return object as? URLComponents
+        case is NSURLQueryItem: return object as? URLQueryItem
+        case is NSURLRequest: return object as? URLRequest
+        case is NSUUID: return object as? UUID
+        default: return nil
+        }
+    }
+
+    static func convertType(of object: Any?) -> Any? {
+        convertToObjCType(object) ?? convertToSwiftType(object)
+    }
+}

+ 9 - 0
TestApp/RootViewController.m

@@ -19,10 +19,19 @@ char *kRootViewControllerKVOKey = "kRootViewControllerKVOKey";
 @property (nonatomic, strong) UIViewController *previewViewController;
 @property (nonatomic, strong) UIViewController *previewViewController;
 @property (nonatomic, copy) NSArray<NSLayoutConstraint *> *previewConstraints;
 @property (nonatomic, copy) NSArray<NSLayoutConstraint *> *previewConstraints;
 
 
+@property (nonatomic, strong) UIView *testView;
+
 @end
 @end
 
 
 @implementation RootViewController
 @implementation RootViewController
 
 
+- (UIView *)testView {
+    if (!_testView) {
+        _testView = [[UIButton alloc] initWithFrame:CGRectMake(100, 100, 100, 100)];
+    }
+    return _testView;
+}
+
 - (void)viewDidLoad {
 - (void)viewDidLoad {
     [self.view addSubview:self.sourceTextView];
     [self.view addSubview:self.sourceTextView];
     [self.view addSubview:self.terminalTextView];
     [self.view addSubview:self.terminalTextView];

+ 16 - 0
XCTreeLang.xcodeproj/project.pbxproj

@@ -61,6 +61,8 @@
 		756916A72A28FF3D005FF14B /* module.modulemap in Sources */ = {isa = PBXBuildFile; fileRef = 756916A62A28FF3D005FF14B /* module.modulemap */; };
 		756916A72A28FF3D005FF14B /* module.modulemap in Sources */ = {isa = PBXBuildFile; fileRef = 756916A62A28FF3D005FF14B /* module.modulemap */; };
 		756916AA2A29A0B8005FF14B /* XCTLPrefixExpression.swift in Sources */ = {isa = PBXBuildFile; fileRef = 756916A92A29A0B8005FF14B /* XCTLPrefixExpression.swift */; };
 		756916AA2A29A0B8005FF14B /* XCTLPrefixExpression.swift in Sources */ = {isa = PBXBuildFile; fileRef = 756916A92A29A0B8005FF14B /* XCTLPrefixExpression.swift */; };
 		756916AC2A29A357005FF14B /* XCTLExpression.swift in Sources */ = {isa = PBXBuildFile; fileRef = 756916AB2A29A357005FF14B /* XCTLExpression.swift */; };
 		756916AC2A29A357005FF14B /* XCTLExpression.swift in Sources */ = {isa = PBXBuildFile; fileRef = 756916AB2A29A357005FF14B /* XCTLExpression.swift */; };
+		756916AF2A29CD2C005FF14B /* Invocation.swift in Sources */ = {isa = PBXBuildFile; fileRef = 756916AE2A29CD2C005FF14B /* Invocation.swift */; };
+		756916B12A29D74E005FF14B /* TypeMapping.swift in Sources */ = {isa = PBXBuildFile; fileRef = 756916B02A29D74E005FF14B /* TypeMapping.swift */; };
 /* End PBXBuildFile section */
 /* End PBXBuildFile section */
 
 
 /* Begin PBXContainerItemProxy section */
 /* Begin PBXContainerItemProxy section */
@@ -146,6 +148,8 @@
 		756916A62A28FF3D005FF14B /* module.modulemap */ = {isa = PBXFileReference; lastKnownFileType = "sourcecode.module-map"; path = module.modulemap; sourceTree = "<group>"; };
 		756916A62A28FF3D005FF14B /* module.modulemap */ = {isa = PBXFileReference; lastKnownFileType = "sourcecode.module-map"; path = module.modulemap; sourceTree = "<group>"; };
 		756916A92A29A0B8005FF14B /* XCTLPrefixExpression.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = XCTLPrefixExpression.swift; sourceTree = "<group>"; };
 		756916A92A29A0B8005FF14B /* XCTLPrefixExpression.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = XCTLPrefixExpression.swift; sourceTree = "<group>"; };
 		756916AB2A29A357005FF14B /* XCTLExpression.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = XCTLExpression.swift; sourceTree = "<group>"; };
 		756916AB2A29A357005FF14B /* XCTLExpression.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = XCTLExpression.swift; sourceTree = "<group>"; };
+		756916AE2A29CD2C005FF14B /* Invocation.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Invocation.swift; sourceTree = "<group>"; };
+		756916B02A29D74E005FF14B /* TypeMapping.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TypeMapping.swift; sourceTree = "<group>"; };
 /* End PBXFileReference section */
 /* End PBXFileReference section */
 
 
 /* Begin PBXFrameworksBuildPhase section */
 /* Begin PBXFrameworksBuildPhase section */
@@ -171,6 +175,7 @@
 			isa = PBXGroup;
 			isa = PBXGroup;
 			children = (
 			children = (
 				7520C3DC2A283AFC0010E7F8 /* XCTreeLang */,
 				7520C3DC2A283AFC0010E7F8 /* XCTreeLang */,
+				756916AD2A29CD1A005FF14B /* Interop */,
 				7520C43F2A283CA70010E7F8 /* TestApp */,
 				7520C43F2A283CA70010E7F8 /* TestApp */,
 				7520C3DB2A283AFC0010E7F8 /* Products */,
 				7520C3DB2A283AFC0010E7F8 /* Products */,
 				756916782A283E78005FF14B /* Frameworks */,
 				756916782A283E78005FF14B /* Frameworks */,
@@ -327,6 +332,15 @@
 			path = Instance;
 			path = Instance;
 			sourceTree = "<group>";
 			sourceTree = "<group>";
 		};
 		};
+		756916AD2A29CD1A005FF14B /* Interop */ = {
+			isa = PBXGroup;
+			children = (
+				756916AE2A29CD2C005FF14B /* Invocation.swift */,
+				756916B02A29D74E005FF14B /* TypeMapping.swift */,
+			);
+			path = Interop;
+			sourceTree = "<group>";
+		};
 /* End PBXGroup section */
 /* End PBXGroup section */
 
 
 /* Begin PBXHeadersBuildPhase section */
 /* Begin PBXHeadersBuildPhase section */
@@ -448,6 +462,7 @@
 				7520C4352A283B1E0010E7F8 /* XCTLRuntimeContext.swift in Sources */,
 				7520C4352A283B1E0010E7F8 /* XCTLRuntimeContext.swift in Sources */,
 				7520C4272A283B1E0010E7F8 /* XCTLFunctionCallStatement.swift in Sources */,
 				7520C4272A283B1E0010E7F8 /* XCTLFunctionCallStatement.swift in Sources */,
 				7520C41B2A283B1E0010E7F8 /* XCTLTokenType.swift in Sources */,
 				7520C41B2A283B1E0010E7F8 /* XCTLTokenType.swift in Sources */,
+				756916AF2A29CD2C005FF14B /* Invocation.swift in Sources */,
 				7520C4322A283B1E0010E7F8 /* XCTLRuntimeSubContext.swift in Sources */,
 				7520C4322A283B1E0010E7F8 /* XCTLRuntimeSubContext.swift in Sources */,
 				7520C42F2A283B1E0010E7F8 /* XCTLGenerateProtocol.swift in Sources */,
 				7520C42F2A283B1E0010E7F8 /* XCTLGenerateProtocol.swift in Sources */,
 				756916952A28C622005FF14B /* XCTLForStatement.swift in Sources */,
 				756916952A28C622005FF14B /* XCTLForStatement.swift in Sources */,
@@ -464,6 +479,7 @@
 				7520C4222A283B1E0010E7F8 /* XCTLInitStatement.swift in Sources */,
 				7520C4222A283B1E0010E7F8 /* XCTLInitStatement.swift in Sources */,
 				756916872A2851DF005FF14B /* XCTLStream.swift in Sources */,
 				756916872A2851DF005FF14B /* XCTLStream.swift in Sources */,
 				756916A22A28FE20005FF14B /* XCTLRuntimeTypeInstance.m in Sources */,
 				756916A22A28FE20005FF14B /* XCTLRuntimeTypeInstance.m in Sources */,
+				756916B12A29D74E005FF14B /* TypeMapping.swift in Sources */,
 				7520C41E2A283B1E0010E7F8 /* XCTLImmediateStatement.swift in Sources */,
 				7520C41E2A283B1E0010E7F8 /* XCTLImmediateStatement.swift in Sources */,
 				756916892A286A90005FF14B /* XCTLSetStatement.swift in Sources */,
 				756916892A286A90005FF14B /* XCTLSetStatement.swift in Sources */,
 				756916972A28DFE7005FF14B /* XCTLBreakStatement.swift in Sources */,
 				756916972A28DFE7005FF14B /* XCTLBreakStatement.swift in Sources */,

+ 792 - 30
XCTreeLang.xcodeproj/xcuserdata/xcbosa.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist

@@ -14,10 +14,42 @@
             filePath = "XCTreeLang/Statements/XCTLEqualthanStatement.swift"
             filePath = "XCTreeLang/Statements/XCTLEqualthanStatement.swift"
             startingColumnNumber = "9223372036854775807"
             startingColumnNumber = "9223372036854775807"
             endingColumnNumber = "9223372036854775807"
             endingColumnNumber = "9223372036854775807"
-            startingLineNumber = "43"
-            endingLineNumber = "43"
+            startingLineNumber = "45"
+            endingLineNumber = "45"
             landmarkName = "evaluate(inContext:)"
             landmarkName = "evaluate(inContext:)"
             landmarkType = "7">
             landmarkType = "7">
+            <Locations>
+               <Location
+                  uuid = "CE0B5C7A-BCB9-4114-8800-525E2AAC4483 - c4f83559009bfe9c"
+                  shouldBeEnabled = "Yes"
+                  ignoreCount = "0"
+                  continueAfterRunningActions = "No"
+                  symbolName = "XCTreeLang.XCTLEqualthanStatement.evaluate(inContext: XCTreeLang.XCTLRuntimeAbstractContext) throws -&gt; XCTreeLang.XCTLRuntimeVariable"
+                  moduleName = "XCTreeLang"
+                  usesParentBreakpointCondition = "Yes"
+                  urlString = "file:///Users/xcbosa/Documents/LibraryProjects/XCTreeLang/XCTreeLang/Statements/XCTLEqualthanStatement.swift"
+                  startingColumnNumber = "9223372036854775807"
+                  endingColumnNumber = "9223372036854775807"
+                  startingLineNumber = "43"
+                  endingLineNumber = "43"
+                  offsetFromSymbolStart = "1980">
+               </Location>
+               <Location
+                  uuid = "CE0B5C7A-BCB9-4114-8800-525E2AAC4483 - c4f83559009bff5e"
+                  shouldBeEnabled = "Yes"
+                  ignoreCount = "0"
+                  continueAfterRunningActions = "No"
+                  symbolName = "XCTreeLang.XCTLEqualthanStatement.evaluate(inContext: XCTreeLang.XCTLRuntimeAbstractContext) throws -&gt; XCTreeLang.XCTLRuntimeVariable"
+                  moduleName = "XCTreeLang"
+                  usesParentBreakpointCondition = "Yes"
+                  urlString = "file:///Users/xcbosa/Documents/LibraryProjects/XCTreeLang/XCTreeLang/Statements/XCTLEqualthanStatement.swift"
+                  startingColumnNumber = "9223372036854775807"
+                  endingColumnNumber = "9223372036854775807"
+                  startingLineNumber = "45"
+                  endingLineNumber = "45"
+                  offsetFromSymbolStart = "1980">
+               </Location>
+            </Locations>
          </BreakpointContent>
          </BreakpointContent>
       </BreakpointProxy>
       </BreakpointProxy>
       <BreakpointProxy
       <BreakpointProxy
@@ -30,10 +62,42 @@
             filePath = "XCTreeLang/Statements/XCTLEqualthanStatement.swift"
             filePath = "XCTreeLang/Statements/XCTLEqualthanStatement.swift"
             startingColumnNumber = "9223372036854775807"
             startingColumnNumber = "9223372036854775807"
             endingColumnNumber = "9223372036854775807"
             endingColumnNumber = "9223372036854775807"
-            startingLineNumber = "48"
-            endingLineNumber = "48"
+            startingLineNumber = "50"
+            endingLineNumber = "50"
             landmarkName = "evaluate(inContext:)"
             landmarkName = "evaluate(inContext:)"
             landmarkType = "7">
             landmarkType = "7">
+            <Locations>
+               <Location
+                  uuid = "D7417D2D-E757-4FA5-A8B8-DEA15E2D9450 - c4f83559009bfffb"
+                  shouldBeEnabled = "Yes"
+                  ignoreCount = "0"
+                  continueAfterRunningActions = "No"
+                  symbolName = "XCTreeLang.XCTLEqualthanStatement.evaluate(inContext: XCTreeLang.XCTLRuntimeAbstractContext) throws -&gt; XCTreeLang.XCTLRuntimeVariable"
+                  moduleName = "XCTreeLang"
+                  usesParentBreakpointCondition = "Yes"
+                  urlString = "file:///Users/xcbosa/Documents/LibraryProjects/XCTreeLang/XCTreeLang/Statements/XCTLEqualthanStatement.swift"
+                  startingColumnNumber = "9223372036854775807"
+                  endingColumnNumber = "9223372036854775807"
+                  startingLineNumber = "48"
+                  endingLineNumber = "48"
+                  offsetFromSymbolStart = "1892">
+               </Location>
+               <Location
+                  uuid = "D7417D2D-E757-4FA5-A8B8-DEA15E2D9450 - c4f83559009bffb5"
+                  shouldBeEnabled = "Yes"
+                  ignoreCount = "0"
+                  continueAfterRunningActions = "No"
+                  symbolName = "XCTreeLang.XCTLEqualthanStatement.evaluate(inContext: XCTreeLang.XCTLRuntimeAbstractContext) throws -&gt; XCTreeLang.XCTLRuntimeVariable"
+                  moduleName = "XCTreeLang"
+                  usesParentBreakpointCondition = "Yes"
+                  urlString = "file:///Users/xcbosa/Documents/LibraryProjects/XCTreeLang/XCTreeLang/Statements/XCTLEqualthanStatement.swift"
+                  startingColumnNumber = "9223372036854775807"
+                  endingColumnNumber = "9223372036854775807"
+                  startingLineNumber = "50"
+                  endingLineNumber = "50"
+                  offsetFromSymbolStart = "1892">
+               </Location>
+            </Locations>
          </BreakpointContent>
          </BreakpointContent>
       </BreakpointProxy>
       </BreakpointProxy>
       <BreakpointProxy
       <BreakpointProxy
@@ -46,10 +110,42 @@
             filePath = "XCTreeLang/Statements/XCTLElseStatement.swift"
             filePath = "XCTreeLang/Statements/XCTLElseStatement.swift"
             startingColumnNumber = "9223372036854775807"
             startingColumnNumber = "9223372036854775807"
             endingColumnNumber = "9223372036854775807"
             endingColumnNumber = "9223372036854775807"
-            startingLineNumber = "41"
-            endingLineNumber = "41"
+            startingLineNumber = "43"
+            endingLineNumber = "43"
             landmarkName = "evaluate(inContext:)"
             landmarkName = "evaluate(inContext:)"
             landmarkType = "7">
             landmarkType = "7">
+            <Locations>
+               <Location
+                  uuid = "BB80C1F4-0108-45C0-B5F8-4D92615C620E - 782bad6195591ad2"
+                  shouldBeEnabled = "Yes"
+                  ignoreCount = "0"
+                  continueAfterRunningActions = "No"
+                  symbolName = "XCTreeLang.XCTLElseStatement.evaluate(inContext: XCTreeLang.XCTLRuntimeAbstractContext) throws -&gt; XCTreeLang.XCTLRuntimeVariable"
+                  moduleName = "XCTreeLang"
+                  usesParentBreakpointCondition = "Yes"
+                  urlString = "file:///Users/xcbosa/Documents/LibraryProjects/XCTreeLang/XCTreeLang/Statements/XCTLElseStatement.swift"
+                  startingColumnNumber = "9223372036854775807"
+                  endingColumnNumber = "9223372036854775807"
+                  startingLineNumber = "41"
+                  endingLineNumber = "41"
+                  offsetFromSymbolStart = "372">
+               </Location>
+               <Location
+                  uuid = "BB80C1F4-0108-45C0-B5F8-4D92615C620E - 782bad6195591b6c"
+                  shouldBeEnabled = "Yes"
+                  ignoreCount = "0"
+                  continueAfterRunningActions = "No"
+                  symbolName = "XCTreeLang.XCTLElseStatement.evaluate(inContext: XCTreeLang.XCTLRuntimeAbstractContext) throws -&gt; XCTreeLang.XCTLRuntimeVariable"
+                  moduleName = "XCTreeLang"
+                  usesParentBreakpointCondition = "Yes"
+                  urlString = "file:///Users/xcbosa/Documents/LibraryProjects/XCTreeLang/XCTreeLang/Statements/XCTLElseStatement.swift"
+                  startingColumnNumber = "9223372036854775807"
+                  endingColumnNumber = "9223372036854775807"
+                  startingLineNumber = "43"
+                  endingLineNumber = "43"
+                  offsetFromSymbolStart = "372">
+               </Location>
+            </Locations>
          </BreakpointContent>
          </BreakpointContent>
       </BreakpointProxy>
       </BreakpointProxy>
       <BreakpointProxy
       <BreakpointProxy
@@ -62,10 +158,42 @@
             filePath = "XCTreeLang/Statements/XCTLLessthanStatement.swift"
             filePath = "XCTreeLang/Statements/XCTLLessthanStatement.swift"
             startingColumnNumber = "9223372036854775807"
             startingColumnNumber = "9223372036854775807"
             endingColumnNumber = "9223372036854775807"
             endingColumnNumber = "9223372036854775807"
-            startingLineNumber = "47"
-            endingLineNumber = "47"
+            startingLineNumber = "49"
+            endingLineNumber = "49"
             landmarkName = "evaluate(inContext:)"
             landmarkName = "evaluate(inContext:)"
             landmarkType = "7">
             landmarkType = "7">
+            <Locations>
+               <Location
+                  uuid = "2A529CD4-A110-4D23-B16C-CAFAFAD754ED - 22f22d847ab1596e"
+                  shouldBeEnabled = "Yes"
+                  ignoreCount = "0"
+                  continueAfterRunningActions = "No"
+                  symbolName = "XCTreeLang.XCTLLessthanStatement.evaluate(inContext: XCTreeLang.XCTLRuntimeAbstractContext) throws -&gt; XCTreeLang.XCTLRuntimeVariable"
+                  moduleName = "XCTreeLang"
+                  usesParentBreakpointCondition = "Yes"
+                  urlString = "file:///Users/xcbosa/Documents/LibraryProjects/XCTreeLang/XCTreeLang/Statements/XCTLLessthanStatement.swift"
+                  startingColumnNumber = "9223372036854775807"
+                  endingColumnNumber = "9223372036854775807"
+                  startingLineNumber = "47"
+                  endingLineNumber = "47"
+                  offsetFromSymbolStart = "2036">
+               </Location>
+               <Location
+                  uuid = "2A529CD4-A110-4D23-B16C-CAFAFAD754ED - 22f22d847ab15e90"
+                  shouldBeEnabled = "Yes"
+                  ignoreCount = "0"
+                  continueAfterRunningActions = "No"
+                  symbolName = "XCTreeLang.XCTLLessthanStatement.evaluate(inContext: XCTreeLang.XCTLRuntimeAbstractContext) throws -&gt; XCTreeLang.XCTLRuntimeVariable"
+                  moduleName = "XCTreeLang"
+                  usesParentBreakpointCondition = "Yes"
+                  urlString = "file:///Users/xcbosa/Documents/LibraryProjects/XCTreeLang/XCTreeLang/Statements/XCTLLessthanStatement.swift"
+                  startingColumnNumber = "9223372036854775807"
+                  endingColumnNumber = "9223372036854775807"
+                  startingLineNumber = "49"
+                  endingLineNumber = "49"
+                  offsetFromSymbolStart = "2036">
+               </Location>
+            </Locations>
          </BreakpointContent>
          </BreakpointContent>
       </BreakpointProxy>
       </BreakpointProxy>
       <BreakpointProxy
       <BreakpointProxy
@@ -78,10 +206,42 @@
             filePath = "XCTreeLang/Statements/XCTLLessthanStatement.swift"
             filePath = "XCTreeLang/Statements/XCTLLessthanStatement.swift"
             startingColumnNumber = "9223372036854775807"
             startingColumnNumber = "9223372036854775807"
             endingColumnNumber = "9223372036854775807"
             endingColumnNumber = "9223372036854775807"
-            startingLineNumber = "51"
-            endingLineNumber = "51"
+            startingLineNumber = "53"
+            endingLineNumber = "53"
             landmarkName = "evaluate(inContext:)"
             landmarkName = "evaluate(inContext:)"
             landmarkType = "7">
             landmarkType = "7">
+            <Locations>
+               <Location
+                  uuid = "38990361-989A-4D6E-A247-CA5959582158 - 22f22d847ab15ed2"
+                  shouldBeEnabled = "Yes"
+                  ignoreCount = "0"
+                  continueAfterRunningActions = "No"
+                  symbolName = "XCTreeLang.XCTLLessthanStatement.evaluate(inContext: XCTreeLang.XCTLRuntimeAbstractContext) throws -&gt; XCTreeLang.XCTLRuntimeVariable"
+                  moduleName = "XCTreeLang"
+                  usesParentBreakpointCondition = "Yes"
+                  urlString = "file:///Users/xcbosa/Documents/LibraryProjects/XCTreeLang/XCTreeLang/Statements/XCTLLessthanStatement.swift"
+                  startingColumnNumber = "9223372036854775807"
+                  endingColumnNumber = "9223372036854775807"
+                  startingLineNumber = "51"
+                  endingLineNumber = "51"
+                  offsetFromSymbolStart = "1948">
+               </Location>
+               <Location
+                  uuid = "38990361-989A-4D6E-A247-CA5959582158 - 22f22d847ab15e14"
+                  shouldBeEnabled = "Yes"
+                  ignoreCount = "0"
+                  continueAfterRunningActions = "No"
+                  symbolName = "XCTreeLang.XCTLLessthanStatement.evaluate(inContext: XCTreeLang.XCTLRuntimeAbstractContext) throws -&gt; XCTreeLang.XCTLRuntimeVariable"
+                  moduleName = "XCTreeLang"
+                  usesParentBreakpointCondition = "Yes"
+                  urlString = "file:///Users/xcbosa/Documents/LibraryProjects/XCTreeLang/XCTreeLang/Statements/XCTLLessthanStatement.swift"
+                  startingColumnNumber = "9223372036854775807"
+                  endingColumnNumber = "9223372036854775807"
+                  startingLineNumber = "53"
+                  endingLineNumber = "53"
+                  offsetFromSymbolStart = "1948">
+               </Location>
+            </Locations>
          </BreakpointContent>
          </BreakpointContent>
       </BreakpointProxy>
       </BreakpointProxy>
       <BreakpointProxy
       <BreakpointProxy
@@ -94,10 +254,42 @@
             filePath = "XCTreeLang/Statements/XCTLNextthanStatement.swift"
             filePath = "XCTreeLang/Statements/XCTLNextthanStatement.swift"
             startingColumnNumber = "9223372036854775807"
             startingColumnNumber = "9223372036854775807"
             endingColumnNumber = "9223372036854775807"
             endingColumnNumber = "9223372036854775807"
-            startingLineNumber = "37"
-            endingLineNumber = "37"
+            startingLineNumber = "39"
+            endingLineNumber = "39"
             landmarkName = "evaluate(inContext:)"
             landmarkName = "evaluate(inContext:)"
             landmarkType = "7">
             landmarkType = "7">
+            <Locations>
+               <Location
+                  uuid = "F9CC256C-1B93-464D-9004-6BB6EE749095 - dc67b751bda1c2a4"
+                  shouldBeEnabled = "Yes"
+                  ignoreCount = "0"
+                  continueAfterRunningActions = "No"
+                  symbolName = "XCTreeLang.XCTLNextthanStatement.evaluate(inContext: XCTreeLang.XCTLRuntimeAbstractContext) throws -&gt; XCTreeLang.XCTLRuntimeVariable"
+                  moduleName = "XCTreeLang"
+                  usesParentBreakpointCondition = "Yes"
+                  urlString = "file:///Users/xcbosa/Documents/LibraryProjects/XCTreeLang/XCTreeLang/Statements/XCTLNextthanStatement.swift"
+                  startingColumnNumber = "9223372036854775807"
+                  endingColumnNumber = "9223372036854775807"
+                  startingLineNumber = "37"
+                  endingLineNumber = "37"
+                  offsetFromSymbolStart = "444">
+               </Location>
+               <Location
+                  uuid = "F9CC256C-1B93-464D-9004-6BB6EE749095 - dc67b751bda1c2e6"
+                  shouldBeEnabled = "Yes"
+                  ignoreCount = "0"
+                  continueAfterRunningActions = "No"
+                  symbolName = "XCTreeLang.XCTLNextthanStatement.evaluate(inContext: XCTreeLang.XCTLRuntimeAbstractContext) throws -&gt; XCTreeLang.XCTLRuntimeVariable"
+                  moduleName = "XCTreeLang"
+                  usesParentBreakpointCondition = "Yes"
+                  urlString = "file:///Users/xcbosa/Documents/LibraryProjects/XCTreeLang/XCTreeLang/Statements/XCTLNextthanStatement.swift"
+                  startingColumnNumber = "9223372036854775807"
+                  endingColumnNumber = "9223372036854775807"
+                  startingLineNumber = "39"
+                  endingLineNumber = "39"
+                  offsetFromSymbolStart = "444">
+               </Location>
+            </Locations>
          </BreakpointContent>
          </BreakpointContent>
       </BreakpointProxy>
       </BreakpointProxy>
       <BreakpointProxy
       <BreakpointProxy
@@ -110,10 +302,42 @@
             filePath = "XCTreeLang/Statements/XCTLNextthanStatement.swift"
             filePath = "XCTreeLang/Statements/XCTLNextthanStatement.swift"
             startingColumnNumber = "9223372036854775807"
             startingColumnNumber = "9223372036854775807"
             endingColumnNumber = "9223372036854775807"
             endingColumnNumber = "9223372036854775807"
-            startingLineNumber = "40"
-            endingLineNumber = "40"
+            startingLineNumber = "42"
+            endingLineNumber = "42"
             landmarkName = "evaluate(inContext:)"
             landmarkName = "evaluate(inContext:)"
             landmarkType = "7">
             landmarkType = "7">
+            <Locations>
+               <Location
+                  uuid = "A7C12A73-E896-4CFC-8D9B-063BEDC41511 - dc67b751bda1c2c7"
+                  shouldBeEnabled = "Yes"
+                  ignoreCount = "0"
+                  continueAfterRunningActions = "No"
+                  symbolName = "XCTreeLang.XCTLNextthanStatement.evaluate(inContext: XCTreeLang.XCTLRuntimeAbstractContext) throws -&gt; XCTreeLang.XCTLRuntimeVariable"
+                  moduleName = "XCTreeLang"
+                  usesParentBreakpointCondition = "Yes"
+                  urlString = "file:///Users/xcbosa/Documents/LibraryProjects/XCTreeLang/XCTreeLang/Statements/XCTLNextthanStatement.swift"
+                  startingColumnNumber = "9223372036854775807"
+                  endingColumnNumber = "9223372036854775807"
+                  startingLineNumber = "40"
+                  endingLineNumber = "40"
+                  offsetFromSymbolStart = "348">
+               </Location>
+               <Location
+                  uuid = "A7C12A73-E896-4CFC-8D9B-063BEDC41511 - dc67b751bda1dd79"
+                  shouldBeEnabled = "Yes"
+                  ignoreCount = "0"
+                  continueAfterRunningActions = "No"
+                  symbolName = "XCTreeLang.XCTLNextthanStatement.evaluate(inContext: XCTreeLang.XCTLRuntimeAbstractContext) throws -&gt; XCTreeLang.XCTLRuntimeVariable"
+                  moduleName = "XCTreeLang"
+                  usesParentBreakpointCondition = "Yes"
+                  urlString = "file:///Users/xcbosa/Documents/LibraryProjects/XCTreeLang/XCTreeLang/Statements/XCTLNextthanStatement.swift"
+                  startingColumnNumber = "9223372036854775807"
+                  endingColumnNumber = "9223372036854775807"
+                  startingLineNumber = "42"
+                  endingLineNumber = "42"
+                  offsetFromSymbolStart = "348">
+               </Location>
+            </Locations>
          </BreakpointContent>
          </BreakpointContent>
       </BreakpointProxy>
       </BreakpointProxy>
       <BreakpointProxy
       <BreakpointProxy
@@ -126,10 +350,42 @@
             filePath = "XCTreeLang/Statements/XCTLParagraphStatement.swift"
             filePath = "XCTreeLang/Statements/XCTLParagraphStatement.swift"
             startingColumnNumber = "9223372036854775807"
             startingColumnNumber = "9223372036854775807"
             endingColumnNumber = "9223372036854775807"
             endingColumnNumber = "9223372036854775807"
-            startingLineNumber = "67"
-            endingLineNumber = "67"
+            startingLineNumber = "96"
+            endingLineNumber = "96"
             landmarkName = "doRealEvaluate(inContext:withArgs:)"
             landmarkName = "doRealEvaluate(inContext:withArgs:)"
             landmarkType = "7">
             landmarkType = "7">
+            <Locations>
+               <Location
+                  uuid = "20B938DB-244D-4B20-ACBD-5D1F98A9EBE2 - 6ad8d95f2a05c731"
+                  shouldBeEnabled = "Yes"
+                  ignoreCount = "0"
+                  continueAfterRunningActions = "No"
+                  symbolName = "XCTreeLang.XCTLParagraphStatement.doRealEvaluate(inContext: XCTreeLang.XCTLRuntimeAbstractContext, withArgs: Swift.Array&lt;XCTreeLang.XCTLRuntimeVariable&gt;) throws -&gt; XCTreeLang.XCTLRuntimeVariable"
+                  moduleName = "XCTreeLang"
+                  usesParentBreakpointCondition = "Yes"
+                  urlString = "file:///Users/xcbosa/Documents/LibraryProjects/XCTreeLang/XCTreeLang/Statements/XCTLParagraphStatement.swift"
+                  startingColumnNumber = "9223372036854775807"
+                  endingColumnNumber = "9223372036854775807"
+                  startingLineNumber = "96"
+                  endingLineNumber = "96"
+                  offsetFromSymbolStart = "680">
+               </Location>
+               <Location
+                  uuid = "20B938DB-244D-4B20-ACBD-5D1F98A9EBE2 - 6ad8d95f2a05c731"
+                  shouldBeEnabled = "Yes"
+                  ignoreCount = "0"
+                  continueAfterRunningActions = "No"
+                  symbolName = "XCTreeLang.XCTLParagraphStatement.doRealEvaluate(inContext: XCTreeLang.XCTLRuntimeAbstractContext, withArgs: Swift.Array&lt;XCTreeLang.XCTLRuntimeVariable&gt;) throws -&gt; XCTreeLang.XCTLRuntimeVariable"
+                  moduleName = "XCTreeLang"
+                  usesParentBreakpointCondition = "Yes"
+                  urlString = "file:///Users/xcbosa/Documents/LibraryProjects/XCTreeLang/XCTreeLang/Statements/XCTLParagraphStatement.swift"
+                  startingColumnNumber = "9223372036854775807"
+                  endingColumnNumber = "9223372036854775807"
+                  startingLineNumber = "96"
+                  endingLineNumber = "96"
+                  offsetFromSymbolStart = "392">
+               </Location>
+            </Locations>
          </BreakpointContent>
          </BreakpointContent>
       </BreakpointProxy>
       </BreakpointProxy>
       <BreakpointProxy
       <BreakpointProxy
@@ -142,10 +398,42 @@
             filePath = "XCTreeLang/Statements/XCTLEqualthanStatement.swift"
             filePath = "XCTreeLang/Statements/XCTLEqualthanStatement.swift"
             startingColumnNumber = "9223372036854775807"
             startingColumnNumber = "9223372036854775807"
             endingColumnNumber = "9223372036854775807"
             endingColumnNumber = "9223372036854775807"
-            startingLineNumber = "59"
-            endingLineNumber = "59"
+            startingLineNumber = "61"
+            endingLineNumber = "61"
             landmarkName = "evaluate(inContext:)"
             landmarkName = "evaluate(inContext:)"
             landmarkType = "7">
             landmarkType = "7">
+            <Locations>
+               <Location
+                  uuid = "1157454B-7DC1-435C-810F-6DAF5F2B563C - c4f83559009bf16c"
+                  shouldBeEnabled = "Yes"
+                  ignoreCount = "0"
+                  continueAfterRunningActions = "No"
+                  symbolName = "XCTreeLang.XCTLEqualthanStatement.evaluate(inContext: XCTreeLang.XCTLRuntimeAbstractContext) throws -&gt; XCTreeLang.XCTLRuntimeVariable"
+                  moduleName = "XCTreeLang"
+                  usesParentBreakpointCondition = "Yes"
+                  urlString = "file:///Users/xcbosa/Documents/LibraryProjects/XCTreeLang/XCTreeLang/Statements/XCTLEqualthanStatement.swift"
+                  startingColumnNumber = "9223372036854775807"
+                  endingColumnNumber = "9223372036854775807"
+                  startingLineNumber = "59"
+                  endingLineNumber = "59"
+                  offsetFromSymbolStart = "1084">
+               </Location>
+               <Location
+                  uuid = "1157454B-7DC1-435C-810F-6DAF5F2B563C - c4f83559009bf12e"
+                  shouldBeEnabled = "Yes"
+                  ignoreCount = "0"
+                  continueAfterRunningActions = "No"
+                  symbolName = "XCTreeLang.XCTLEqualthanStatement.evaluate(inContext: XCTreeLang.XCTLRuntimeAbstractContext) throws -&gt; XCTreeLang.XCTLRuntimeVariable"
+                  moduleName = "XCTreeLang"
+                  usesParentBreakpointCondition = "Yes"
+                  urlString = "file:///Users/xcbosa/Documents/LibraryProjects/XCTreeLang/XCTreeLang/Statements/XCTLEqualthanStatement.swift"
+                  startingColumnNumber = "9223372036854775807"
+                  endingColumnNumber = "9223372036854775807"
+                  startingLineNumber = "61"
+                  endingLineNumber = "61"
+                  offsetFromSymbolStart = "1084">
+               </Location>
+            </Locations>
          </BreakpointContent>
          </BreakpointContent>
       </BreakpointProxy>
       </BreakpointProxy>
       <BreakpointProxy
       <BreakpointProxy
@@ -158,10 +446,42 @@
             filePath = "XCTreeLang/Statements/XCTLMorethanStatement.swift"
             filePath = "XCTreeLang/Statements/XCTLMorethanStatement.swift"
             startingColumnNumber = "9223372036854775807"
             startingColumnNumber = "9223372036854775807"
             endingColumnNumber = "9223372036854775807"
             endingColumnNumber = "9223372036854775807"
-            startingLineNumber = "47"
-            endingLineNumber = "47"
+            startingLineNumber = "49"
+            endingLineNumber = "49"
             landmarkName = "evaluate(inContext:)"
             landmarkName = "evaluate(inContext:)"
             landmarkType = "7">
             landmarkType = "7">
+            <Locations>
+               <Location
+                  uuid = "B991C77B-91F4-4A57-AC7E-D5C29D505801 - e06e50c0e5a637ae"
+                  shouldBeEnabled = "Yes"
+                  ignoreCount = "0"
+                  continueAfterRunningActions = "No"
+                  symbolName = "XCTreeLang.XCTLMorethanStatement.evaluate(inContext: XCTreeLang.XCTLRuntimeAbstractContext) throws -&gt; XCTreeLang.XCTLRuntimeVariable"
+                  moduleName = "XCTreeLang"
+                  usesParentBreakpointCondition = "Yes"
+                  urlString = "file:///Users/xcbosa/Documents/LibraryProjects/XCTreeLang/XCTreeLang/Statements/XCTLMorethanStatement.swift"
+                  startingColumnNumber = "9223372036854775807"
+                  endingColumnNumber = "9223372036854775807"
+                  startingLineNumber = "47"
+                  endingLineNumber = "47"
+                  offsetFromSymbolStart = "2040">
+               </Location>
+               <Location
+                  uuid = "B991C77B-91F4-4A57-AC7E-D5C29D505801 - e06e50c0e5a63668"
+                  shouldBeEnabled = "Yes"
+                  ignoreCount = "0"
+                  continueAfterRunningActions = "No"
+                  symbolName = "XCTreeLang.XCTLMorethanStatement.evaluate(inContext: XCTreeLang.XCTLRuntimeAbstractContext) throws -&gt; XCTreeLang.XCTLRuntimeVariable"
+                  moduleName = "XCTreeLang"
+                  usesParentBreakpointCondition = "Yes"
+                  urlString = "file:///Users/xcbosa/Documents/LibraryProjects/XCTreeLang/XCTreeLang/Statements/XCTLMorethanStatement.swift"
+                  startingColumnNumber = "9223372036854775807"
+                  endingColumnNumber = "9223372036854775807"
+                  startingLineNumber = "49"
+                  endingLineNumber = "49"
+                  offsetFromSymbolStart = "2040">
+               </Location>
+            </Locations>
          </BreakpointContent>
          </BreakpointContent>
       </BreakpointProxy>
       </BreakpointProxy>
       <BreakpointProxy
       <BreakpointProxy
@@ -174,10 +494,42 @@
             filePath = "XCTreeLang/Statements/XCTLMorethanStatement.swift"
             filePath = "XCTreeLang/Statements/XCTLMorethanStatement.swift"
             startingColumnNumber = "9223372036854775807"
             startingColumnNumber = "9223372036854775807"
             endingColumnNumber = "9223372036854775807"
             endingColumnNumber = "9223372036854775807"
-            startingLineNumber = "51"
-            endingLineNumber = "51"
+            startingLineNumber = "53"
+            endingLineNumber = "53"
             landmarkName = "evaluate(inContext:)"
             landmarkName = "evaluate(inContext:)"
             landmarkType = "7">
             landmarkType = "7">
+            <Locations>
+               <Location
+                  uuid = "DE99138A-2D5F-4CC4-A11F-FAD9B843566D - e06e50c0e5a6362a"
+                  shouldBeEnabled = "Yes"
+                  ignoreCount = "0"
+                  continueAfterRunningActions = "No"
+                  symbolName = "XCTreeLang.XCTLMorethanStatement.evaluate(inContext: XCTreeLang.XCTLRuntimeAbstractContext) throws -&gt; XCTreeLang.XCTLRuntimeVariable"
+                  moduleName = "XCTreeLang"
+                  usesParentBreakpointCondition = "Yes"
+                  urlString = "file:///Users/xcbosa/Documents/LibraryProjects/XCTreeLang/XCTreeLang/Statements/XCTLMorethanStatement.swift"
+                  startingColumnNumber = "9223372036854775807"
+                  endingColumnNumber = "9223372036854775807"
+                  startingLineNumber = "51"
+                  endingLineNumber = "51"
+                  offsetFromSymbolStart = "1952">
+               </Location>
+               <Location
+                  uuid = "DE99138A-2D5F-4CC4-A11F-FAD9B843566D - e06e50c0e5a636d4"
+                  shouldBeEnabled = "Yes"
+                  ignoreCount = "0"
+                  continueAfterRunningActions = "No"
+                  symbolName = "XCTreeLang.XCTLMorethanStatement.evaluate(inContext: XCTreeLang.XCTLRuntimeAbstractContext) throws -&gt; XCTreeLang.XCTLRuntimeVariable"
+                  moduleName = "XCTreeLang"
+                  usesParentBreakpointCondition = "Yes"
+                  urlString = "file:///Users/xcbosa/Documents/LibraryProjects/XCTreeLang/XCTreeLang/Statements/XCTLMorethanStatement.swift"
+                  startingColumnNumber = "9223372036854775807"
+                  endingColumnNumber = "9223372036854775807"
+                  startingLineNumber = "53"
+                  endingLineNumber = "53"
+                  offsetFromSymbolStart = "1952">
+               </Location>
+            </Locations>
          </BreakpointContent>
          </BreakpointContent>
       </BreakpointProxy>
       </BreakpointProxy>
       <BreakpointProxy
       <BreakpointProxy
@@ -190,10 +542,42 @@
             filePath = "XCTreeLang/Statements/XCTLMorethanStatement.swift"
             filePath = "XCTreeLang/Statements/XCTLMorethanStatement.swift"
             startingColumnNumber = "9223372036854775807"
             startingColumnNumber = "9223372036854775807"
             endingColumnNumber = "9223372036854775807"
             endingColumnNumber = "9223372036854775807"
-            startingLineNumber = "60"
-            endingLineNumber = "60"
+            startingLineNumber = "62"
+            endingLineNumber = "62"
             landmarkName = "evaluate(inContext:)"
             landmarkName = "evaluate(inContext:)"
             landmarkType = "7">
             landmarkType = "7">
+            <Locations>
+               <Location
+                  uuid = "4D995B8D-8DF5-4246-B928-809413B74EE8 - e06e50c0e5a635f3"
+                  shouldBeEnabled = "Yes"
+                  ignoreCount = "0"
+                  continueAfterRunningActions = "No"
+                  symbolName = "XCTreeLang.XCTLMorethanStatement.evaluate(inContext: XCTreeLang.XCTLRuntimeAbstractContext) throws -&gt; XCTreeLang.XCTLRuntimeVariable"
+                  moduleName = "XCTreeLang"
+                  usesParentBreakpointCondition = "Yes"
+                  urlString = "file:///Users/xcbosa/Documents/LibraryProjects/XCTreeLang/XCTreeLang/Statements/XCTLMorethanStatement.swift"
+                  startingColumnNumber = "9223372036854775807"
+                  endingColumnNumber = "9223372036854775807"
+                  startingLineNumber = "60"
+                  endingLineNumber = "60"
+                  offsetFromSymbolStart = "1060">
+               </Location>
+               <Location
+                  uuid = "4D995B8D-8DF5-4246-B928-809413B74EE8 - e06e50c0e5a635bd"
+                  shouldBeEnabled = "Yes"
+                  ignoreCount = "0"
+                  continueAfterRunningActions = "No"
+                  symbolName = "XCTreeLang.XCTLMorethanStatement.evaluate(inContext: XCTreeLang.XCTLRuntimeAbstractContext) throws -&gt; XCTreeLang.XCTLRuntimeVariable"
+                  moduleName = "XCTreeLang"
+                  usesParentBreakpointCondition = "Yes"
+                  urlString = "file:///Users/xcbosa/Documents/LibraryProjects/XCTreeLang/XCTreeLang/Statements/XCTLMorethanStatement.swift"
+                  startingColumnNumber = "9223372036854775807"
+                  endingColumnNumber = "9223372036854775807"
+                  startingLineNumber = "62"
+                  endingLineNumber = "62"
+                  offsetFromSymbolStart = "1060">
+               </Location>
+            </Locations>
          </BreakpointContent>
          </BreakpointContent>
       </BreakpointProxy>
       </BreakpointProxy>
       <BreakpointProxy
       <BreakpointProxy
@@ -206,10 +590,42 @@
             filePath = "XCTreeLang/Statements/XCTLMorethanStatement.swift"
             filePath = "XCTreeLang/Statements/XCTLMorethanStatement.swift"
             startingColumnNumber = "9223372036854775807"
             startingColumnNumber = "9223372036854775807"
             endingColumnNumber = "9223372036854775807"
             endingColumnNumber = "9223372036854775807"
-            startingLineNumber = "63"
-            endingLineNumber = "63"
+            startingLineNumber = "65"
+            endingLineNumber = "65"
             landmarkName = "evaluate(inContext:)"
             landmarkName = "evaluate(inContext:)"
             landmarkType = "7">
             landmarkType = "7">
+            <Locations>
+               <Location
+                  uuid = "587D9FDF-0913-4C57-A5C2-CACC492FAA36 - e06e50c0e5a6359e"
+                  shouldBeEnabled = "Yes"
+                  ignoreCount = "0"
+                  continueAfterRunningActions = "No"
+                  symbolName = "XCTreeLang.XCTLMorethanStatement.evaluate(inContext: XCTreeLang.XCTLRuntimeAbstractContext) throws -&gt; XCTreeLang.XCTLRuntimeVariable"
+                  moduleName = "XCTreeLang"
+                  usesParentBreakpointCondition = "Yes"
+                  urlString = "file:///Users/xcbosa/Documents/LibraryProjects/XCTreeLang/XCTreeLang/Statements/XCTLMorethanStatement.swift"
+                  startingColumnNumber = "9223372036854775807"
+                  endingColumnNumber = "9223372036854775807"
+                  startingLineNumber = "63"
+                  endingLineNumber = "63"
+                  offsetFromSymbolStart = "1444">
+               </Location>
+               <Location
+                  uuid = "587D9FDF-0913-4C57-A5C2-CACC492FAA36 - e06e50c0e5a63458"
+                  shouldBeEnabled = "Yes"
+                  ignoreCount = "0"
+                  continueAfterRunningActions = "No"
+                  symbolName = "XCTreeLang.XCTLMorethanStatement.evaluate(inContext: XCTreeLang.XCTLRuntimeAbstractContext) throws -&gt; XCTreeLang.XCTLRuntimeVariable"
+                  moduleName = "XCTreeLang"
+                  usesParentBreakpointCondition = "Yes"
+                  urlString = "file:///Users/xcbosa/Documents/LibraryProjects/XCTreeLang/XCTreeLang/Statements/XCTLMorethanStatement.swift"
+                  startingColumnNumber = "9223372036854775807"
+                  endingColumnNumber = "9223372036854775807"
+                  startingLineNumber = "65"
+                  endingLineNumber = "65"
+                  offsetFromSymbolStart = "1444">
+               </Location>
+            </Locations>
          </BreakpointContent>
          </BreakpointContent>
       </BreakpointProxy>
       </BreakpointProxy>
       <BreakpointProxy
       <BreakpointProxy
@@ -222,10 +638,42 @@
             filePath = "XCTreeLang/Statements/XCTLLessthanStatement.swift"
             filePath = "XCTreeLang/Statements/XCTLLessthanStatement.swift"
             startingColumnNumber = "9223372036854775807"
             startingColumnNumber = "9223372036854775807"
             endingColumnNumber = "9223372036854775807"
             endingColumnNumber = "9223372036854775807"
-            startingLineNumber = "60"
-            endingLineNumber = "60"
+            startingLineNumber = "62"
+            endingLineNumber = "62"
             landmarkName = "evaluate(inContext:)"
             landmarkName = "evaluate(inContext:)"
             landmarkType = "7">
             landmarkType = "7">
+            <Locations>
+               <Location
+                  uuid = "BFE888DF-761B-43C6-8561-25412C711F3F - 22f22d847ab15f3b"
+                  shouldBeEnabled = "Yes"
+                  ignoreCount = "0"
+                  continueAfterRunningActions = "No"
+                  symbolName = "XCTreeLang.XCTLLessthanStatement.evaluate(inContext: XCTreeLang.XCTLRuntimeAbstractContext) throws -&gt; XCTreeLang.XCTLRuntimeVariable"
+                  moduleName = "XCTreeLang"
+                  usesParentBreakpointCondition = "Yes"
+                  urlString = "file:///Users/xcbosa/Documents/LibraryProjects/XCTreeLang/XCTreeLang/Statements/XCTLLessthanStatement.swift"
+                  startingColumnNumber = "9223372036854775807"
+                  endingColumnNumber = "9223372036854775807"
+                  startingLineNumber = "60"
+                  endingLineNumber = "60"
+                  offsetFromSymbolStart = "1060">
+               </Location>
+               <Location
+                  uuid = "BFE888DF-761B-43C6-8561-25412C711F3F - 22f22d847ab15f7d"
+                  shouldBeEnabled = "Yes"
+                  ignoreCount = "0"
+                  continueAfterRunningActions = "No"
+                  symbolName = "XCTreeLang.XCTLLessthanStatement.evaluate(inContext: XCTreeLang.XCTLRuntimeAbstractContext) throws -&gt; XCTreeLang.XCTLRuntimeVariable"
+                  moduleName = "XCTreeLang"
+                  usesParentBreakpointCondition = "Yes"
+                  urlString = "file:///Users/xcbosa/Documents/LibraryProjects/XCTreeLang/XCTreeLang/Statements/XCTLLessthanStatement.swift"
+                  startingColumnNumber = "9223372036854775807"
+                  endingColumnNumber = "9223372036854775807"
+                  startingLineNumber = "62"
+                  endingLineNumber = "62"
+                  offsetFromSymbolStart = "1060">
+               </Location>
+            </Locations>
          </BreakpointContent>
          </BreakpointContent>
       </BreakpointProxy>
       </BreakpointProxy>
       <BreakpointProxy
       <BreakpointProxy
@@ -238,10 +686,42 @@
             filePath = "XCTreeLang/Statements/XCTLLessthanStatement.swift"
             filePath = "XCTreeLang/Statements/XCTLLessthanStatement.swift"
             startingColumnNumber = "9223372036854775807"
             startingColumnNumber = "9223372036854775807"
             endingColumnNumber = "9223372036854775807"
             endingColumnNumber = "9223372036854775807"
-            startingLineNumber = "63"
-            endingLineNumber = "63"
+            startingLineNumber = "65"
+            endingLineNumber = "65"
             landmarkName = "evaluate(inContext:)"
             landmarkName = "evaluate(inContext:)"
             landmarkType = "7">
             landmarkType = "7">
+            <Locations>
+               <Location
+                  uuid = "E6E67FFE-B566-47BA-8D1F-AAE8337CB438 - 22f22d847ab15f5e"
+                  shouldBeEnabled = "Yes"
+                  ignoreCount = "0"
+                  continueAfterRunningActions = "No"
+                  symbolName = "XCTreeLang.XCTLLessthanStatement.evaluate(inContext: XCTreeLang.XCTLRuntimeAbstractContext) throws -&gt; XCTreeLang.XCTLRuntimeVariable"
+                  moduleName = "XCTreeLang"
+                  usesParentBreakpointCondition = "Yes"
+                  urlString = "file:///Users/xcbosa/Documents/LibraryProjects/XCTreeLang/XCTreeLang/Statements/XCTLLessthanStatement.swift"
+                  startingColumnNumber = "9223372036854775807"
+                  endingColumnNumber = "9223372036854775807"
+                  startingLineNumber = "63"
+                  endingLineNumber = "63"
+                  offsetFromSymbolStart = "1444">
+               </Location>
+               <Location
+                  uuid = "E6E67FFE-B566-47BA-8D1F-AAE8337CB438 - 22f22d847ab15c80"
+                  shouldBeEnabled = "Yes"
+                  ignoreCount = "0"
+                  continueAfterRunningActions = "No"
+                  symbolName = "XCTreeLang.XCTLLessthanStatement.evaluate(inContext: XCTreeLang.XCTLRuntimeAbstractContext) throws -&gt; XCTreeLang.XCTLRuntimeVariable"
+                  moduleName = "XCTreeLang"
+                  usesParentBreakpointCondition = "Yes"
+                  urlString = "file:///Users/xcbosa/Documents/LibraryProjects/XCTreeLang/XCTreeLang/Statements/XCTLLessthanStatement.swift"
+                  startingColumnNumber = "9223372036854775807"
+                  endingColumnNumber = "9223372036854775807"
+                  startingLineNumber = "65"
+                  endingLineNumber = "65"
+                  offsetFromSymbolStart = "1444">
+               </Location>
+            </Locations>
          </BreakpointContent>
          </BreakpointContent>
       </BreakpointProxy>
       </BreakpointProxy>
       <BreakpointProxy
       <BreakpointProxy
@@ -274,6 +754,288 @@
             endingLineNumber = "29"
             endingLineNumber = "29"
             landmarkName = "parseStatement(fromLexerToSelf:fromParent:)"
             landmarkName = "parseStatement(fromLexerToSelf:fromParent:)"
             landmarkType = "7">
             landmarkType = "7">
+            <Locations>
+               <Location
+                  uuid = "02E0C6D5-D1F2-4EC6-A561-65772D6F96C6 - 8320ac76ede50b83"
+                  shouldBeEnabled = "Yes"
+                  ignoreCount = "0"
+                  continueAfterRunningActions = "No"
+                  symbolName = "XCTreeLang.XCTLImportStatement.parseStatement(fromLexerToSelf: XCTreeLang.XCTLLexer, fromParent: Swift.Optional&lt;XCTreeLang.XCTLStatement&gt;) throws -&gt; ()"
+                  moduleName = "XCTreeLang"
+                  usesParentBreakpointCondition = "Yes"
+                  urlString = "file:///Users/xcbosa/Documents/LibraryProjects/XCTreeLang/XCTreeLang/Statements/XCTLImportStatement.swift"
+                  startingColumnNumber = "9223372036854775807"
+                  endingColumnNumber = "9223372036854775807"
+                  startingLineNumber = "29"
+                  endingLineNumber = "29"
+                  offsetFromSymbolStart = "316">
+               </Location>
+               <Location
+                  uuid = "02E0C6D5-D1F2-4EC6-A561-65772D6F96C6 - 8320ac76ede50b83"
+                  shouldBeEnabled = "Yes"
+                  ignoreCount = "0"
+                  continueAfterRunningActions = "No"
+                  symbolName = "XCTreeLang.XCTLImportStatement.parseStatement(fromLexerToSelf: XCTreeLang.XCTLLexer, fromParent: Swift.Optional&lt;XCTreeLang.XCTLStatement&gt;) throws -&gt; ()"
+                  moduleName = "XCTreeLang"
+                  usesParentBreakpointCondition = "Yes"
+                  urlString = "file:///Users/xcbosa/Documents/LibraryProjects/XCTreeLang/XCTreeLang/Statements/XCTLImportStatement.swift"
+                  startingColumnNumber = "9223372036854775807"
+                  endingColumnNumber = "9223372036854775807"
+                  startingLineNumber = "29"
+                  endingLineNumber = "29"
+                  offsetFromSymbolStart = "328">
+               </Location>
+            </Locations>
+         </BreakpointContent>
+      </BreakpointProxy>
+      <BreakpointProxy
+         BreakpointExtensionID = "Xcode.Breakpoint.FileBreakpoint">
+         <BreakpointContent
+            uuid = "83F6BEAD-F186-4CC5-873F-E006BE479EBB"
+            shouldBeEnabled = "Yes"
+            ignoreCount = "0"
+            continueAfterRunningActions = "No"
+            filePath = "XCTreeLang/Statements/XCTLVariableRefStatement.swift"
+            startingColumnNumber = "9223372036854775807"
+            endingColumnNumber = "9223372036854775807"
+            startingLineNumber = "60"
+            endingLineNumber = "60"
+            landmarkName = "evaluate(inContext:)"
+            landmarkType = "7">
+         </BreakpointContent>
+      </BreakpointProxy>
+      <BreakpointProxy
+         BreakpointExtensionID = "Xcode.Breakpoint.FileBreakpoint">
+         <BreakpointContent
+            uuid = "C3B0488E-C243-48F8-A91B-52C5156798CE"
+            shouldBeEnabled = "Yes"
+            ignoreCount = "0"
+            continueAfterRunningActions = "No"
+            filePath = "XCTreeLang/Statements/XCTLVariableRefStatement.swift"
+            startingColumnNumber = "9223372036854775807"
+            endingColumnNumber = "9223372036854775807"
+            startingLineNumber = "125"
+            endingLineNumber = "125"
+            landmarkName = "evaluateBack(_:inContext:)"
+            landmarkType = "7">
+            <Locations>
+               <Location
+                  uuid = "C3B0488E-C243-48F8-A91B-52C5156798CE - b2953dc3cfc33c98"
+                  shouldBeEnabled = "Yes"
+                  ignoreCount = "0"
+                  continueAfterRunningActions = "No"
+                  symbolName = "XCTreeLang.XCTLVariableRefStatement.evaluateBack(_: XCTreeLang.XCTLRuntimeVariable, inContext: XCTreeLang.XCTLRuntimeAbstractContext) throws -&gt; XCTreeLang.XCTLRuntimeVariable"
+                  moduleName = "XCTreeLang"
+                  usesParentBreakpointCondition = "Yes"
+                  urlString = "file:///Users/xcbosa/Documents/LibraryProjects/XCTreeLang/XCTreeLang/Statements/XCTLVariableRefStatement.swift"
+                  startingColumnNumber = "9223372036854775807"
+                  endingColumnNumber = "9223372036854775807"
+                  startingLineNumber = "119"
+                  endingLineNumber = "119"
+                  offsetFromSymbolStart = "696">
+               </Location>
+               <Location
+                  uuid = "C3B0488E-C243-48F8-A91B-52C5156798CE - b2953dc3cfc33c98"
+                  shouldBeEnabled = "Yes"
+                  ignoreCount = "0"
+                  continueAfterRunningActions = "No"
+                  symbolName = "XCTreeLang.XCTLVariableRefStatement.evaluateBack(_: XCTreeLang.XCTLRuntimeVariable, inContext: XCTreeLang.XCTLRuntimeAbstractContext) throws -&gt; XCTreeLang.XCTLRuntimeVariable"
+                  moduleName = "XCTreeLang"
+                  usesParentBreakpointCondition = "Yes"
+                  urlString = "file:///Users/xcbosa/Documents/LibraryProjects/XCTreeLang/XCTreeLang/Statements/XCTLVariableRefStatement.swift"
+                  startingColumnNumber = "9223372036854775807"
+                  endingColumnNumber = "9223372036854775807"
+                  startingLineNumber = "119"
+                  endingLineNumber = "119"
+                  offsetFromSymbolStart = "820">
+               </Location>
+               <Location
+                  uuid = "C3B0488E-C243-48F8-A91B-52C5156798CE - b2953dc3cfc33d1c"
+                  shouldBeEnabled = "Yes"
+                  ignoreCount = "0"
+                  continueAfterRunningActions = "No"
+                  symbolName = "XCTreeLang.XCTLVariableRefStatement.evaluateBack(_: XCTreeLang.XCTLRuntimeVariable, inContext: XCTreeLang.XCTLRuntimeAbstractContext) throws -&gt; XCTreeLang.XCTLRuntimeVariable"
+                  moduleName = "XCTreeLang"
+                  usesParentBreakpointCondition = "Yes"
+                  urlString = "file:///Users/xcbosa/Documents/LibraryProjects/XCTreeLang/XCTreeLang/Statements/XCTLVariableRefStatement.swift"
+                  startingColumnNumber = "9223372036854775807"
+                  endingColumnNumber = "9223372036854775807"
+                  startingLineNumber = "123"
+                  endingLineNumber = "123"
+                  offsetFromSymbolStart = "820">
+               </Location>
+               <Location
+                  uuid = "C3B0488E-C243-48F8-A91B-52C5156798CE - b2953dc3cfc33d5e"
+                  shouldBeEnabled = "Yes"
+                  ignoreCount = "0"
+                  continueAfterRunningActions = "No"
+                  symbolName = "XCTreeLang.XCTLVariableRefStatement.evaluateBack(_: XCTreeLang.XCTLRuntimeVariable, inContext: XCTreeLang.XCTLRuntimeAbstractContext) throws -&gt; XCTreeLang.XCTLRuntimeVariable"
+                  moduleName = "XCTreeLang"
+                  usesParentBreakpointCondition = "Yes"
+                  urlString = "file:///Users/xcbosa/Documents/LibraryProjects/XCTreeLang/XCTreeLang/Statements/XCTLVariableRefStatement.swift"
+                  startingColumnNumber = "9223372036854775807"
+                  endingColumnNumber = "9223372036854775807"
+                  startingLineNumber = "125"
+                  endingLineNumber = "125"
+                  offsetFromSymbolStart = "820">
+               </Location>
+            </Locations>
+         </BreakpointContent>
+      </BreakpointProxy>
+      <BreakpointProxy
+         BreakpointExtensionID = "Xcode.Breakpoint.FileBreakpoint">
+         <BreakpointContent
+            uuid = "C0E92D41-309C-419D-BDAE-E705374FB334"
+            shouldBeEnabled = "Yes"
+            ignoreCount = "0"
+            continueAfterRunningActions = "No"
+            filePath = "XCTreeLang/Statements/XCTLVariableRefStatement.swift"
+            startingColumnNumber = "9223372036854775807"
+            endingColumnNumber = "9223372036854775807"
+            startingLineNumber = "139"
+            endingLineNumber = "139"
+            landmarkName = "evaluateBack(_:inContext:)"
+            landmarkType = "7">
+            <Locations>
+               <Location
+                  uuid = "C0E92D41-309C-419D-BDAE-E705374FB334 - b2953dc3cfc33a56"
+                  shouldBeEnabled = "Yes"
+                  ignoreCount = "0"
+                  continueAfterRunningActions = "No"
+                  symbolName = "XCTreeLang.XCTLVariableRefStatement.evaluateBack(_: XCTreeLang.XCTLRuntimeVariable, inContext: XCTreeLang.XCTLRuntimeAbstractContext) throws -&gt; XCTreeLang.XCTLRuntimeVariable"
+                  moduleName = "XCTreeLang"
+                  usesParentBreakpointCondition = "Yes"
+                  urlString = "file:///Users/xcbosa/Documents/LibraryProjects/XCTreeLang/XCTreeLang/Statements/XCTLVariableRefStatement.swift"
+                  startingColumnNumber = "9223372036854775807"
+                  endingColumnNumber = "9223372036854775807"
+                  startingLineNumber = "133"
+                  endingLineNumber = "133"
+                  offsetFromSymbolStart = "1716">
+               </Location>
+               <Location
+                  uuid = "C0E92D41-309C-419D-BDAE-E705374FB334 - b2953dc3cfc33a56"
+                  shouldBeEnabled = "Yes"
+                  ignoreCount = "0"
+                  continueAfterRunningActions = "No"
+                  symbolName = "XCTreeLang.XCTLVariableRefStatement.evaluateBack(_: XCTreeLang.XCTLRuntimeVariable, inContext: XCTreeLang.XCTLRuntimeAbstractContext) throws -&gt; XCTreeLang.XCTLRuntimeVariable"
+                  moduleName = "XCTreeLang"
+                  usesParentBreakpointCondition = "Yes"
+                  urlString = "file:///Users/xcbosa/Documents/LibraryProjects/XCTreeLang/XCTreeLang/Statements/XCTLVariableRefStatement.swift"
+                  startingColumnNumber = "9223372036854775807"
+                  endingColumnNumber = "9223372036854775807"
+                  startingLineNumber = "133"
+                  endingLineNumber = "133"
+                  offsetFromSymbolStart = "1800">
+               </Location>
+               <Location
+                  uuid = "C0E92D41-309C-419D-BDAE-E705374FB334 - b2953dc3cfc33aca"
+                  shouldBeEnabled = "Yes"
+                  ignoreCount = "0"
+                  continueAfterRunningActions = "No"
+                  symbolName = "XCTreeLang.XCTLVariableRefStatement.evaluateBack(_: XCTreeLang.XCTLRuntimeVariable, inContext: XCTreeLang.XCTLRuntimeAbstractContext) throws -&gt; XCTreeLang.XCTLRuntimeVariable"
+                  moduleName = "XCTreeLang"
+                  usesParentBreakpointCondition = "Yes"
+                  urlString = "file:///Users/xcbosa/Documents/LibraryProjects/XCTreeLang/XCTreeLang/Statements/XCTLVariableRefStatement.swift"
+                  startingColumnNumber = "9223372036854775807"
+                  endingColumnNumber = "9223372036854775807"
+                  startingLineNumber = "137"
+                  endingLineNumber = "137"
+                  offsetFromSymbolStart = "1800">
+               </Location>
+               <Location
+                  uuid = "C0E92D41-309C-419D-BDAE-E705374FB334 - b2953dc3cfc33b0c"
+                  shouldBeEnabled = "Yes"
+                  ignoreCount = "0"
+                  continueAfterRunningActions = "No"
+                  symbolName = "XCTreeLang.XCTLVariableRefStatement.evaluateBack(_: XCTreeLang.XCTLRuntimeVariable, inContext: XCTreeLang.XCTLRuntimeAbstractContext) throws -&gt; XCTreeLang.XCTLRuntimeVariable"
+                  moduleName = "XCTreeLang"
+                  usesParentBreakpointCondition = "Yes"
+                  urlString = "file:///Users/xcbosa/Documents/LibraryProjects/XCTreeLang/XCTreeLang/Statements/XCTLVariableRefStatement.swift"
+                  startingColumnNumber = "9223372036854775807"
+                  endingColumnNumber = "9223372036854775807"
+                  startingLineNumber = "139"
+                  endingLineNumber = "139"
+                  offsetFromSymbolStart = "1800">
+               </Location>
+            </Locations>
+         </BreakpointContent>
+      </BreakpointProxy>
+      <BreakpointProxy
+         BreakpointExtensionID = "Xcode.Breakpoint.FileBreakpoint">
+         <BreakpointContent
+            uuid = "13C4A8A4-B94A-43B8-8601-88F10E7EAC2A"
+            shouldBeEnabled = "Yes"
+            ignoreCount = "0"
+            continueAfterRunningActions = "No"
+            filePath = "XCTreeLang/Statements/XCTLVariableRefStatement.swift"
+            startingColumnNumber = "9223372036854775807"
+            endingColumnNumber = "9223372036854775807"
+            startingLineNumber = "142"
+            endingLineNumber = "142"
+            landmarkName = "evaluateBack(_:inContext:)"
+            landmarkType = "7">
+            <Locations>
+               <Location
+                  uuid = "13C4A8A4-B94A-43B8-8601-88F10E7EAC2A - b2953dc3cfc33aeb"
+                  shouldBeEnabled = "Yes"
+                  ignoreCount = "0"
+                  continueAfterRunningActions = "No"
+                  symbolName = "XCTreeLang.XCTLVariableRefStatement.evaluateBack(_: XCTreeLang.XCTLRuntimeVariable, inContext: XCTreeLang.XCTLRuntimeAbstractContext) throws -&gt; XCTreeLang.XCTLRuntimeVariable"
+                  moduleName = "XCTreeLang"
+                  usesParentBreakpointCondition = "Yes"
+                  urlString = "file:///Users/xcbosa/Documents/LibraryProjects/XCTreeLang/XCTreeLang/Statements/XCTLVariableRefStatement.swift"
+                  startingColumnNumber = "9223372036854775807"
+                  endingColumnNumber = "9223372036854775807"
+                  startingLineNumber = "136"
+                  endingLineNumber = "136"
+                  offsetFromSymbolStart = "2020">
+               </Location>
+               <Location
+                  uuid = "13C4A8A4-B94A-43B8-8601-88F10E7EAC2A - b2953dc3cfc33aeb"
+                  shouldBeEnabled = "Yes"
+                  ignoreCount = "0"
+                  continueAfterRunningActions = "No"
+                  symbolName = "XCTreeLang.XCTLVariableRefStatement.evaluateBack(_: XCTreeLang.XCTLRuntimeVariable, inContext: XCTreeLang.XCTLRuntimeAbstractContext) throws -&gt; XCTreeLang.XCTLRuntimeVariable"
+                  moduleName = "XCTreeLang"
+                  usesParentBreakpointCondition = "Yes"
+                  urlString = "file:///Users/xcbosa/Documents/LibraryProjects/XCTreeLang/XCTreeLang/Statements/XCTLVariableRefStatement.swift"
+                  startingColumnNumber = "9223372036854775807"
+                  endingColumnNumber = "9223372036854775807"
+                  startingLineNumber = "136"
+                  endingLineNumber = "136"
+                  offsetFromSymbolStart = "2396">
+               </Location>
+               <Location
+                  uuid = "13C4A8A4-B94A-43B8-8601-88F10E7EAC2A - b2953dc3cfc33b6f"
+                  shouldBeEnabled = "Yes"
+                  ignoreCount = "0"
+                  continueAfterRunningActions = "No"
+                  symbolName = "XCTreeLang.XCTLVariableRefStatement.evaluateBack(_: XCTreeLang.XCTLRuntimeVariable, inContext: XCTreeLang.XCTLRuntimeAbstractContext) throws -&gt; XCTreeLang.XCTLRuntimeVariable"
+                  moduleName = "XCTreeLang"
+                  usesParentBreakpointCondition = "Yes"
+                  urlString = "file:///Users/xcbosa/Documents/LibraryProjects/XCTreeLang/XCTreeLang/Statements/XCTLVariableRefStatement.swift"
+                  startingColumnNumber = "9223372036854775807"
+                  endingColumnNumber = "9223372036854775807"
+                  startingLineNumber = "140"
+                  endingLineNumber = "140"
+                  offsetFromSymbolStart = "2396">
+               </Location>
+               <Location
+                  uuid = "13C4A8A4-B94A-43B8-8601-88F10E7EAC2A - b2953dc3cfc33ba1"
+                  shouldBeEnabled = "Yes"
+                  ignoreCount = "0"
+                  continueAfterRunningActions = "No"
+                  symbolName = "XCTreeLang.XCTLVariableRefStatement.evaluateBack(_: XCTreeLang.XCTLRuntimeVariable, inContext: XCTreeLang.XCTLRuntimeAbstractContext) throws -&gt; XCTreeLang.XCTLRuntimeVariable"
+                  moduleName = "XCTreeLang"
+                  usesParentBreakpointCondition = "Yes"
+                  urlString = "file:///Users/xcbosa/Documents/LibraryProjects/XCTreeLang/XCTreeLang/Statements/XCTLVariableRefStatement.swift"
+                  startingColumnNumber = "9223372036854775807"
+                  endingColumnNumber = "9223372036854775807"
+                  startingLineNumber = "142"
+                  endingLineNumber = "142"
+                  offsetFromSymbolStart = "2396">
+               </Location>
+            </Locations>
          </BreakpointContent>
          </BreakpointContent>
       </BreakpointProxy>
       </BreakpointProxy>
    </Breakpoints>
    </Breakpoints>

+ 1 - 0
XCTreeLang/InitializerImpl/XCTLViewController.swift

@@ -7,6 +7,7 @@
 
 
 import UIKit
 import UIKit
 
 
+@objcMembers
 public class XCTLViewController: UIViewController, XCTLGenerateProtocol {
 public class XCTLViewController: UIViewController, XCTLGenerateProtocol {
     
     
     public static func initWithXCT(_ arg: [Any]) throws -> NSObject {
     public static func initWithXCT(_ arg: [Any]) throws -> NSObject {

+ 4 - 0
XCTreeLang/Lex/XCTLLexer.swift

@@ -17,6 +17,8 @@ internal class XCTLLexer {
     
     
     internal var paragraphTable = [String : XCTLStatement]()
     internal var paragraphTable = [String : XCTLStatement]()
     
     
+    internal weak var lastStatement: XCTLStatement?
+    
     init(document: String) {
     init(document: String) {
         self.document = [Character](document)
         self.document = [Character](document)
     }
     }
@@ -153,6 +155,8 @@ internal class XCTLLexer {
             return XCTLToken(type: .typeValue, rawValue: "\(char)")
             return XCTLToken(type: .typeValue, rawValue: "\(char)")
         case ".":
         case ".":
             return XCTLToken(type: .typePoint, rawValue: "\(char)")
             return XCTLToken(type: .typePoint, rawValue: "\(char)")
+        case ":":
+            return XCTLToken(type: .typeColon, rawValue: "\(char)")
         default:
         default:
             throw XCTLCompileTimeError.illegalCharacter(char: char)
             throw XCTLCompileTimeError.illegalCharacter(char: char)
         }
         }

+ 2 - 0
XCTreeLang/Lex/XCTLTokenType.swift

@@ -41,6 +41,8 @@ internal enum XCTLTokenType: String {
     case typeXOR
     case typeXOR
     /// $
     /// $
     case typeValue
     case typeValue
+    /// :
+    case typeColon
     
     
     case typeEOF
     case typeEOF
     
     

+ 2 - 0
XCTreeLang/Runtime/Type/Instance/XCTLRuntimeTypeInstance.h

@@ -17,4 +17,6 @@ NS_ASSUME_NONNULL_BEGIN
 
 
 @end
 @end
 
 
+NSException * _Nullable ocTryCatch(void(^tryBlock)(void));
+
 NS_ASSUME_NONNULL_END
 NS_ASSUME_NONNULL_END

+ 11 - 0
XCTreeLang/Runtime/Type/Instance/XCTLRuntimeTypeInstance.m

@@ -165,3 +165,14 @@ const IMP methodIMPSlotR[methodIMPSlotCnt] = {
 const char methodIMPSoltRType[methodIMPSlotCnt][20] = {
 const char methodIMPSoltRType[methodIMPSlotCnt][20] = {
     "@@:", "@@:@", "@@:@@", "@@:@@@", "@@:@@@@", "@@:@@@@@", "@@:@@@@@@", "@@:@@@@@@@", "@@:@@@@@@@@"
     "@@:", "@@:@", "@@:@@", "@@:@@@", "@@:@@@@", "@@:@@@@@", "@@:@@@@@@", "@@:@@@@@@@", "@@:@@@@@@@@"
 };
 };
+
+NSException * _Nullable ocTryCatch(void(^tryBlock)(void)) {
+    @try {
+        tryBlock();
+        CGRect s;
+        return nil;
+    }
+    @catch (NSException *exception) {
+        return exception;
+    }
+}

+ 25 - 13
XCTreeLang/Runtime/XCTLRuntimeContext.swift

@@ -38,7 +38,7 @@ internal class XCTLRuntimeContext: XCTLRuntimeAbstractContext {
                 }
                 }
             }
             }
             return .void
             return .void
-        }), forName: "image")
+        }), forName: "image:")
         self.setValue(XCTLRuntimeVariable(funcImpl: {
         self.setValue(XCTLRuntimeVariable(funcImpl: {
             if $0.count == 1,
             if $0.count == 1,
                let val = $0.first {
                let val = $0.first {
@@ -47,10 +47,10 @@ internal class XCTLRuntimeContext: XCTLRuntimeAbstractContext {
                 }
                 }
             }
             }
             return .void
             return .void
-        }), forName: "string")
+        }), forName: "string:")
         self.setValue(XCTLRuntimeVariable(funcImpl: {
         self.setValue(XCTLRuntimeVariable(funcImpl: {
             fatalError($0.first?.stringValue ?? "fatalError from XCT")
             fatalError($0.first?.stringValue ?? "fatalError from XCT")
-        }), forName: "appFatalError")
+        }), forName: "appFatalError:")
         self.setValue(XCTLRuntimeVariable(funcImpl: {
         self.setValue(XCTLRuntimeVariable(funcImpl: {
             for (id, it) in $0.enumerated() {
             for (id, it) in $0.enumerated() {
                 self.stdout.append(text: it.toString())
                 self.stdout.append(text: it.toString())
@@ -59,7 +59,8 @@ internal class XCTLRuntimeContext: XCTLRuntimeAbstractContext {
                 }
                 }
             }
             }
             return .void
             return .void
-        }), forName: "log")
+        }), forNames: "log", "log:", "log:_:", "log:_:_:", "log:_:_:_:",
+                      "log:_:_:_:_:", "log:_:_:_:_:_:", "log:_:_:_:_:_:_:", "log:_:_:_:_:_:_:_:")
         self.setValue(XCTLRuntimeVariable(funcImpl: {
         self.setValue(XCTLRuntimeVariable(funcImpl: {
             for (id, it) in $0.enumerated() {
             for (id, it) in $0.enumerated() {
                 self.stdout.append(text: it.toString())
                 self.stdout.append(text: it.toString())
@@ -69,7 +70,8 @@ internal class XCTLRuntimeContext: XCTLRuntimeAbstractContext {
             }
             }
             self.stdout.append(text: "\n")
             self.stdout.append(text: "\n")
             return .void
             return .void
-        }), forName: "logn")
+        }), forNames: "logn", "logn:", "logn:_:", "logn:_:_:", "logn:_:_:_:",
+                      "logn:_:_:_:_:", "logn:_:_:_:_:_:", "logn:_:_:_:_:_:_:", "logn:_:_:_:_:_:_:_:")
         self.setValue(XCTLRuntimeVariable(funcImpl: {
         self.setValue(XCTLRuntimeVariable(funcImpl: {
             var dest: Double = 0
             var dest: Double = 0
             for it in $0 {
             for it in $0 {
@@ -78,7 +80,8 @@ internal class XCTLRuntimeContext: XCTLRuntimeAbstractContext {
                 }
                 }
             }
             }
             return XCTLRuntimeVariable(type: .typeNumber, rawValue: dest.description)
             return XCTLRuntimeVariable(type: .typeNumber, rawValue: dest.description)
-        }), forName: "add")
+        }), forNames: "add", "add:", "add:_:", "add:_:_:", "add:_:_:_:",
+                      "add:_:_:_:_:", "add:_:_:_:_:_:", "add:_:_:_:_:_:_:", "add:_:_:_:_:_:_:_:")
         self.setValue(XCTLRuntimeVariable(funcImpl: {
         self.setValue(XCTLRuntimeVariable(funcImpl: {
             var list = $0
             var list = $0
             list = list.filter({ $0.type == .typeNumber })
             list = list.filter({ $0.type == .typeNumber })
@@ -90,7 +93,8 @@ internal class XCTLRuntimeContext: XCTLRuntimeAbstractContext {
                 }
                 }
             }
             }
             return XCTLRuntimeVariable(type: .typeNumber, rawValue: dest.description)
             return XCTLRuntimeVariable(type: .typeNumber, rawValue: dest.description)
-        }), forName: "minus")
+        }), forNames: "minus", "minus:", "minus:_:", "minus:_:_:", "minus:_:_:_:",
+                      "minus:_:_:_:_:", "minus:_:_:_:_:_:", "minus:_:_:_:_:_:_:", "minus:_:_:_:_:_:_:_:")
         self.setValue(XCTLRuntimeVariable(funcImpl: {
         self.setValue(XCTLRuntimeVariable(funcImpl: {
             var dest: Double = 1
             var dest: Double = 1
             for it in $0 {
             for it in $0 {
@@ -99,7 +103,8 @@ internal class XCTLRuntimeContext: XCTLRuntimeAbstractContext {
                 }
                 }
             }
             }
             return XCTLRuntimeVariable(type: .typeNumber, rawValue: dest.description)
             return XCTLRuntimeVariable(type: .typeNumber, rawValue: dest.description)
-        }), forName: "mult")
+        }), forNames: "mult", "mult:", "mult:_:", "mult:_:_:", "mult:_:_:_:",
+                      "mult:_:_:_:_:", "mult:_:_:_:_:_:", "mult:_:_:_:_:_:_:", "mult:_:_:_:_:_:_:_:")
         self.setValue(XCTLRuntimeVariable(funcImpl: {
         self.setValue(XCTLRuntimeVariable(funcImpl: {
             var list = $0
             var list = $0
             list = list.filter({ $0.type == .typeNumber })
             list = list.filter({ $0.type == .typeNumber })
@@ -111,7 +116,8 @@ internal class XCTLRuntimeContext: XCTLRuntimeAbstractContext {
                 }
                 }
             }
             }
             return XCTLRuntimeVariable(type: .typeNumber, rawValue: dest.description)
             return XCTLRuntimeVariable(type: .typeNumber, rawValue: dest.description)
-        }), forName: "div")
+        }), forNames: "div", "div:", "div:_:", "div:_:_:", "div:_:_:_:",
+                      "div:_:_:_:_:", "div:_:_:_:_:_:", "div:_:_:_:_:_:_:", "div:_:_:_:_:_:_:_:")
         self.setValue(XCTLRuntimeVariable(funcImpl: {
         self.setValue(XCTLRuntimeVariable(funcImpl: {
             var begin: Double = 0
             var begin: Double = 0
             var length: Double = 0
             var length: Double = 0
@@ -130,7 +136,7 @@ internal class XCTLRuntimeContext: XCTLRuntimeAbstractContext {
                 step = args[2]
                 step = args[2]
             }
             }
             return XCTLRuntimeVariable(rawObject: XCTLRange(begin: begin, length: length, step: step))
             return XCTLRuntimeVariable(rawObject: XCTLRange(begin: begin, length: length, step: step))
-        }), forName: "range")
+        }), forNames: "range:", "range:_:", "range:_:_:")
         self.setValue(XCTLRuntimeVariable(type: .typeNumber, rawValue: "\(Bundle.main.infoDictionary?["CFBundleVersion"] as? String ?? "-1")"), forName: "appBundleVersion")
         self.setValue(XCTLRuntimeVariable(type: .typeNumber, rawValue: "\(Bundle.main.infoDictionary?["CFBundleVersion"] as? String ?? "-1")"), forName: "appBundleVersion")
         for it in paragraphMembers {
         for it in paragraphMembers {
             self.setValue(XCTLRuntimeVariable(funcImplStmt: it.value), forName: it.key)
             self.setValue(XCTLRuntimeVariable(funcImplStmt: it.value), forName: it.key)
@@ -171,9 +177,15 @@ internal class XCTLRuntimeContext: XCTLRuntimeAbstractContext {
     }
     }
     
     
     internal func setValue(_ value: XCTLRuntimeVariable, forName name: String) {
     internal func setValue(_ value: XCTLRuntimeVariable, forName name: String) {
-        self.values[name] = value
-        if exportNames.contains(name) {
-            self.nativeObjectInstance.setValue(value.nativeValue, forKey: name)
+        self.setValue(value, forNames: name)
+    }
+    
+    internal func setValue(_ value: XCTLRuntimeVariable, forNames names: String...) {
+        for name in names {
+            self.values[name] = value
+            if exportNames.contains(name) {
+                self.nativeObjectInstance.setValue(value.nativeValue, forKey: name)
+            }
         }
         }
     }
     }
     
     

+ 4 - 4
XCTreeLang/Runtime/XCTLRuntimeVariable.swift

@@ -12,7 +12,7 @@ public class XCTLRuntimeVariable {
     public var type: XCTLRuntimeVariableType
     public var type: XCTLRuntimeVariableType
     public var rawValue: String
     public var rawValue: String
     public var rawObject: NSObject?
     public var rawObject: NSObject?
-    public var rawFunction: (([XCTLRuntimeVariable]) -> XCTLRuntimeVariable)?
+    public var rawFunction: (([XCTLRuntimeVariable]) throws -> XCTLRuntimeVariable)?
     
     
 //    public var leftValue: XCTLRuntimeVariable?
 //    public var leftValue: XCTLRuntimeVariable?
 //    public var leftValueMemberName: String?
 //    public var leftValueMemberName: String?
@@ -43,7 +43,7 @@ public class XCTLRuntimeVariable {
         self.rawFunction = nil
         self.rawFunction = nil
     }
     }
     
     
-    public init(funcImpl: @escaping ([XCTLRuntimeVariable]) -> XCTLRuntimeVariable) {
+    public init(funcImpl: @escaping ([XCTLRuntimeVariable]) throws -> XCTLRuntimeVariable) {
         self.type = .typeFuncIntrinsic
         self.type = .typeFuncIntrinsic
         self.rawValue = ""
         self.rawValue = ""
         self.rawObject = nil
         self.rawObject = nil
@@ -101,8 +101,8 @@ public class XCTLRuntimeVariable {
         }
         }
     }
     }
     
     
-    public func executeFunc(arg: [XCTLRuntimeVariable]) -> XCTLRuntimeVariable {
-        return self.rawFunction!(arg)
+    public func executeFunc(arg: [XCTLRuntimeVariable]) throws -> XCTLRuntimeVariable {
+        return try self.rawFunction!(arg)
     }
     }
     
     
 }
 }

+ 2 - 0
XCTreeLang/Statements/XCTLBreakStatement.swift

@@ -39,6 +39,8 @@ internal class XCTLBreakStatement: XCTLStatement {
             throw XCTLCompileTimeError.unexpectParentStatementType(expect: "for", butGot: "...")
             throw XCTLCompileTimeError.unexpectParentStatementType(expect: "for", butGot: "...")
         }
         }
         try _ = lex.next()
         try _ = lex.next()
+        
+        lex.lastStatement = self
     }
     }
     
     
     func evaluate(inContext context: XCTLRuntimeAbstractContext) throws -> XCTLRuntimeVariable {
     func evaluate(inContext context: XCTLRuntimeAbstractContext) throws -> XCTLRuntimeVariable {

+ 2 - 0
XCTreeLang/Statements/XCTLContinueStatement.swift

@@ -39,6 +39,8 @@ internal class XCTLContinueStatement: XCTLStatement {
             throw XCTLCompileTimeError.unexpectParentStatementType(expect: "for", butGot: "...")
             throw XCTLCompileTimeError.unexpectParentStatementType(expect: "for", butGot: "...")
         }
         }
         try _ = lex.next()
         try _ = lex.next()
+        
+        lex.lastStatement = self
     }
     }
     
     
     func evaluate(inContext context: XCTLRuntimeAbstractContext) throws -> XCTLRuntimeVariable {
     func evaluate(inContext context: XCTLRuntimeAbstractContext) throws -> XCTLRuntimeVariable {

+ 2 - 0
XCTreeLang/Statements/XCTLElseStatement.swift

@@ -34,6 +34,8 @@ internal class XCTLElseStatement: XCTLStatement {
         }
         }
         self.condStmt = condStmt
         self.condStmt = condStmt
         try listStmts.parseStatement(fromLexerToSelf: lex, fromParent: self)
         try listStmts.parseStatement(fromLexerToSelf: lex, fromParent: self)
+        
+        lex.lastStatement = self
     }
     }
     
     
     func evaluate(inContext context: XCTLRuntimeAbstractContext) throws -> XCTLRuntimeVariable {
     func evaluate(inContext context: XCTLRuntimeAbstractContext) throws -> XCTLRuntimeVariable {

+ 2 - 0
XCTreeLang/Statements/XCTLEqualthanStatement.swift

@@ -36,6 +36,8 @@ internal class XCTLEqualthanStatement : XCTLStatement {
         try lex.next()
         try lex.next()
         self.compareValueStmt = try self.parseNextExpression(forLexer: lex, terminator: .typeOpenBrace)
         self.compareValueStmt = try self.parseNextExpression(forLexer: lex, terminator: .typeOpenBrace)
         try self.childrenStmt.parseStatement(fromLexerToSelf: lex, fromParent: self)
         try self.childrenStmt.parseStatement(fromLexerToSelf: lex, fromParent: self)
+        
+        lex.lastStatement = self
     }
     }
     
     
     func evaluate(inContext context: XCTLRuntimeAbstractContext) throws -> XCTLRuntimeVariable {
     func evaluate(inContext context: XCTLRuntimeAbstractContext) throws -> XCTLRuntimeVariable {

+ 2 - 0
XCTreeLang/Statements/XCTLExportStatement.swift

@@ -29,6 +29,8 @@ internal class XCTLExportStatement: XCTLStatement {
             throw XCTLCompileTimeError.unexpectTokenInStatement(expect: XCTLTokenType.typeIdentifier.rawValue, butGot: variableNameToken.type.rawValue)
             throw XCTLCompileTimeError.unexpectTokenInStatement(expect: XCTLTokenType.typeIdentifier.rawValue, butGot: variableNameToken.type.rawValue)
         }
         }
         self.variableName = variableNameToken.rawValue
         self.variableName = variableNameToken.rawValue
+        
+        lex.lastStatement = self
     }
     }
     
     
     func evaluate(inContext context: XCTLRuntimeAbstractContext) throws -> XCTLRuntimeVariable {
     func evaluate(inContext context: XCTLRuntimeAbstractContext) throws -> XCTLRuntimeVariable {

+ 2 - 0
XCTreeLang/Statements/XCTLForStatement.swift

@@ -46,6 +46,8 @@ public class XCTLForStatement: XCTLStatement {
         self.enumeratorVariableStatement = try self.parseNextExpression(forLexer: lex, terminator: .typeOpenBrace)
         self.enumeratorVariableStatement = try self.parseNextExpression(forLexer: lex, terminator: .typeOpenBrace)
         
         
         try self.listStatement.parseStatement(fromLexerToSelf: lex, fromParent: self)
         try self.listStatement.parseStatement(fromLexerToSelf: lex, fromParent: self)
+        
+        lex.lastStatement = self
     }
     }
     
     
     func evaluate(inContext context: XCTLRuntimeAbstractContext) throws -> XCTLRuntimeVariable {
     func evaluate(inContext context: XCTLRuntimeAbstractContext) throws -> XCTLRuntimeVariable {

+ 37 - 1
XCTreeLang/Statements/XCTLFunctionCallStatement.swift

@@ -19,6 +19,8 @@ internal class XCTLFunctionCallStatement: XCTLStatement, XCTLExpressionPart {
     
     
     weak var parent: XCTLStatement?
     weak var parent: XCTLStatement?
     
     
+    var selectorAppendix = ""
+    
     func matchSelfStatement(lex: XCTLLexer) throws -> XCTLStatement? {
     func matchSelfStatement(lex: XCTLLexer) throws -> XCTLStatement? {
         if try lex.next().type == .typeOpenBracket {
         if try lex.next().type == .typeOpenBracket {
             return XCTLFunctionCallStatement()
             return XCTLFunctionCallStatement()
@@ -29,13 +31,47 @@ internal class XCTLFunctionCallStatement: XCTLStatement, XCTLExpressionPart {
     func parseStatement(fromLexerToSelf lex: XCTLLexer, fromParent: XCTLStatement?) throws {
     func parseStatement(fromLexerToSelf lex: XCTLLexer, fromParent: XCTLStatement?) throws {
         self.parent = fromParent
         self.parent = fromParent
         
         
+        guard let variable = lex.lastStatement as? XCTLVariableRefStatement else {
+            throw XCTLCompileTimeError.invalidObjectForFuncCall
+        }
+        
         _ = try lex.next()
         _ = try lex.next()
         
         
+        var firstArg = true
         while try lex.peek().type != .typeCloseBracket {
         while try lex.peek().type != .typeCloseBracket {
+            let pos = lex.position
+            if (try? lex.next().type) == .typeIdentifier,
+               (try? lex.next().type) == .typeColon {
+                lex.position = pos
+                var flag = try lex.next().rawValue
+                try lex.next()
+                if firstArg {
+                    selectorAppendix.append("With")
+                    flag = flag.removeFirst().uppercased() + flag
+                    selectorAppendix.append(flag)
+                } else {
+                    selectorAppendix.append(flag)
+                }
+            } else {
+                lex.position = pos
+                if !firstArg {
+                    selectorAppendix.append("_")
+                }
+            }
+            selectorAppendix.append(":")
             self.argumentStatements.append(try self.parseNextExpression(forLexer: lex))
             self.argumentStatements.append(try self.parseNextExpression(forLexer: lex))
+            firstArg = false
         }
         }
         
         
+        var childVariable = variable
+        while let c = childVariable.nextVariableRefStmt {
+            childVariable = c
+        }
+        childVariable.variableName.append(selectorAppendix)
+        
         try lex.next()
         try lex.next()
+        
+        lex.lastStatement = self
     }
     }
     
     
     func evaluate(inContext context: XCTLRuntimeAbstractContext) throws -> XCTLRuntimeVariable {
     func evaluate(inContext context: XCTLRuntimeAbstractContext) throws -> XCTLRuntimeVariable {
@@ -50,7 +86,7 @@ internal class XCTLFunctionCallStatement: XCTLStatement, XCTLExpressionPart {
             if funcValue.type != .typeFuncIntrinsic {
             if funcValue.type != .typeFuncIntrinsic {
                 throw XCTLRuntimeError.unexpectedVariableType(expect: XCTLRuntimeVariableType.typeFuncIntrinsic.rawValue, butGot: funcValue.type.rawValue)
                 throw XCTLRuntimeError.unexpectedVariableType(expect: XCTLRuntimeVariableType.typeFuncIntrinsic.rawValue, butGot: funcValue.type.rawValue)
             }
             }
-            let result = funcValue.executeFunc(arg: arg)
+            let result = try funcValue.executeFunc(arg: arg)
             context.variableStack.pushVariable(result)
             context.variableStack.pushVariable(result)
             return result
             return result
         }
         }

+ 2 - 0
XCTreeLang/Statements/XCTLImmediateStatement.swift

@@ -28,6 +28,8 @@ internal class XCTLImmediateStatement: XCTLStatement, XCTLExpressionPart {
     func parseStatement(fromLexerToSelf lex: XCTLLexer, fromParent: XCTLStatement?) throws {
     func parseStatement(fromLexerToSelf lex: XCTLLexer, fromParent: XCTLStatement?) throws {
         self.parent = fromParent
         self.parent = fromParent
         self.immediateToken = try lex.next()
         self.immediateToken = try lex.next()
+        
+        lex.lastStatement = self
     }
     }
     
     
     func evaluate(inContext context: XCTLRuntimeAbstractContext) throws -> XCTLRuntimeVariable {
     func evaluate(inContext context: XCTLRuntimeAbstractContext) throws -> XCTLRuntimeVariable {

+ 2 - 0
XCTreeLang/Statements/XCTLImportStatement.swift

@@ -29,6 +29,8 @@ internal class XCTLImportStatement: XCTLStatement {
             throw XCTLCompileTimeError.unexpectTokenInStatement(expect: XCTLTokenType.typeIdentifier.rawValue, butGot: variableNameToken.type.rawValue)
             throw XCTLCompileTimeError.unexpectTokenInStatement(expect: XCTLTokenType.typeIdentifier.rawValue, butGot: variableNameToken.type.rawValue)
         }
         }
         self.variableName = variableNameToken.rawValue
         self.variableName = variableNameToken.rawValue
+        
+        lex.lastStatement = self
     }
     }
     
     
     func evaluate(inContext context: XCTLRuntimeAbstractContext) throws -> XCTLRuntimeVariable {
     func evaluate(inContext context: XCTLRuntimeAbstractContext) throws -> XCTLRuntimeVariable {

+ 2 - 0
XCTreeLang/Statements/XCTLInitStatement.swift

@@ -78,6 +78,8 @@ internal class XCTLInitStatement: XCTLStatement {
             }
             }
             try lex.next()
             try lex.next()
         }
         }
+        
+        lex.lastStatement = self
     }
     }
     
     
     func evaluate(inContext context: XCTLRuntimeAbstractContext) throws -> XCTLRuntimeVariable {
     func evaluate(inContext context: XCTLRuntimeAbstractContext) throws -> XCTLRuntimeVariable {

+ 2 - 0
XCTreeLang/Statements/XCTLLazyEqualStatement.swift

@@ -43,6 +43,8 @@ internal class XCTLLazyEqualStatement: XCTLStatement {
             throw XCTLCompileTimeError.unexpectTokenInStatement(expect: XCTLTokenType.typeEqual.rawValue, butGot: equalToken.type.rawValue)
             throw XCTLCompileTimeError.unexpectTokenInStatement(expect: XCTLTokenType.typeEqual.rawValue, butGot: equalToken.type.rawValue)
         }
         }
         self.equalToStatement = try self.parseNextExpression(forLexer: lex)
         self.equalToStatement = try self.parseNextExpression(forLexer: lex)
+        
+        lex.lastStatement = self
     }
     }
     
     
     func evaluate(inContext context: XCTLRuntimeAbstractContext) throws -> XCTLRuntimeVariable {
     func evaluate(inContext context: XCTLRuntimeAbstractContext) throws -> XCTLRuntimeVariable {

+ 2 - 0
XCTreeLang/Statements/XCTLLessthanStatement.swift

@@ -40,6 +40,8 @@ internal class XCTLLessthanStatement : XCTLStatement {
         try lex.next()
         try lex.next()
         self.compareValueStmt = try self.parseNextExpression(forLexer: lex, terminator: .typeOpenBrace)
         self.compareValueStmt = try self.parseNextExpression(forLexer: lex, terminator: .typeOpenBrace)
         try self.childrenStmt.parseStatement(fromLexerToSelf: lex, fromParent: self)
         try self.childrenStmt.parseStatement(fromLexerToSelf: lex, fromParent: self)
+        
+        lex.lastStatement = self
     }
     }
     
     
     func evaluate(inContext context: XCTLRuntimeAbstractContext) throws -> XCTLRuntimeVariable {
     func evaluate(inContext context: XCTLRuntimeAbstractContext) throws -> XCTLRuntimeVariable {

+ 2 - 0
XCTreeLang/Statements/XCTLMorethanStatement.swift

@@ -40,6 +40,8 @@ internal class XCTLMorethanStatement : XCTLStatement {
         try lex.next()
         try lex.next()
         self.compareValueStmt = try self.parseNextExpression(forLexer: lex, terminator: .typeOpenBrace)
         self.compareValueStmt = try self.parseNextExpression(forLexer: lex, terminator: .typeOpenBrace)
         try self.childrenStmt.parseStatement(fromLexerToSelf: lex, fromParent: self)
         try self.childrenStmt.parseStatement(fromLexerToSelf: lex, fromParent: self)
+        
+        lex.lastStatement = self
     }
     }
     
     
     func evaluate(inContext context: XCTLRuntimeAbstractContext) throws -> XCTLRuntimeVariable {
     func evaluate(inContext context: XCTLRuntimeAbstractContext) throws -> XCTLRuntimeVariable {

+ 2 - 0
XCTreeLang/Statements/XCTLNextthanStatement.swift

@@ -30,6 +30,8 @@ internal class XCTLNextthanStatement: XCTLStatement {
             throw XCTLCompileTimeError.unexpectParentStatementType(expect: "codeList & cond", butGot: "\(fromParent?.type.rawValue ?? "none")")
             throw XCTLCompileTimeError.unexpectParentStatementType(expect: "codeList & cond", butGot: "\(fromParent?.type.rawValue ?? "none")")
         }
         }
         try lex.next()
         try lex.next()
+        
+        lex.lastStatement = self
     }
     }
     
     
     func evaluate(inContext context: XCTLRuntimeAbstractContext) throws -> XCTLRuntimeVariable {
     func evaluate(inContext context: XCTLRuntimeAbstractContext) throws -> XCTLRuntimeVariable {

+ 29 - 0
XCTreeLang/Statements/XCTLParagraphStatement.swift

@@ -19,6 +19,8 @@ internal class XCTLParagraphStatement: XCTLStatement, XCTLLateExecuteStatement {
     var runStatements = XCTLListStatement()
     var runStatements = XCTLListStatement()
     weak var parent: XCTLStatement?
     weak var parent: XCTLStatement?
     
     
+    var selectorAppendix = ""
+    
     func matchSelfStatement(lex: XCTLLexer) throws -> XCTLStatement? {
     func matchSelfStatement(lex: XCTLLexer) throws -> XCTLStatement? {
         if try lex.next().type == .typeParagraph {
         if try lex.next().type == .typeParagraph {
             return XCTLParagraphStatement()
             return XCTLParagraphStatement()
@@ -36,15 +38,40 @@ internal class XCTLParagraphStatement: XCTLStatement, XCTLLateExecuteStatement {
         self.paragraphName = nameToken.rawValue
         self.paragraphName = nameToken.rawValue
         if try lex.peek().type == .typeOpenBracket {
         if try lex.peek().type == .typeOpenBracket {
             try lex.next()
             try lex.next()
+            
+            var firstArg = true
             while try lex.peek().type != .typeCloseBracket {
             while try lex.peek().type != .typeCloseBracket {
+                let pos = lex.position
+                if (try? lex.next().type) == .typeIdentifier,
+                   (try? lex.next().type) == .typeColon {
+                    lex.position = pos
+                    var flag = try lex.next().rawValue
+                    try lex.next()
+                    if firstArg {
+                        selectorAppendix.append("With")
+                        flag = flag.removeFirst().uppercased() + flag
+                    }
+                    selectorAppendix.append(flag)
+                } else {
+                    lex.position = pos
+                    if !firstArg {
+                        selectorAppendix.append("_")
+                    }
+                }
+                selectorAppendix.append(":")
+                
                 let idToken = try lex.next()
                 let idToken = try lex.next()
                 if idToken.type != .typeIdentifier {
                 if idToken.type != .typeIdentifier {
                     throw XCTLCompileTimeError.unexpectTokenInStatement(expect: XCTLTokenType.typeIdentifier.rawValue, butGot: idToken.rawValue)
                     throw XCTLCompileTimeError.unexpectTokenInStatement(expect: XCTLTokenType.typeIdentifier.rawValue, butGot: idToken.rawValue)
                 }
                 }
                 self.argumentIdList.append(idToken.rawValue)
                 self.argumentIdList.append(idToken.rawValue)
+                
+                firstArg = false
             }
             }
             try lex.next()
             try lex.next()
         }
         }
+        self.paragraphName.append(self.selectorAppendix)
+        
         self.runStatements.parent = self
         self.runStatements.parent = self
         self.runStatements.paragraphHold = true
         self.runStatements.paragraphHold = true
         try self.runStatements.parseStatement(fromLexerToSelf: lex, fromParent: self)
         try self.runStatements.parseStatement(fromLexerToSelf: lex, fromParent: self)
@@ -52,6 +79,8 @@ internal class XCTLParagraphStatement: XCTLStatement, XCTLLateExecuteStatement {
             throw XCTLCompileTimeError.tooMuchParagraphDefinitionForName(name: self.paragraphName)
             throw XCTLCompileTimeError.tooMuchParagraphDefinitionForName(name: self.paragraphName)
         }
         }
         lex.paragraphTable[self.paragraphName] = self
         lex.paragraphTable[self.paragraphName] = self
+        
+        lex.lastStatement = self
     }
     }
     
     
     func evaluate(inContext context: XCTLRuntimeAbstractContext) throws -> XCTLRuntimeVariable {
     func evaluate(inContext context: XCTLRuntimeAbstractContext) throws -> XCTLRuntimeVariable {

+ 2 - 0
XCTreeLang/Statements/XCTLReturnStatement.swift

@@ -42,6 +42,8 @@ internal class XCTLReturnStatement: XCTLStatement {
         try lex.next()
         try lex.next()
         
         
         self.returnValueStatement = try self.parseNextExpression(forLexer: lex)
         self.returnValueStatement = try self.parseNextExpression(forLexer: lex)
+        
+        lex.lastStatement = self
     }
     }
     
     
     func evaluate(inContext context: XCTLRuntimeAbstractContext) throws -> XCTLRuntimeVariable {
     func evaluate(inContext context: XCTLRuntimeAbstractContext) throws -> XCTLRuntimeVariable {

+ 2 - 0
XCTreeLang/Statements/XCTLRootStatement.swift

@@ -26,6 +26,8 @@ internal class XCTLRootStatement: XCTLStatement {
             let statement = try self.parseNextStatement(forLexer: lex)
             let statement = try self.parseNextStatement(forLexer: lex)
             self.statements.append(statement)
             self.statements.append(statement)
         }
         }
+        
+        lex.lastStatement = self
     }
     }
     
     
     func evaluate(inContext context: XCTLRuntimeAbstractContext) throws -> XCTLRuntimeVariable {
     func evaluate(inContext context: XCTLRuntimeAbstractContext) throws -> XCTLRuntimeVariable {

+ 2 - 0
XCTreeLang/Statements/XCTLSetStatement.swift

@@ -35,6 +35,8 @@ internal class XCTLSetStatement: XCTLStatement {
         }
         }
         
         
         self.setToStatement = try self.parseNextExpression(forLexer: lex)
         self.setToStatement = try self.parseNextExpression(forLexer: lex)
+        
+        lex.lastStatement = self
     }
     }
     
     
     func evaluate(inContext context: XCTLRuntimeAbstractContext) throws -> XCTLRuntimeVariable {
     func evaluate(inContext context: XCTLRuntimeAbstractContext) throws -> XCTLRuntimeVariable {

+ 2 - 0
XCTreeLang/Statements/XCTLSwitchStatement.swift

@@ -34,6 +34,8 @@ internal class XCTLSwitchStatement: XCTLStatement, XCTLConditionParentStatement
         try lex.next()
         try lex.next()
         self.switchingObjectStmt = try self.parseNextExpression(forLexer: lex, terminator: .typeOpenBrace)
         self.switchingObjectStmt = try self.parseNextExpression(forLexer: lex, terminator: .typeOpenBrace)
         try self.childrenStmt.parseStatement(fromLexerToSelf: lex, fromParent: self)
         try self.childrenStmt.parseStatement(fromLexerToSelf: lex, fromParent: self)
+        
+        lex.lastStatement = self
     }
     }
     
     
     func evaluate(inContext context: XCTLRuntimeAbstractContext) throws -> XCTLRuntimeVariable {
     func evaluate(inContext context: XCTLRuntimeAbstractContext) throws -> XCTLRuntimeVariable {

+ 46 - 4
XCTreeLang/Statements/XCTLVariableRefStatement.swift

@@ -6,6 +6,7 @@
 //
 //
 
 
 import Foundation
 import Foundation
+import XCTLRuntimeTypeInstanceModule
 
 
 internal class XCTLVariableRefStatement: XCTLStatement, XCTLBackableStatement, XCTLExpressionPart {
 internal class XCTLVariableRefStatement: XCTLStatement, XCTLBackableStatement, XCTLExpressionPart {
     
     
@@ -40,6 +41,8 @@ internal class XCTLVariableRefStatement: XCTLStatement, XCTLBackableStatement, X
             self.nextVariableRefStmt = XCTLVariableRefStatement()
             self.nextVariableRefStmt = XCTLVariableRefStatement()
             try self.nextVariableRefStmt?.parseStatement(fromLexerToSelf: lex, fromParent: fromParent)
             try self.nextVariableRefStmt?.parseStatement(fromLexerToSelf: lex, fromParent: fromParent)
         }
         }
+        
+        lex.lastStatement = self
     }
     }
     
     
     func evaluate(inContext context: XCTLRuntimeAbstractContext) throws -> XCTLRuntimeVariable {
     func evaluate(inContext context: XCTLRuntimeAbstractContext) throws -> XCTLRuntimeVariable {
@@ -57,8 +60,40 @@ internal class XCTLVariableRefStatement: XCTLStatement, XCTLBackableStatement, X
                 throw XCTLRuntimeError.unknownMemberForVariable(memberName: memberName, variableName: refName)
                 throw XCTLRuntimeError.unknownMemberForVariable(memberName: memberName, variableName: refName)
             }
             }
             let rawObject = currentValue.objectValue
             let rawObject = currentValue.objectValue
-            guard let obj = rawObject.value(forKey: memberName),
-                  let obj = obj as? NSObject else {
+            
+            if nextStmt.nextVariableRefStmt == nil {
+                let selector = NSSelectorFromString(memberName)
+                if rawObject.responds(to: selector) {
+                    let funcIntrinsicVariable = XCTLRuntimeVariable { args in
+                        let invocation = try Invocation(target: rawObject, selector: selector)
+                        for index in 0..<invocation.numberOfArguments - 2 {
+                            let arg = args[index]
+                            if arg.type == .typeNumber {
+                                invocation.setArgument(arg.doubleValue, at: index + 2)
+                            } else {
+                                invocation.setArgument(arg.nativeValue, at: index + 2)
+                            }
+                        }
+                        invocation.invoke()
+                        if invocation.returnsObject,
+                           let object = invocation.returnedObject as? NSObject {
+                            return XCTLRuntimeVariable(rawObject: object)
+                        }
+                        return .void
+                    }
+                    context.variableStack.pushVariable(funcIntrinsicVariable)
+                    return funcIntrinsicVariable
+                }
+            }
+            
+            var obj: Any?
+            let exception = ocTryCatch {
+                obj = rawObject.value(forKey: memberName)
+            }
+            if exception != nil {
+                throw XCTLRuntimeError.unknownMemberForVariable(memberName: memberName, variableName: refName)
+            }
+            guard let obj = obj as? NSObject else {
                 throw XCTLRuntimeError.unknownMemberForVariable(memberName: memberName, variableName: refName)
                 throw XCTLRuntimeError.unknownMemberForVariable(memberName: memberName, variableName: refName)
             }
             }
             let newValue = XCTLRuntimeVariable(rawObject: obj)
             let newValue = XCTLRuntimeVariable(rawObject: obj)
@@ -96,10 +131,17 @@ internal class XCTLVariableRefStatement: XCTLStatement, XCTLBackableStatement, X
                 break
                 break
             }
             }
             
             
-            guard let obj = rawObject.value(forKey: memberName),
-                  let obj = obj as? NSObject else {
+            var obj: Any?
+            let exception = ocTryCatch {
+                obj = rawObject.value(forKey: memberName)
+            }
+            if exception != nil {
                 throw XCTLRuntimeError.unknownMemberForVariable(memberName: memberName, variableName: refName)
                 throw XCTLRuntimeError.unknownMemberForVariable(memberName: memberName, variableName: refName)
             }
             }
+            guard let obj = obj as? NSObject else {
+                throw XCTLRuntimeError.unknownMemberForVariable(memberName: memberName, variableName: refName)
+            }
+            
             let newValue = XCTLRuntimeVariable(rawObject: obj)
             let newValue = XCTLRuntimeVariable(rawObject: obj)
 //            newValue.leftValue = currentValue
 //            newValue.leftValue = currentValue
 //            newValue.leftValueMemberName = memberName
 //            newValue.leftValueMemberName = memberName

+ 2 - 0
XCTreeLang/XCTLCompileTimeError.swift

@@ -20,4 +20,6 @@ public enum XCTLCompileTimeError: Error {
     case duplicatedMemberVariable(name: String)
     case duplicatedMemberVariable(name: String)
     case duplicatedMemberParagraph(name: String)
     case duplicatedMemberParagraph(name: String)
     
     
+    case invalidObjectForFuncCall
+    
 }
 }