1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
|
/##
Copyright 2021 Kyle Gunger
This file is licensed under the CDDL 1.0 (the License)
and may only be used in accordance with the License.
You should have recieved a copy of the License with this
software/source code. If you did not, a copy can be found
at the following URL:
https://opensource.org/licenses/CDDL-1.0
THIS SOFTWARE/SOURCE CODE IS PROVIDED "AS IS" WITH NO
WARRANTY, GUARANTEE, OR CLAIM OF FITNESS FOR ANY PURPOSE
EXPRESS OR IMPLIED
#/
# AST node (non-block)
;struct Node {
tnslc.parse.Token
# associated token to the node
data,
~{}Node
# sub-nodes
sub
}
# AST node (block)
;struct BlockNode extends Node {
super,
~{}Node
# block inputs and outputs
blockIn,
blockOut,
~{}tnslc.parse.Token
# block qualifiers
blockQs
}
# Node methods
/; method Node
/; operator delete
;delete this.data, this.sub
;/
/; push_sub (Node node) [uint]
;uint len = this.sub.length
;alloc this.sub, len + 1
;this.sub{len} = node
;return len + 1
;/
;/
# Extended block node methods
/; method BlockNode
/; operator delete
;super()
;delete this.blockQs, this.blockIn, this.blockOut
;/
/; push_blockQ (tnslc.parse.Token token) [uint]
;uint len = this.blockQs.length
;alloc this.blockQs, len + 1
;this.blockQs{len} = token
;return len + 1
;/
/; push_blockIn (Node node) [uint]
;uint len = this.blockIn.length
;alloc this.blockIn, len + 1
;this.blockIn{len} = node
;return len + 1
;/
/; push_blockOut (Node node) [uint]
;uint len = this.blockOut.length
;alloc this.blockOut, len + 1
;this.blockOut{len} = node
;return len + 1
;/
;/
|