From b9032fd845e9425df4f0bdf93701edf503c14534 Mon Sep 17 00:00:00 2001 From: CircleShift Date: Wed, 3 Dec 2025 02:31:45 -0500 Subject: [tnslc] begin rework of scope --- tnslc/' | 165 ++++++++++++++++++++++++++++++++++++++++++++ tnslc/compile/compile.tnsl | 1 + tnslc/compile/function.tnsl | 54 +++++++++++++++ tnslc/compile/scope.tnsl | 122 +++++--------------------------- 4 files changed, 237 insertions(+), 105 deletions(-) create mode 100644 tnslc/' diff --git a/tnslc/' b/tnslc/' new file mode 100644 index 0000000..485e5d1 --- /dev/null +++ b/tnslc/' @@ -0,0 +1,165 @@ + +struct Function { + ~uint8 name, + utils.Vector + inputs, + outputs, + ~parse.Node _up, +} + +/; method Function + /; init (~parse.Node n) + self.name = utils.strcpy(n`.data) + self._up = n + Var v + self.inputs.init(len v) + self.outputs.init(len v) + ;/ + + /; _resolve_dlist (~Module parent, ~parse.Node dl) + ~parse.Node tn = NULL + ~parse.Node n + /; loop (int i = 0; i < dl`.sub.count) [i++] + n = dl`.sub.get(i) + /; if (n`._type == parse.NTYPE_TYPE) + tn = n + ;; else if (n`._type == parse.NTYPE_ID) + /; if (tn == NULL) + _printf("Identifier declared in parameter list before any type was found!\n\0") + return + ;/ + Var p + p.init(tn, n) + p._resolve_type(parent) + self.inputs.push(~p) + ;/ + ;/ + ;/ + + /; _resolve_tlist (~Module parent, ~parse.Node tl) + ~parse.Node n + parse.Node dummy + dummy.data = "### OUTPUT ###\0" + /; loop (int i = 0; i < tl`.sub.count) [i++] + n = tl`.sub.get(i) + /; if (n`._type == parse.NTYPE_TYPE) + Var r + r.init(n, ~dummy) + r._resolve_type(parent) + self.outputs.push(~r) + ;/ + ;/ + ;/ + + /; _resolve_type (~Module parent) + ~parse.Node _up = self._up + /; if (_up`.sub.count < 1) + return + ;/ + + ~parse.Node lst = _up`.sub.get(0) + /; if (lst`._type == parse.NTYPE_DLIST) + self._resolve_dlist(parent, lst) + /; if (_up`.sub.count > 1) + lst = _up`.sub.get(1) + ;/ + ;/ + + /; if (lst`._type == parse.NTYPE_TLIST) + self._resolve_tlist(parent, lst) + ;/ + ;/ + + /; _fqn (~Module parent) [~uint8] + utils.Vector out + + return out.as_cstr() + ;/ + + /; _build_scope(~Module parent, ~CompBuf cb) [Scope] + ~uint8 fqn = self._fqn(parent) + Scope out + out.init(parent, cb, fqn) + _delete(fqn) + + # TODO: Push all saved vars and deal with parameters + # TODO: Add all params to the scope + + return out + ;/ + + /; _end_scope(~Scope scope, ~CompBuf cb) + ;/ + + /; _compile (~Module parent, ~CompBuf cb) + # Sanity check + ~parse.Node _up = self._up + /; if (_up`.sub.count < 1) + ~Scope s = self._build_scope(parent, cb) + self._end_scope(s, cb) + return + ;/ + + # Skip past parameters and outputs + int i = 0 + ~parse.Node n = _up`.sub.get(i) + /; if (n`._type == parse.NTYPE_DLIST) + i++ + /; if (_up`.sub.count > 1) + n = _up`.sub.get(1) + ;/ + ;/ + + /; if (n`._type == parse.NTYPE_TLIST) + i++ + ;/ + + # Create scope and start compiling statements from here. + Scope fscope = self._build_scope(parent, cb) + fscope._compile_statements(cb, _up, i) + self._end_scope(~fscope, cb) + ;/ + + /; _print (int idt) + _indent(idt) + _printf("{ Function : \0") + _printf(self.name) + _printf("\n\0") + + _indent(idt) + _printf(" inputs:\n\0") + ~Var prtv + /; loop (int i = 0; i < self.inputs.count) [i++] + prtv = self.inputs.get(i) + prtv`._print(idt + 1) + ;/ + + _indent(idt) + _printf(" outputs:\n\0") + /; loop (int i = 0; i < self.outputs.count) [i++] + prtv = self.outputs.get(i) + prtv`._print(idt + 1) + ;/ + + _indent(idt) + _printf("}\n\0") + ;/ + + /; end + _delete(self.name) + + ~Var v + /; loop (int i = 0; i < self.inputs.count) [i++] + v = self.inputs.get(i) + v`.end() + ;/ + self.inputs.end() + + /; loop (int i = 0; i < self.outputs.count) [i++] + v = self.outputs.get(i) + v`.end() + ;/ + self.outputs.end() + ;/ +;/ + diff --git a/tnslc/compile/compile.tnsl b/tnslc/compile/compile.tnsl index 338e28d..fbb9670 100644 --- a/tnslc/compile/compile.tnsl +++ b/tnslc/compile/compile.tnsl @@ -5,5 +5,6 @@ :import "function.tnsl" :import "module.tnsl" :import "codegen.tnsl" + :import "scope.tnsl" ;/ diff --git a/tnslc/compile/function.tnsl b/tnslc/compile/function.tnsl index 911b02c..a768596 100644 --- a/tnslc/compile/function.tnsl +++ b/tnslc/compile/function.tnsl @@ -70,7 +70,61 @@ struct Function { ;/ ;/ + /; _fqn (~Module parent) [~uint8] + utils.Vector out + + return out.as_cstr() + ;/ + + /; _build_scope(~Module parent, ~CompBuf cb) [Scope] + ~uint8 fqn = self._fqn(parent) + Scope out + out.init(parent, cb, fqn) + out.parent = NULL + _delete(fqn) + + # TODO: Write label to cb + # TODO: Push all saved vars and deal with parameters + # TODO: Add all params to the scope + + return out + ;/ + + /; _end_scope(~Scope scope, ~CompBuf cb) + # TODO: place jmp label + # TODO: pop all saved vars + # TODO: ret + + scope`.end() + ;/ + /; _compile (~Module parent, ~CompBuf cb) + # Sanity check + ~parse.Node _up = self._up + /; if (_up`.sub.count < 1) + ~Scope s = self._build_scope(parent, cb) + self._end_scope(s, cb) + return + ;/ + + # Skip past parameters and outputs + int i = 0 + ~parse.Node n = _up`.sub.get(i) + /; if (n`._type == parse.NTYPE_DLIST) + i++ + /; if (_up`.sub.count > 1) + n = _up`.sub.get(1) + ;/ + ;/ + + /; if (n`._type == parse.NTYPE_TLIST) + i++ + ;/ + + # Create scope and start compiling statements from here. + Scope fscope = self._build_scope(parent, cb) + fscope._compile_statements(_up, i) + self._end_scope(~fscope, cb) ;/ /; _print (int idt) diff --git a/tnslc/compile/scope.tnsl b/tnslc/compile/scope.tnsl index 7822125..f4eefdd 100644 --- a/tnslc/compile/scope.tnsl +++ b/tnslc/compile/scope.tnsl @@ -1,123 +1,35 @@ struct Scope { ~uint8 name, - - utils.Vector - stack_vars, - reg_vars, + ~Module mod, + ~CompBuf cb, ~Scope parent, - - int - next_const, - next_bool + + utils.Vector + vars } /; method Scope - /; init (~uint8 name) - self.name = name + /; init (~Module mod, ~CompBuf cb, ~uint8 name) + self.name = utils.strcpy(name) + self.mod = mod + self.cb = cb - Variable v - self.stack_vars.init(len v) - self.reg_vars.init(len v) - - self.next_const = 0 - self.next_bool = 0 + Var v + self.vars.init(len v) + ;/ + + /; _compile_statements (~parse.Node up, int o) ;/ /; end _delete(self.name) - ~Variable v - /; loop (int i = 0; i < self.stack_vars.count) [i++] - v = self.stack_vars.get(i) + ~Var v + /; loop (int i = 0; i < self.vars.count) [i++] + v = self.vars.get(i) v`.end() ;/ - - /; loop (int i = 0; i < self.reg_vars.count) [i++] - v = self.reg_vars.get(i) - v`.end() - ;/ - ;/ - - /; _name_rec (~utils.Vector out) - /; if (self.parent !== NULL) - self.parent`._name_rec(out) - out`.push_cstr("#") - ;/ - - out`.push_cstr(self.name) - ;/ - - /; _base_label [utils.Vector] - utils.Vector out - out.init(1) - - ~uint8 mod_str = self.current.label_prefix() - out.push_cstr(mod_str) - _delete(mod_str) - - self._name_rec(~out) - - return out - ;/ - - /; label_start [~uint8] - utils.Vector base = self._base_label() - base.push_cstr("#start\0") - return base.as_cstr() - ;/ - - /; label_rep [~uint8] - utils.Vector base = self._base_label() - base.push_cstr("#rep\0") - return base.as_cstr() - ;/ - - /; label_end [~uint8] - utils.Vector base = self._base_label() - base.push_cstr("#end\0") - return base.as_cstr() - ;/ - - /; label_next_const [~uint8] - utils.Vector base = self._base_label() - base.push_cstr("#const\0") - - ~uint8 str = utils.int_to_str(self.next_const) - base.push_cstr(str) - self.next_const++ - _delete(str) - - return base.as_cstr() - ;/ - - /; label_bool [~uint8] - utils.Vector base = self._base_label() - base.push_cstr("#bool\0") - - ~uint8 str = utils.int_to_str(self.next_bool) - base.push_cstr(str) - self.next_bool++ - _delete(str) - - return base.as_cstr() - ;/ - - /; label_bool_adv - self.next_bool++ - ;/ - - /; subscope (~uint8 name) [Scope] - Scope out - - utils.Vector str - str.from_cstr(name) - _delete(name) - - out.init(str.as_cstr(), self.current) - out.parent = ~self - - return out ;/ ;/ -- cgit v1.2.3