table.go 1.5 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374
  1. //dynamicaly loading from outer space
  2. package rules
  3. import (
  4. "fmt"
  5. "fw/cp/node"
  6. "fw/rt2/context"
  7. "fw/rt2/decision"
  8. "fw/rt2/frame"
  9. "fw/rt2/nodeframe"
  10. "fw/rt2/scope"
  11. "reflect"
  12. )
  13. func prologue(n node.Node) frame.Sequence {
  14. //fmt.Println(reflect.TypeOf(n))
  15. switch n.(type) {
  16. case node.EnterNode:
  17. return enterSeq
  18. case node.AssignNode:
  19. return assignSeq
  20. case node.OperationNode:
  21. switch n.(type) {
  22. case node.DyadicNode:
  23. return dopSeq
  24. case node.MonadicNode:
  25. return mopSeq
  26. default:
  27. panic("no such op")
  28. }
  29. case node.CallNode:
  30. return callSeq
  31. case node.ReturnNode:
  32. return returnSeq
  33. case node.ConditionalNode:
  34. return ifSeq
  35. case node.IfNode:
  36. return ifExpr
  37. case node.WhileNode:
  38. return whileSeq
  39. default:
  40. panic(fmt.Sprintln("unknown node", reflect.TypeOf(n)))
  41. }
  42. }
  43. func epilogue(n node.Node) frame.Sequence {
  44. var fu nodeframe.FrameUtils
  45. switch n.(type) {
  46. case node.AssignNode, node.CallNode, node.ConditionalNode, node.WhileNode:
  47. return func(f frame.Frame) (frame.Sequence, frame.WAIT) {
  48. next := n.Link()
  49. if next != nil {
  50. f.Root().PushFor(fu.New(next), f.Parent())
  51. }
  52. return frame.End()
  53. }
  54. case node.EnterNode:
  55. return func(f frame.Frame) (seq frame.Sequence, ret frame.WAIT) {
  56. sm := scope.This(f.Domain().Discover(context.SCOPE))
  57. sm.Dispose(n)
  58. return frame.End()
  59. }
  60. case node.OperationNode, node.ReturnNode, node.IfNode:
  61. return nil
  62. default:
  63. fmt.Println(reflect.TypeOf(n))
  64. panic("unhandled epilogue")
  65. }
  66. }
  67. func init() {
  68. decision.PrologueFor = prologue
  69. decision.EpilogueFor = epilogue
  70. }