本站源代码
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

123 lines
1.7KB

  1. package ast
  2. import (
  3. "bytes"
  4. "fmt"
  5. )
  6. type Node struct {
  7. Parent *Node
  8. Children []*Node
  9. Value interface{}
  10. Kind Kind
  11. }
  12. func NewNode(k Kind, v interface{}, ch ...*Node) *Node {
  13. n := &Node{
  14. Kind: k,
  15. Value: v,
  16. }
  17. for _, c := range ch {
  18. Insert(n, c)
  19. }
  20. return n
  21. }
  22. func (a *Node) Equal(b *Node) bool {
  23. if a.Kind != b.Kind {
  24. return false
  25. }
  26. if a.Value != b.Value {
  27. return false
  28. }
  29. if len(a.Children) != len(b.Children) {
  30. return false
  31. }
  32. for i, c := range a.Children {
  33. if !c.Equal(b.Children[i]) {
  34. return false
  35. }
  36. }
  37. return true
  38. }
  39. func (a *Node) String() string {
  40. var buf bytes.Buffer
  41. buf.WriteString(a.Kind.String())
  42. if a.Value != nil {
  43. buf.WriteString(" =")
  44. buf.WriteString(fmt.Sprintf("%v", a.Value))
  45. }
  46. if len(a.Children) > 0 {
  47. buf.WriteString(" [")
  48. for i, c := range a.Children {
  49. if i > 0 {
  50. buf.WriteString(", ")
  51. }
  52. buf.WriteString(c.String())
  53. }
  54. buf.WriteString("]")
  55. }
  56. return buf.String()
  57. }
  58. func Insert(parent *Node, children ...*Node) {
  59. parent.Children = append(parent.Children, children...)
  60. for _, ch := range children {
  61. ch.Parent = parent
  62. }
  63. }
  64. type List struct {
  65. Not bool
  66. Chars string
  67. }
  68. type Range struct {
  69. Not bool
  70. Lo, Hi rune
  71. }
  72. type Text struct {
  73. Text string
  74. }
  75. type Kind int
  76. const (
  77. KindNothing Kind = iota
  78. KindPattern
  79. KindList
  80. KindRange
  81. KindText
  82. KindAny
  83. KindSuper
  84. KindSingle
  85. KindAnyOf
  86. )
  87. func (k Kind) String() string {
  88. switch k {
  89. case KindNothing:
  90. return "Nothing"
  91. case KindPattern:
  92. return "Pattern"
  93. case KindList:
  94. return "List"
  95. case KindRange:
  96. return "Range"
  97. case KindText:
  98. return "Text"
  99. case KindAny:
  100. return "Any"
  101. case KindSuper:
  102. return "Super"
  103. case KindSingle:
  104. return "Single"
  105. case KindAnyOf:
  106. return "AnyOf"
  107. default:
  108. return ""
  109. }
  110. }
上海开阖软件有限公司 沪ICP备12045867号-1