language

Unnamed repository; edit this file 'description' to name the repository.
Log | Files | Refs | README

commit 64e83e42aef2b9a2990292d9d42ef21f459cc7c3
parent fd937c7f328509c1b4b8329a6460c99e079cb2b8
Author: Paul Longtine <paullongtine@gmail.com>
Date:   Thu, 30 Jun 2016 13:13:16 -0400

It can find names properly now... I just need to figure out the other end.

Diffstat:
Msrc/lc/bytecode.py | 6+++---
Msrc/lc/helper.py | 1+
Msrc/lc/interpreter.py | 2++
Msrc/lc/main.py | 2+-
Msrc/lc/namespace.py | 36+++++++++++++++++++++++-------------
Msrc/lc/test_files/class.ti | 2--
6 files changed, 30 insertions(+), 19 deletions(-)

diff --git a/src/lc/bytecode.py b/src/lc/bytecode.py @@ -95,7 +95,7 @@ class VariableAssignment(): def action(self): if self.label.is_property: - return(PropertyAssignment(self.label.obj, + return(PropertyAssignment(self.label.parent, self.label, self.expr).action()) else: @@ -112,7 +112,7 @@ class VariableGet(): def action(self): if self.label.is_property: - return(PropertyGet(self.label.obj, self.label).action()) + return(PropertyGet(self.label.parent, self.label).action()) else: return([ OP_LOV, @@ -142,7 +142,7 @@ class FunctionCall(): def action(self): if self.label.is_property: - return(MethodCall(self.label.obj, + return(MethodCall(self.label.parent, self.label, self.arguements).action()) else: diff --git a/src/lc/helper.py b/src/lc/helper.py @@ -42,6 +42,7 @@ def token_split(tokenstring, esc_chars, split_chars, include_splitter=True): # This here takes a number and chops it up into a series of byte-width numbers # i.e 42 -> [42], 256 -> [1, 0] # +# TODO: I don't want to use this anymore but it's just for testing. def int_to_bytes(number): rv = [] c = 0 diff --git a/src/lc/interpreter.py b/src/lc/interpreter.py @@ -37,6 +37,7 @@ class Label(AbstractToken): self.name = names[1] t = self.i.ns.resolve_with_obj(self.parent, self.name) + self.expr = t[0] else: self.name = names[0] t = self.i.ns.resolve(self.name) @@ -47,6 +48,7 @@ class Label(AbstractToken): if s: return(self.scope) else: + print(self.name, self.expr) return(int_to_word(self.expr)) class Arguements(AbstractToken): diff --git a/src/lc/main.py b/src/lc/main.py @@ -38,7 +38,7 @@ if __name__ == "__main__": for n, l in enumerate(itr.program): print("{}: {} <= ".format(str(n).rjust(4), l[0].name.rjust(15), - l[1]), + l[1]), end="") for e in l[2]: t = e.action() diff --git a/src/lc/namespace.py b/src/lc/namespace.py @@ -53,33 +53,43 @@ class Namespace(): self.t = None def copy(self, new_name, name): - self.ns[self.sc][new_name][1] = self.obj_resolve(name)[1] + self.ns[self.sc][new_name][1] = self.obj_resolve(name) # Resolves name into object def obj_resolve(self, name): rv = None - for namespace in self.scopes: - for names in namespace: - if name in names.keys() and rv == None: - rv = names[name] - elif rv != None: - print("{} was found, but found again".format(name)) + if name in self.ns[0].keys(): + rv = self.ns[0][name][1] + else: + for namespace in self.scopes: + for names in namespace: + if name in names.keys() and rv == None: + rv = names[name][1] + elif rv != None: + print("{} was found, but found again".format(name)) return rv - def resolve_with_obj(self, obj, name): - t = self.obj_resolve(obj) - print(t) + def resolve_with_obj(self, parent, name): + rv = None + obj = self.obj_resolve(parent.name) + print(parent.name, name) + if name in obj: + rv = obj[name] + + return rv # Resolves name into scope and address def resolve(self, name): rv = None - if name in self.ns[0].keys(): rv = [1, self.ns[0][name][0]] elif name in self.ns[-1].keys(): rv = [0, self.ns[-1][name][0]] else: - print("Out of scope tbi") - + for x, names in enumerate(self.scopes): + if name in names[0].keys(): + rv = [((x + 1) << 1) + 1, names[0][name][0]] + elif name in names[-1].keys(): + rv = [((x + 1) << 1) + 0, names[-1][name][0]] return rv diff --git a/src/lc/test_files/class.ti b/src/lc/test_files/class.ti @@ -58,6 +58,4 @@ class ObjectFibb: ObjectFibb test = new ObjectFibb(); -print test.c.data; - test.run(15);