nodes.go 2.1 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798
  1. package wrap
  2. import (
  3. "fw/cp/node"
  4. "fw/rt2"
  5. "fw/rt2/context"
  6. "fw/rt2/decision"
  7. "fw/rt2/frame"
  8. "fw/rt2/rules2/wrap/eval"
  9. "reflect"
  10. "ypk/halt"
  11. )
  12. func init() {
  13. decision.PrologueFor = prologue
  14. decision.EpilogueFor = epilogue
  15. decision.AssertFor = test
  16. eval.Propose = Propose
  17. eval.Expose = Expose
  18. }
  19. func This(o eval.OUT) (seq frame.Sequence, ret frame.WAIT) {
  20. ret = o.Next.Wait()
  21. if ret != frame.STOP {
  22. seq = Propose(o.Do)
  23. }
  24. return seq, ret
  25. }
  26. func Propose(a eval.Do) frame.Sequence {
  27. return func(fr frame.Frame) (frame.Sequence, frame.WAIT) {
  28. var key interface{}
  29. if fr.Parent() != nil {
  30. key = rt2.RegOf(fr.Parent())[context.KEY]
  31. }
  32. in := eval.IN{IR: rt2.NodeOf(fr), Frame: fr, Parent: fr.Parent(), Key: key}
  33. return This(a(in))
  34. }
  35. }
  36. func waiting(n frame.WAIT) eval.WAIT {
  37. switch n {
  38. case frame.WRONG:
  39. return eval.WRONG
  40. case frame.STOP:
  41. return eval.STOP
  42. case frame.LATER:
  43. return eval.LATER
  44. case frame.NOW:
  45. return eval.NOW
  46. case frame.BEGIN:
  47. return eval.BEGIN
  48. case frame.END:
  49. return eval.END
  50. default:
  51. panic(n)
  52. }
  53. }
  54. func Expose(f frame.Sequence) eval.Do {
  55. return func(in eval.IN) (out eval.OUT) {
  56. s, w := f(in.Frame)
  57. return eval.OUT{Do: Expose(s), Next: waiting(w)}
  58. }
  59. }
  60. func test(n node.Node) (bool, int) {
  61. switch n.(type) {
  62. default:
  63. return true, 0
  64. }
  65. }
  66. func prologue(n node.Node) frame.Sequence {
  67. switch n.(type) {
  68. case node.Statement:
  69. return Propose(eval.BeginStatement)
  70. case node.Expression:
  71. return Propose(eval.BeginExpression)
  72. case node.Designator:
  73. return Propose(eval.BeginDesignator)
  74. case node.IfNode:
  75. return Propose(eval.BeginStrange)
  76. default:
  77. halt.As(100, "no prologue for", reflect.TypeOf(n))
  78. }
  79. panic(0)
  80. }
  81. func epilogue(n node.Node) frame.Sequence {
  82. switch n.(type) {
  83. case node.Statement:
  84. return Propose(eval.EndStatement)
  85. case node.ConstantNode, node.VariableNode, node.ParameterNode, node.DyadicNode, node.MonadicNode, node.IfNode, node.ProcedureNode, node.DerefNode, node.FieldNode, node.IndexNode, node.GuardNode, node.RangeNode: //do nothing
  86. default:
  87. halt.As(100, "no epilogue for", reflect.TypeOf(n))
  88. }
  89. return nil
  90. }