nodes.go 4.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199
  1. package wrap
  2. import (
  3. "fw/cp/node"
  4. "fw/rt2/decision"
  5. "fw/rt2/frame"
  6. "fw/rt2/rules2/wrap/eval"
  7. "reflect"
  8. "ypk/halt"
  9. )
  10. func init() {
  11. decision.PrologueFor = prologue
  12. decision.EpilogueFor = epilogue
  13. decision.AssertFor = test
  14. }
  15. func This(o eval.OUT) (seq frame.Sequence, ret frame.WAIT) {
  16. ret = o.Next.Wait()
  17. if ret != frame.STOP {
  18. seq = Propose(o.Do)
  19. }
  20. return seq, ret
  21. }
  22. func Propose(a eval.Do) frame.Sequence {
  23. return func(fr frame.Frame) (frame.Sequence, frame.WAIT) {
  24. return This(a(eval.IN{}))
  25. }
  26. }
  27. func test(n node.Node) (bool, int) {
  28. switch n.(type) {
  29. case node.ConstantNode:
  30. return false, -1
  31. default:
  32. return true, 0
  33. }
  34. panic(0)
  35. }
  36. func prologue(_n node.Node) frame.Sequence {
  37. /* //fmt.Println(reflect.TypeOf(n))
  38. switch next := n.(type) {
  39. case node.EnterNode:
  40. var tail frame.Sequence
  41. tail = func(f frame.Frame) (frame.Sequence, frame.WAIT) {
  42. q := f.Root().Queue()
  43. if q != nil {
  44. f.Root().PushFor(q, nil)
  45. return tail, frame.NOW
  46. } else {
  47. return enterSeq, frame.NOW
  48. }
  49. }
  50. return tail
  51. case node.AssignNode:
  52. return assignSeq
  53. case node.OperationNode:
  54. switch n.(type) {
  55. case node.DyadicNode:
  56. return dopSeq
  57. case node.MonadicNode:
  58. return mopSeq
  59. default:
  60. panic("no such op")
  61. }
  62. case node.CallNode:
  63. return callSeq
  64. case node.ReturnNode:
  65. return returnSeq
  66. case node.ConditionalNode:
  67. return ifSeq
  68. case node.IfNode:
  69. return ifExpr
  70. case node.WhileNode:
  71. return whileSeq
  72. case node.RepeatNode:
  73. return repeatSeq
  74. case node.LoopNode:
  75. return loopSeq
  76. case node.ExitNode:
  77. return exitSeq
  78. case node.DerefNode:
  79. return derefSeq
  80. case node.InitNode:
  81. return frame.Tail(frame.STOP)
  82. case node.IndexNode:
  83. return indexSeq
  84. case node.FieldNode:
  85. return Propose(fieldSeq)
  86. case node.TrapNode:
  87. return func(f frame.Frame) (frame.Sequence, frame.WAIT) {
  88. switch code := next.Left().(type) {
  89. case node.ConstantNode:
  90. log.Println("TRAP:", traps.This(code.Data()))
  91. return frame.Tail(frame.WRONG), frame.NOW
  92. default:
  93. panic(fmt.Sprintln("unsupported code", reflect.TypeOf(code)))
  94. }
  95. }
  96. case node.WithNode:
  97. return withSeq
  98. case node.GuardNode:
  99. return guardSeq
  100. case node.CaseNode:
  101. return caseSeq
  102. case node.RangeNode:
  103. return rangeSeq
  104. case node.CompNode:
  105. return func(f frame.Frame) (frame.Sequence, frame.WAIT) {
  106. right := func(f frame.Frame) (frame.Sequence, frame.WAIT) {
  107. if next.Right() != nil {
  108. rt2.Push(rt2.New(next.Right()), f)
  109. return frame.Tail(frame.STOP), frame.LATER
  110. }
  111. return frame.End()
  112. }
  113. left := func(f frame.Frame) (frame.Sequence, frame.WAIT) {
  114. if next.Left() != nil {
  115. rt2.Push(rt2.New(next.Left()), f)
  116. return right, frame.LATER
  117. }
  118. return right, frame.NOW
  119. }
  120. return left, frame.NOW
  121. }
  122. default:
  123. panic(fmt.Sprintln("unknown node", reflect.TypeOf(n), n.Adr()))
  124. }*/
  125. switch n := _n.(type) {
  126. default:
  127. halt.As(100, reflect.TypeOf(n))
  128. }
  129. panic(0)
  130. }
  131. func epilogue(_n node.Node) frame.Sequence {
  132. /* switch e := n.(type) {
  133. case node.AssignNode, node.InitNode, node.CallNode, node.ConditionalNode, node.WhileNode,
  134. node.RepeatNode, node.ExitNode, node.WithNode, node.CaseNode, node.CompNode:
  135. return func(f frame.Frame) (frame.Sequence, frame.WAIT) {
  136. next := n.Link()
  137. //fmt.Println("from", reflect.TypeOf(n))
  138. //fmt.Println("next", reflect.TypeOf(next))
  139. if next != nil {
  140. nf := rt2.New(next)
  141. if nf != nil {
  142. f.Root().PushFor(nf, f.Parent())
  143. }
  144. }
  145. if _, ok := n.(node.CallNode); ok {
  146. if f.Parent() != nil {
  147. par := rt2.RegOf(f.Parent())
  148. for k, v := range rt2.RegOf(f) {
  149. par[k] = v
  150. }
  151. val := rt2.ValueOf(f.Parent())
  152. for k, v := range rt2.ValueOf(f) {
  153. val[k] = v
  154. }
  155. }
  156. }
  157. return frame.End()
  158. }
  159. case node.EnterNode:
  160. return func(f frame.Frame) (seq frame.Sequence, ret frame.WAIT) {
  161. //fmt.Println(rt_module.DomainModule(f.Domain()).Name)
  162. if e.Enter() == enter.PROCEDURE {
  163. rt2.ThisScope(f).Target().(scope.ScopeAllocator).Dispose(n)
  164. }
  165. //возвращаем результаты вызова функции
  166. if f.Parent() != nil {
  167. par := rt2.RegOf(f.Parent())
  168. for k, v := range rt2.RegOf(f) {
  169. par[k] = v
  170. }
  171. val := rt2.ValueOf(f.Parent())
  172. for k, v := range rt2.ValueOf(f) {
  173. val[k] = v
  174. }
  175. }
  176. return frame.End()
  177. }
  178. case node.OperationNode, node.ReturnNode, node.IfNode, node.LoopNode,
  179. node.DerefNode, node.IndexNode, node.TrapNode, node.GuardNode, node.RangeNode, node.FieldNode:
  180. return nil
  181. default:
  182. fmt.Println(reflect.TypeOf(n))
  183. panic("unhandled epilogue")
  184. }*/
  185. switch n := _n.(type) {
  186. default:
  187. halt.As(100, reflect.TypeOf(n))
  188. }
  189. panic(0)
  190. }