summaryrefslogtreecommitdiff
path: root/parser/node.go
diff options
context:
space:
mode:
authorMarc Vertes <mvertes@free.fr>2023-07-10 15:54:13 +0200
committerMarc Vertes <mvertes@free.fr>2023-07-10 15:54:13 +0200
commit80c277773a1e73267832641574654361b85e6028 (patch)
treec39b422716e41e47987b62cdc4a9dd2649cc2138 /parser/node.go
first commit
Diffstat (limited to 'parser/node.go')
-rw-r--r--parser/node.go45
1 files changed, 45 insertions, 0 deletions
diff --git a/parser/node.go b/parser/node.go
new file mode 100644
index 0000000..6ebc2a7
--- /dev/null
+++ b/parser/node.go
@@ -0,0 +1,45 @@
+package parser
+
+import "github.com/gnolang/parscan/scanner"
+
+type Kind int
+
+type Node struct {
+ Child []*Node // sub-tree nodes
+ scanner.Token // token at origin of the node
+ Kind // Node kind, depends on the language spec
+
+ unary bool // TODO(marc): get rid of it.
+}
+
+// TODO: remove it in favor of Walk2
+func (n *Node) Walk(in, out func(*Node) bool) (stop bool) {
+ if in != nil && !in(n) {
+ return true
+ }
+ for _, child := range n.Child {
+ if child.Walk(in, out) {
+ return
+ }
+ }
+ if out != nil {
+ stop = !out(n)
+ }
+ return
+}
+
+// Idem to walk, but also propagates the ancestor of visited node and child index.
+func (n *Node) Walk2(a *Node, i int, in, out func(*Node, *Node, int) bool) (stop bool) {
+ if in != nil && !in(n, a, i) {
+ return true
+ }
+ for j, child := range n.Child {
+ if child.Walk2(n, j, in, out) {
+ return
+ }
+ }
+ if out != nil {
+ stop = !out(n, a, i)
+ }
+ return
+}