Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Implement resolver #5

Merged
merged 10 commits into from Mar 4, 2024
24 changes: 24 additions & 0 deletions TestPlan.xctestplan
@@ -0,0 +1,24 @@
{
"configurations" : [
{
"id" : "B46B5910-702E-49A1-AC55-98D04F278EE5",
"name" : "Configuration 1",
"options" : {

}
}
],
"defaultOptions" : {
"testTimeoutsEnabled" : true
},
"testTargets" : [
{
"target" : {
"containerPath" : "container:slox.xcodeproj",
"identifier" : "876A31532B8979BD0085A350",
"name" : "sloxTests"
}
}
],
"version" : 1
}
42 changes: 42 additions & 0 deletions slox.xcodeproj/project.pbxproj
Expand Up @@ -7,8 +7,21 @@
objects = {

/* Begin PBXBuildFile section */
870230752B9571490056FE57 /* MutableCollection+Extension.swift in Sources */ = {isa = PBXBuildFile; fileRef = 870230742B9571490056FE57 /* MutableCollection+Extension.swift */; };
870230772B9575250056FE57 /* ResolverError.swift in Sources */ = {isa = PBXBuildFile; fileRef = 873283972B9523AD00E49035 /* ResolverError.swift */; };
870230782B95752C0056FE57 /* FunctionType.swift in Sources */ = {isa = PBXBuildFile; fileRef = 873283992B956A2F00E49035 /* FunctionType.swift */; };
870230792B9575420056FE57 /* MutableCollection+Extension.swift in Sources */ = {isa = PBXBuildFile; fileRef = 870230742B9571490056FE57 /* MutableCollection+Extension.swift */; };
8702307A2B9575460056FE57 /* Resolver.swift in Sources */ = {isa = PBXBuildFile; fileRef = 873283952B95127100E49035 /* Resolver.swift */; };
8702307B2B95755E0056FE57 /* ResolvedExpression.swift in Sources */ = {isa = PBXBuildFile; fileRef = 873283912B95118A00E49035 /* ResolvedExpression.swift */; };
8702307C2B9575610056FE57 /* ResolvedStatement.swift in Sources */ = {isa = PBXBuildFile; fileRef = 873283932B95122800E49035 /* ResolvedStatement.swift */; };
8702307E2B95AA2A0056FE57 /* ResolverTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8702307D2B95AA2A0056FE57 /* ResolverTests.swift */; };
8732838F2B93F89300E49035 /* NativeFunction.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8732838E2B93F89300E49035 /* NativeFunction.swift */; };
873283902B93FC0900E49035 /* NativeFunction.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8732838E2B93F89300E49035 /* NativeFunction.swift */; };
873283922B95118A00E49035 /* ResolvedExpression.swift in Sources */ = {isa = PBXBuildFile; fileRef = 873283912B95118A00E49035 /* ResolvedExpression.swift */; };
873283942B95122800E49035 /* ResolvedStatement.swift in Sources */ = {isa = PBXBuildFile; fileRef = 873283932B95122800E49035 /* ResolvedStatement.swift */; };
873283962B95127100E49035 /* Resolver.swift in Sources */ = {isa = PBXBuildFile; fileRef = 873283952B95127100E49035 /* Resolver.swift */; };
873283982B9523AD00E49035 /* ResolverError.swift in Sources */ = {isa = PBXBuildFile; fileRef = 873283972B9523AD00E49035 /* ResolverError.swift */; };
8732839A2B956A2F00E49035 /* FunctionType.swift in Sources */ = {isa = PBXBuildFile; fileRef = 873283992B956A2F00E49035 /* FunctionType.swift */; };
873CCB212B8D5FAE00FC249A /* Interpreter.swift in Sources */ = {isa = PBXBuildFile; fileRef = 873CCB202B8D5FAE00FC249A /* Interpreter.swift */; };
873CCB232B8D617C00FC249A /* RuntimeError.swift in Sources */ = {isa = PBXBuildFile; fileRef = 873CCB222B8D617C00FC249A /* RuntimeError.swift */; };
873CCB252B8D765D00FC249A /* Lox.swift in Sources */ = {isa = PBXBuildFile; fileRef = 873CCB242B8D765D00FC249A /* Lox.swift */; };
Expand Down Expand Up @@ -58,7 +71,15 @@
/* End PBXCopyFilesBuildPhase section */

/* Begin PBXFileReference section */
870230742B9571490056FE57 /* MutableCollection+Extension.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "MutableCollection+Extension.swift"; sourceTree = "<group>"; };
870230762B9574A90056FE57 /* TestPlan.xctestplan */ = {isa = PBXFileReference; lastKnownFileType = text; path = TestPlan.xctestplan; sourceTree = "<group>"; };
8702307D2B95AA2A0056FE57 /* ResolverTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ResolverTests.swift; sourceTree = "<group>"; };
8732838E2B93F89300E49035 /* NativeFunction.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NativeFunction.swift; sourceTree = "<group>"; };
873283912B95118A00E49035 /* ResolvedExpression.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ResolvedExpression.swift; sourceTree = "<group>"; };
873283932B95122800E49035 /* ResolvedStatement.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ResolvedStatement.swift; sourceTree = "<group>"; };
873283952B95127100E49035 /* Resolver.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Resolver.swift; sourceTree = "<group>"; };
873283972B9523AD00E49035 /* ResolverError.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ResolverError.swift; sourceTree = "<group>"; };
873283992B956A2F00E49035 /* FunctionType.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FunctionType.swift; sourceTree = "<group>"; };
873CCB202B8D5FAE00FC249A /* Interpreter.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Interpreter.swift; sourceTree = "<group>"; };
873CCB222B8D617C00FC249A /* RuntimeError.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RuntimeError.swift; sourceTree = "<group>"; };
873CCB242B8D765D00FC249A /* Lox.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Lox.swift; sourceTree = "<group>"; };
Expand Down Expand Up @@ -105,6 +126,7 @@
children = (
87655FFA2B88210A002BDE42 /* slox */,
876A31552B8979BD0085A350 /* sloxTests */,
870230762B9574A90056FE57 /* TestPlan.xctestplan */,
87655FF92B88210A002BDE42 /* Products */,
);
sourceTree = "<group>";
Expand All @@ -123,13 +145,19 @@
children = (
873CCB322B8ED8B900FC249A /* Environment.swift */,
876A31642B8C04990085A350 /* Expression.swift */,
873283992B956A2F00E49035 /* FunctionType.swift */,
873CCB202B8D5FAE00FC249A /* Interpreter.swift */,
873CCB242B8D765D00FC249A /* Lox.swift */,
87BAFC482B9179CB0013E5FE /* LoxCallable.swift */,
876A315E2B897EEB0085A350 /* LoxValue.swift */,
870230742B9571490056FE57 /* MutableCollection+Extension.swift */,
8732838E2B93F89300E49035 /* NativeFunction.swift */,
876A31682B8C3AAB0085A350 /* ParseError.swift */,
876A31662B8C11810085A350 /* Parser.swift */,
873283912B95118A00E49035 /* ResolvedExpression.swift */,
873283932B95122800E49035 /* ResolvedStatement.swift */,
873283952B95127100E49035 /* Resolver.swift */,
873283972B9523AD00E49035 /* ResolverError.swift */,
877168C12B91A9BD00723543 /* Return.swift */,
873CCB222B8D617C00FC249A /* RuntimeError.swift */,
876A31612B8986630085A350 /* ScanError.swift */,
Expand All @@ -147,6 +175,7 @@
children = (
876A31562B8979BD0085A350 /* ScannerTests.swift */,
873CCB262B8E7AD100FC249A /* ParserTests.swift */,
8702307D2B95AA2A0056FE57 /* ResolverTests.swift */,
873CCB2B2B8E88A500FC249A /* InterpreterTests.swift */,
);
path = sloxTests;
Expand Down Expand Up @@ -243,20 +272,26 @@
files = (
876A31622B8986630085A350 /* ScanError.swift in Sources */,
876560052B8825AC002BDE42 /* Token.swift in Sources */,
873283942B95122800E49035 /* ResolvedStatement.swift in Sources */,
876A315F2B897EEB0085A350 /* LoxValue.swift in Sources */,
873283982B9523AD00E49035 /* ResolverError.swift in Sources */,
873CCB302B8EAEC100FC249A /* Statement.swift in Sources */,
873CCB232B8D617C00FC249A /* RuntimeError.swift in Sources */,
87BAFC492B9179CB0013E5FE /* LoxCallable.swift in Sources */,
873CCB212B8D5FAE00FC249A /* Interpreter.swift in Sources */,
877168C22B91A9BD00723543 /* Return.swift in Sources */,
876A31672B8C11810085A350 /* Parser.swift in Sources */,
8732839A2B956A2F00E49035 /* FunctionType.swift in Sources */,
876560072B8827F9002BDE42 /* Scanner.swift in Sources */,
87BAFC4B2B918C520013E5FE /* UserDefinedFunction.swift in Sources */,
873CCB332B8ED8B900FC249A /* Environment.swift in Sources */,
876A31652B8C04990085A350 /* Expression.swift in Sources */,
876560032B882259002BDE42 /* TokenType.swift in Sources */,
873283962B95127100E49035 /* Resolver.swift in Sources */,
8732838F2B93F89300E49035 /* NativeFunction.swift in Sources */,
873283922B95118A00E49035 /* ResolvedExpression.swift in Sources */,
876A31692B8C3AAB0085A350 /* ParseError.swift in Sources */,
870230752B9571490056FE57 /* MutableCollection+Extension.swift in Sources */,
873CCB252B8D765D00FC249A /* Lox.swift in Sources */,
);
runOnlyForDeploymentPostprocessing = 0;
Expand All @@ -265,24 +300,31 @@
isa = PBXSourcesBuildPhase;
buildActionMask = 2147483647;
files = (
8702307C2B9575610056FE57 /* ResolvedStatement.swift in Sources */,
873CCB2D2B8E88C900FC249A /* Interpreter.swift in Sources */,
876A31632B8987740085A350 /* ScanError.swift in Sources */,
873CCB2C2B8E88A500FC249A /* InterpreterTests.swift in Sources */,
8702307A2B9575460056FE57 /* Resolver.swift in Sources */,
873CCB2E2B8E88D200FC249A /* RuntimeError.swift in Sources */,
873CCB342B8EE0FF00FC249A /* Environment.swift in Sources */,
8755B8B42B91983F00530DC4 /* UserDefinedFunction.swift in Sources */,
870230772B9575250056FE57 /* ResolverError.swift in Sources */,
8702307E2B95AA2A0056FE57 /* ResolverTests.swift in Sources */,
876A315C2B897C000085A350 /* Token.swift in Sources */,
876A31572B8979BD0085A350 /* ScannerTests.swift in Sources */,
876A31602B89827B0085A350 /* LoxValue.swift in Sources */,
870230782B95752C0056FE57 /* FunctionType.swift in Sources */,
873CCB312B8EBB7800FC249A /* Statement.swift in Sources */,
8755B8B52B91984C00530DC4 /* LoxCallable.swift in Sources */,
873283902B93FC0900E49035 /* NativeFunction.swift in Sources */,
8702307B2B95755E0056FE57 /* ResolvedExpression.swift in Sources */,
87C2F3742B91C2BA00126707 /* Return.swift in Sources */,
873CCB282B8E7B6300FC249A /* Parser.swift in Sources */,
873CCB272B8E7AD100FC249A /* ParserTests.swift in Sources */,
876A315D2B897C020085A350 /* Scanner.swift in Sources */,
876A315B2B897BFD0085A350 /* TokenType.swift in Sources */,
873CCB292B8E7B6900FC249A /* ParseError.swift in Sources */,
870230792B9575420056FE57 /* MutableCollection+Extension.swift in Sources */,
873CCB2A2B8E7BB600FC249A /* Expression.swift in Sources */,
);
runOnlyForDeploymentPostprocessing = 0;
Expand Down
35 changes: 23 additions & 12 deletions slox/Environment.swift
Expand Up @@ -17,30 +17,41 @@ class Environment: Equatable {
values[name] = value
}

func assign(name: String, value: LoxValue) throws {
if values.keys.contains(name) {
values[name] = value
return
}
func assignAtDepth(name: String, value: LoxValue, depth: Int) throws {
let ancestor = try ancestor(depth: depth)

if let enclosingEnvironment = enclosingEnvironment {
try enclosingEnvironment.assign(name: name, value: value)
if ancestor.values.keys.contains(name) {
ancestor.values[name] = value
return
}

throw RuntimeError.undefinedVariable(name)
}

func getValue(name: String) throws -> LoxValue {
if let value = values[name] {
func getValueAtDepth(name: String, depth: Int) throws -> LoxValue {
let ancestor = try ancestor(depth: depth)

if let value = ancestor.values[name] {
return value
}

if let enclosingEnvironment = enclosingEnvironment {
return try enclosingEnvironment.getValue(name: name)
throw RuntimeError.undefinedVariable(name)
}

private func ancestor(depth: Int) throws -> Environment {
var i = 0
var ancestor: Environment = self
while i < depth {
guard let parent = ancestor.enclosingEnvironment else {
// NOTA BENE: This should not happen but it _is_ possible
throw RuntimeError.couldNotFindAncestorEnvironmentAtDepth(depth)
}

ancestor = parent
i = i + 1
}

throw RuntimeError.undefinedVariable(name)
return ancestor
}

static func == (lhs: Environment, rhs: Environment) -> Bool {
Expand Down
12 changes: 12 additions & 0 deletions slox/FunctionType.swift
@@ -0,0 +1,12 @@
//
// FunctionType.swift
// slox
//
// Created by Danielle Kefford on 3/3/24.
//

enum FunctionType {
case none
case function
case lambda
}