table.go 1.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384
  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. case node.RepeatNode:
  40. return repeatSeq
  41. case node.LoopNode:
  42. return loopSeq
  43. case node.ExitNode:
  44. return exitSeq
  45. case node.DerefNode:
  46. return derefSeq
  47. case node.InitNode:
  48. return frame.Tail(frame.STOP)
  49. default:
  50. panic(fmt.Sprintln("unknown node", reflect.TypeOf(n)))
  51. }
  52. }
  53. func epilogue(n node.Node) frame.Sequence {
  54. var fu nodeframe.FrameUtils
  55. switch n.(type) {
  56. case node.AssignNode, node.InitNode, node.CallNode, node.ConditionalNode, node.WhileNode, node.RepeatNode, node.ExitNode:
  57. return func(f frame.Frame) (frame.Sequence, frame.WAIT) {
  58. next := n.Link()
  59. if next != nil {
  60. f.Root().PushFor(fu.New(next), f.Parent())
  61. }
  62. return frame.End()
  63. }
  64. case node.EnterNode:
  65. return func(f frame.Frame) (seq frame.Sequence, ret frame.WAIT) {
  66. sm := scope.This(f.Domain().Discover(context.SCOPE))
  67. sm.Dispose(n)
  68. return frame.End()
  69. }
  70. case node.OperationNode, node.ReturnNode, node.IfNode, node.LoopNode, node.DerefNode:
  71. return nil
  72. default:
  73. fmt.Println(reflect.TypeOf(n))
  74. panic("unhandled epilogue")
  75. }
  76. }
  77. func init() {
  78. decision.PrologueFor = prologue
  79. decision.EpilogueFor = epilogue
  80. }