summaryrefslogtreecommitdiff
path: root/tnslc
diff options
context:
space:
mode:
authorKyle Gunger <kgunger12@gmail.com>2024-09-29 18:19:51 -0400
committerKyle Gunger <kgunger12@gmail.com>2024-09-29 18:19:51 -0400
commit22ae58b9c2120cbc28edfe8f6b6ee81d786f3f9a (patch)
treef0165be2295195e20b1b29b2ee02669b3f8f1e9c /tnslc
parent27400c2d3802be447354069d0fe940e9cc53c573 (diff)
[tnslc] ast integrity testing
Diffstat (limited to 'tnslc')
-rw-r--r--tnslc/parse/ast.tnsl46
1 files changed, 39 insertions, 7 deletions
diff --git a/tnslc/parse/ast.tnsl b/tnslc/parse/ast.tnsl
index af755d8..89b9238 100644
--- a/tnslc/parse/ast.tnsl
+++ b/tnslc/parse/ast.tnsl
@@ -67,8 +67,10 @@ struct Node {
/; add_child(~Node n) [~Node]
n`.parent = ~self
self.sub.push(n)
- n = self.sub.get(self.sub.count - 1)
- n`.update_children()
+ /; loop (int i = 0; i < self.sub.count) [i++]
+ n = self.sub.get(i)
+ n`.update_children()
+ ;/
return n
;/
;/
@@ -255,8 +257,8 @@ struct Node {
cast.init(NTYPE_CAST, utils.strcpy("\0"))
out = _ast_list_type(fin, ~cast, first)
~Node tmp = mod`.sub.get(mod`.sub.count - 1)
- mod`.sub.pop()
cast.add_child(tmp)
+ mod`.sub.pop()
mod`.add_child(~cast)
;/
return out
@@ -427,7 +429,7 @@ struct Node {
;/
;/
- mod`.sub.push(~val)
+ mod`.add_child(~val)
;/
/; _ast_keyword_expr (~utils.File fin, ~Node mod, ~Token first)
@@ -997,9 +999,7 @@ struct Node {
;; else
Node new
new.init(NTYPE_PRE_OP, utils.strcpy(sub`.data))
- cur`.add_child(~new)
- int last = cur`.sub.count - 1
- cur = cur`.sub.get(last)
+ cur = cur`.add_child(~new)
idx++
;/
;/
@@ -1519,6 +1519,38 @@ struct Node {
/; print_ast (~Node n)
print_ast_rec(n, 0)
+ /; if (verify_ast_integrity(n) == false)
+ _printf("Integrity test failed\n\0")
+ ;; else
+ _printf("Integrity test passed\n\0")
+ ;/
;/
+/; verify_ast_integrity (~Node n) [bool]
+ /; loop (int i = 0; i < n`.sub.count) [i++]
+ ~Node s = n`.sub.get(i)
+
+ /; if (s`.parent !== n)
+ _printf("Test failed at: \n\0")
+ print_node_head(s)
+ _printf("}\n\0")
+ _printf("Parent: \n\0")
+ print_node_head(n)
+ _printf("}\n\0")
+ ~int p = n
+ int ptr = p
+ _print_num("Expected: %p\n\0", ptr)
+ ~int p = s`.parent
+ ptr = p
+ _print_num("Got: %p\n\0", ptr)
+ return false
+ ;/
+
+ /; if (verify_ast_integrity(s) == false)
+ return false
+ ;/
+ ;/
+
+ return true
+;/