table.go 1.4 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768
  1. //dynamicaly loading from outer space
  2. package rules
  3. import (
  4. "cp/node"
  5. "fmt"
  6. "reflect"
  7. "rt2/context"
  8. "rt2/decision"
  9. "rt2/frame"
  10. "rt2/nodeframe"
  11. "rt2/scope"
  12. "ypk/assert"
  13. )
  14. func prologue(n node.Node) frame.Sequence {
  15. var fu nodeframe.FrameUtils
  16. fmt.Println(reflect.TypeOf(n))
  17. switch n.(type) {
  18. case node.EnterNode:
  19. return func(f frame.Frame) (frame.Sequence, frame.WAIT) {
  20. node := fu.NodeOf(f).Right()
  21. assert.For(node != nil, 40)
  22. sm := scope.This(f.Domain().Discover(context.SCOPE))
  23. sm.Allocate(n)
  24. f.Root().Push(fu.New(node))
  25. return frame.Tail(frame.STOP), frame.SKIP
  26. }
  27. case node.AssignNode:
  28. return assignSeq
  29. case node.OperationNode:
  30. return opSeq
  31. case node.CallNode:
  32. return callSeq
  33. default:
  34. panic("unknown node")
  35. }
  36. }
  37. func epilogue(n node.Node) frame.Sequence {
  38. var fu nodeframe.FrameUtils
  39. switch n.(type) {
  40. case node.AssignNode, node.CallNode:
  41. return func(f frame.Frame) (frame.Sequence, frame.WAIT) {
  42. next := n.Link()
  43. if next != nil {
  44. f.Root().Push(fu.New(next))
  45. }
  46. return frame.End()
  47. }
  48. case node.EnterNode:
  49. return func(f frame.Frame) (frame.Sequence, frame.WAIT) {
  50. sm := scope.This(f.Domain().Discover(context.SCOPE))
  51. sm.Dispose(n)
  52. return frame.End()
  53. }
  54. case node.OperationNode:
  55. return nil //do nothing
  56. default:
  57. fmt.Println(reflect.TypeOf(n))
  58. panic("unhandled epilogue")
  59. }
  60. }
  61. func init() {
  62. decision.PrologueFor = prologue
  63. decision.EpilogueFor = epilogue
  64. }