summaryrefslogtreecommitdiff
path: root/parser/node.go
diff options
context:
space:
mode:
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
+}