Skip to content

Commit

Permalink
Merge pull request #5 from quephird/implement_resolver
Browse files Browse the repository at this point in the history
Implement resolver
  • Loading branch information
quephird committed Mar 4, 2024
2 parents 3c7dcbc + e59c54d commit 6d1c880
Show file tree
Hide file tree
Showing 15 changed files with 861 additions and 120 deletions.
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
}

0 comments on commit 6d1c880

Please sign in to comment.