table.go 3.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128
  1. //dynamicaly loading from outer space
  2. package rules
  3. import (
  4. "fmt"
  5. "fw/cp/node"
  6. "fw/rt2"
  7. "fw/rt2/context"
  8. "fw/rt2/decision"
  9. "fw/rt2/frame"
  10. "fw/rt2/nodeframe"
  11. "fw/rt2/scope"
  12. "fw/utils"
  13. "reflect"
  14. )
  15. func prologue(n node.Node) frame.Sequence {
  16. //fmt.Println(reflect.TypeOf(n))
  17. switch next := n.(type) {
  18. case node.EnterNode:
  19. return enterSeq
  20. case node.AssignNode:
  21. return assignSeq
  22. case node.OperationNode:
  23. switch n.(type) {
  24. case node.DyadicNode:
  25. return dopSeq
  26. case node.MonadicNode:
  27. return mopSeq
  28. default:
  29. panic("no such op")
  30. }
  31. case node.CallNode:
  32. return callSeq
  33. case node.ReturnNode:
  34. return returnSeq
  35. case node.ConditionalNode:
  36. return ifSeq
  37. case node.IfNode:
  38. return ifExpr
  39. case node.WhileNode:
  40. return whileSeq
  41. case node.RepeatNode:
  42. return repeatSeq
  43. case node.LoopNode:
  44. return loopSeq
  45. case node.ExitNode:
  46. return exitSeq
  47. case node.DerefNode:
  48. return derefSeq
  49. case node.InitNode:
  50. return frame.Tail(frame.STOP)
  51. case node.IndexNode:
  52. return indexSeq
  53. case node.TrapNode:
  54. return func(f frame.Frame) (frame.Sequence, frame.WAIT) {
  55. switch code := next.Left().(type) {
  56. case node.ConstantNode:
  57. utils.PrintTrap("TRAP:", code.Data())
  58. return frame.Tail(frame.WRONG), frame.NOW
  59. default:
  60. panic(fmt.Sprintln("unsupported code", reflect.TypeOf(code)))
  61. }
  62. }
  63. case node.WithNode:
  64. return withSeq
  65. case node.GuardNode:
  66. return guardSeq
  67. case node.CaseNode:
  68. return caseSeq
  69. case node.RangeNode:
  70. return rangeSeq
  71. case node.CompNode:
  72. return func(f frame.Frame) (frame.Sequence, frame.WAIT) {
  73. right := func(f frame.Frame) (frame.Sequence, frame.WAIT) {
  74. if next.Right() != nil {
  75. rt2.Push(rt2.New(next.Right()), f)
  76. return frame.Tail(frame.STOP), frame.LATER
  77. }
  78. return frame.End()
  79. }
  80. left := func(f frame.Frame) (frame.Sequence, frame.WAIT) {
  81. if next.Left() != nil {
  82. rt2.Push(rt2.New(next.Left()), f)
  83. return right, frame.LATER
  84. }
  85. return right, frame.NOW
  86. }
  87. return left, frame.NOW
  88. }
  89. default:
  90. panic(fmt.Sprintln("unknown node", reflect.TypeOf(n)))
  91. }
  92. }
  93. func epilogue(n node.Node) frame.Sequence {
  94. var fu nodeframe.FrameUtils
  95. switch n.(type) {
  96. case node.AssignNode, node.InitNode, node.CallNode, node.ConditionalNode, node.WhileNode,
  97. node.RepeatNode, node.ExitNode, node.WithNode, node.CaseNode, node.CompNode:
  98. return func(f frame.Frame) (frame.Sequence, frame.WAIT) {
  99. next := n.Link()
  100. //fmt.Println("from", reflect.TypeOf(n))
  101. //fmt.Println("next", reflect.TypeOf(next))
  102. if next != nil {
  103. f.Root().PushFor(fu.New(next), f.Parent())
  104. }
  105. return frame.End()
  106. }
  107. case node.EnterNode:
  108. return func(f frame.Frame) (seq frame.Sequence, ret frame.WAIT) {
  109. sm := scope.This(f.Domain().Discover(context.SCOPE))
  110. sm.Dispose(n)
  111. return frame.End()
  112. }
  113. case node.OperationNode, node.ReturnNode, node.IfNode, node.LoopNode,
  114. node.DerefNode, node.IndexNode, node.TrapNode, node.GuardNode, node.RangeNode:
  115. return nil
  116. default:
  117. fmt.Println(reflect.TypeOf(n))
  118. panic("unhandled epilogue")
  119. }
  120. }
  121. func init() {
  122. decision.PrologueFor = prologue
  123. decision.EpilogueFor = epilogue
  124. }