summaryrefslogtreecommitdiff
path: root/tnslc
diff options
context:
space:
mode:
Diffstat (limited to 'tnslc')
-rw-r--r--tnslc/'165
-rw-r--r--tnslc/compile/compile.tnsl1
-rw-r--r--tnslc/compile/function.tnsl54
-rw-r--r--tnslc/compile/scope.tnsl122
4 files changed, 237 insertions, 105 deletions
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
;/
;/