summaryrefslogtreecommitdiff
path: root/tnslc/parse/ast.tnsl
diff options
context:
space:
mode:
Diffstat (limited to 'tnslc/parse/ast.tnsl')
-rw-r--r--tnslc/parse/ast.tnsl81
1 files changed, 81 insertions, 0 deletions
diff --git a/tnslc/parse/ast.tnsl b/tnslc/parse/ast.tnsl
index 26b57b8..254aee0 100644
--- a/tnslc/parse/ast.tnsl
+++ b/tnslc/parse/ast.tnsl
@@ -38,6 +38,13 @@ struct Node {
self.sub.init(len n)
;/
+ /; eq (~uint8 cstr) [bool]
+ /; if (utils.strcmp(self.data, cstr) == true)
+ return true
+ ;/
+ return false
+ ;/
+
/; end
_delete(self.data)
@@ -924,7 +931,81 @@ struct Node {
return false
;/
+# Transform type nodes into value nodes
/; _mhf_transform (~Node _type)
+ Node out
+ out.init(NTYPE_VALUE, utils.strcpy("\0"))
+
+ ~Node sub, cur
+ cur = ~out
+ int idx = 0
+
+ /; loop (bool run = true; run == true && idx < _type`.sub.count)
+ sub = _type`.sub.get(idx)
+ /; if (sub`._type !== NTYPE_PRE_OP)
+ run = false
+ ;; else
+ Node new
+ new.init(NTYPE_PRE_OP, utils.strcpy(sub`.data))
+ cur`.sub.push(~new)
+ int last = cur`.sub.count - 1
+ cur = cur`.sub.get(last)
+ idx++
+ ;/
+ ;/
+
+ /; loop (idx < _type`.sub.count && sub`._type == NTYPE_ID)
+ /; if (idx < _type`.sub.count - 1)
+ sub = _type`.sub.get(idx + 1)
+ /; if (sub`._type == NTYPE_ID)
+ Node op, n
+ op.init(NTYPE_BIN_OP, utils.strcpy(".\0"))
+ n.init(NTYPE_ID, utils.strcpy(sub`.data))
+ op.sub.push(~n)
+ cur`.sub.push(~op)
+ int last = cur`.sub.count - 1
+ cur = cur`.sub.get(last)
+ ;; else
+ Node n
+ n.init(NTYPE_ID, utils.strcpy(sub`.data))
+ cur`.sub.push(~n)
+ int last = cur`.sub.count - 1
+ cur = cur`.sub.get(last)
+ ;/
+ ;; else
+ Node n
+ n.init(NTYPE_ID, utils.strcpy(sub`.data))
+ cur`.sub.push(~n)
+ int last = cur`.sub.count - 1
+ cur = cur`.sub.get(last)
+ ;/
+
+ idx++
+
+ /; if (idx < _type`.sub.count)
+ sub = _type`.sub.get(idx)
+ ;/
+ ;/
+
+ /; if (sub`._type == NTYPE_TLIST && sub`.eq("(\0") == true)
+ Node lst
+ lst.init(NTYPE_VLIST, "(\0")
+
+ /; loop (int i = 0; i < sub`.sub.count) [i++]
+ ~Node lsub = sub`.sub.get(i)
+ _mhf_transform(lsub)
+ lst.sub.push(lsub)
+ ;/
+
+ /; loop (sub`.sub.count > 0)
+ sub`.sub.pop()
+ ;/
+
+ cur`.sub.push(~lst)
+ ;/
+
+ _type`.end()
+ _type` = out
;/
/; _mhf_finish_value (~utils.File fin, ~Node mod, ~Token first)