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.tnsl56
1 files changed, 48 insertions, 8 deletions
diff --git a/tnslc/parse/ast.tnsl b/tnslc/parse/ast.tnsl
index 89b9238..712a3df 100644
--- a/tnslc/parse/ast.tnsl
+++ b/tnslc/parse/ast.tnsl
@@ -34,6 +34,7 @@ struct Node {
/; init (uint16 _type, ~uint8 data)
self.data = data
self._type = _type
+ self.parent = NULL
Node n
self.sub.init(len n)
@@ -392,7 +393,7 @@ struct Node {
bool gt = false
/; if (cur`._type == NTYPE_BIN_OP)
int j = _op_order(cur`.data)
- gt = i > j
+ gt = _assoc(first`.data, i, j)
;/
# Start from the top and work our way down
@@ -402,7 +403,7 @@ struct Node {
/; if (sub`._type == NTYPE_BIN_OP)
int j = _op_order(sub`.data)
- gt = j !< i
+ gt = _assoc(first`.data, i, j)
;/
/; if (gt)
@@ -411,12 +412,19 @@ struct Node {
;/
;/
- # Replace the last value in the current
- bin.sub.push(cur`.sub.get(cur`.sub.count - 1))
- cur`.sub.pop()
- cur`.sub.push(~bin)
- cur = cur`.sub.get(cur`.sub.count - 1)
-
+ /; if (_assoc_right(first`.data) == true)
+ # Replace the last value in the current subnode
+ bin.sub.push(cur`.sub.get(cur`.sub.count - 1))
+ cur`.sub.pop()
+ cur`.sub.push(~bin)
+ cur = cur`.sub.get(cur`.sub.count - 1)
+ ;; else
+ # Replace the subnode itself
+ bin.sub.push(cur)
+ cur`.data = bin.data
+ cur`.sub = bin.sub
+ ;/
+
first` = produce_next_token(fin, first`)
/; if (utils.strcmp(bin.data, "is\0"))
_ast_type(fin, cur, first)
@@ -1056,6 +1064,38 @@ struct Node {
;/
/; _mhf_finish_decl (~utils.File fin, ~Node mod, ~Token first)
+
+ /; loop (bool run = true; run == true)
+ /; if (first`._type == TTYPE_USRWD)
+ Node var
+ var.init(NTYPE_ID, first`.data)
+ int ln = first`.line
+
+ first` = produce_next_token(fin, first`)
+ /; if (first`.eq("=\0") && first`.line == ln)
+ Token tmp = produce_next_token(fin, first`)
+ first`.end()
+ first` = tmp
+ _ast_value(fin, ~var, first)
+ ;; else if (first`.line !== ln)
+ run = false
+ ;/
+
+ mod`.add_child(~var)
+
+ /; if (first`.eq(",\0") == false)
+ run = false
+ ;; else if (run == true)
+ Token tmp = produce_next_token(fin, first`)
+ first`.end()
+ first` = tmp
+ ;/
+ ;; else
+ _ast_print_err(first, "Expected variable name in declaration\0")
+ run = false
+ ;/
+ ;/
+
;/
/; _maybe_helper_fun (~utils.File fin, ~Node mod, ~Token first)