summaryrefslogtreecommitdiff
path: root/tnslc/src/ast/node.tnsl
blob: 5eeac91a2f943b81026a6e15c24ec4fb1c5decdc (plain)
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 received 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
	;/
;/