node.go 1.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123
  1. package node
  2. import "cp/object"
  3. type Class int
  4. const (
  5. ENTER Class = iota
  6. ASSIGN
  7. VARIABLE
  8. DYADIC
  9. CONSTANT
  10. )
  11. type Node interface {
  12. SetLeft(n Node)
  13. SetRight(n Node)
  14. SetLink(n Node)
  15. SetObject(o object.Object)
  16. Left() Node
  17. Right() Node
  18. Link() Node
  19. Object() object.Object
  20. }
  21. func New(class Class) Node {
  22. switch class {
  23. case ENTER:
  24. return new(enterNode)
  25. case ASSIGN:
  26. return new(assignNode)
  27. case VARIABLE:
  28. return new(variableNode)
  29. case DYADIC:
  30. return new(dyadicNode)
  31. case CONSTANT:
  32. return new(constantNode)
  33. default:
  34. panic("no such class")
  35. }
  36. }
  37. type nodeFields struct {
  38. left, right, link Node
  39. obj object.Object
  40. }
  41. func (nf *nodeFields) SetLeft(n Node) { nf.left = n }
  42. func (nf *nodeFields) SetRight(n Node) { nf.right = n }
  43. func (nf *nodeFields) SetLink(n Node) { nf.link = n }
  44. func (nf *nodeFields) SetObject(o object.Object) { nf.obj = o }
  45. func (nf *nodeFields) Left() Node { return nf.left }
  46. func (nf *nodeFields) Right() Node { return nf.right }
  47. func (nf *nodeFields) Link() Node { return nf.link }
  48. func (nf *nodeFields) Object() object.Object { return nf.obj }
  49. type enterNode struct {
  50. nodeFields
  51. enter Enter
  52. }
  53. func (e *enterNode) SetEnter(enter Enter) {
  54. e.enter = enter
  55. }
  56. type constantNode struct {
  57. nodeFields
  58. typ object.Type
  59. data interface{}
  60. }
  61. func (c *constantNode) SetType(t object.Type) {
  62. c.typ = t
  63. }
  64. func (c *constantNode) SetData(data interface{}) {
  65. c.data = data
  66. }
  67. func (c *constantNode) Data() interface{} {
  68. return c.data
  69. }
  70. func (c *constantNode) Type() object.Type {
  71. return c.typ
  72. }
  73. type dyadicNode struct {
  74. nodeFields
  75. operation Operation
  76. }
  77. func (d *dyadicNode) SetOperation(op Operation) {
  78. d.operation = op
  79. }
  80. func (d *dyadicNode) Operation() Operation {
  81. return d.operation
  82. }
  83. type assignNode struct {
  84. nodeFields
  85. }
  86. func (a *assignNode) Self() AssignNode {
  87. return a
  88. }
  89. type variableNode struct {
  90. nodeFields
  91. }
  92. func (v *variableNode) Self() VariableNode {
  93. return v
  94. }