builder.go 1020 B

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051
  1. package ast
  2. type Reference int
  3. const InvalidReference Reference = -1
  4. func (r Reference) Valid() bool {
  5. return r != InvalidReference
  6. }
  7. type Builder struct {
  8. tree Root
  9. lastIdx int
  10. }
  11. func (b *Builder) Tree() *Root {
  12. return &b.tree
  13. }
  14. func (b *Builder) NodeAt(ref Reference) *Node {
  15. return b.tree.at(ref)
  16. }
  17. func (b *Builder) Reset() {
  18. b.tree.nodes = b.tree.nodes[:0]
  19. b.lastIdx = 0
  20. }
  21. func (b *Builder) Push(n Node) Reference {
  22. b.lastIdx = len(b.tree.nodes)
  23. b.tree.nodes = append(b.tree.nodes, n)
  24. return Reference(b.lastIdx)
  25. }
  26. func (b *Builder) PushAndChain(n Node) Reference {
  27. newIdx := len(b.tree.nodes)
  28. b.tree.nodes = append(b.tree.nodes, n)
  29. if b.lastIdx >= 0 {
  30. b.tree.nodes[b.lastIdx].next = newIdx - b.lastIdx
  31. }
  32. b.lastIdx = newIdx
  33. return Reference(b.lastIdx)
  34. }
  35. func (b *Builder) AttachChild(parent Reference, child Reference) {
  36. b.tree.nodes[parent].child = int(child) - int(parent)
  37. }
  38. func (b *Builder) Chain(from Reference, to Reference) {
  39. b.tree.nodes[from].next = int(to) - int(from)
  40. }