do.go 5.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252
  1. package eval
  2. import (
  3. "fw/cp/constant/enter"
  4. "fw/cp/node"
  5. "fw/rt2"
  6. "fw/rt2/context"
  7. "fw/rt2/frame"
  8. "fw/rt2/scope"
  9. "reflect"
  10. "ypk/assert"
  11. )
  12. import (
  13. "ypk/halt"
  14. )
  15. func BeginExpression(in IN) (out OUT) {
  16. switch e := in.IR.(type) {
  17. case node.ConstantNode:
  18. out = Now(getConst)
  19. case node.DyadicNode:
  20. out = Now(getDop)
  21. case node.MonadicNode:
  22. out = Now(getMop)
  23. case node.RangeNode:
  24. out = Now(getRange)
  25. case node.Designator:
  26. out = Now(BeginDesignator)
  27. default:
  28. halt.As(100, reflect.TypeOf(e))
  29. }
  30. return
  31. }
  32. func BeginDesignator(in IN) (out OUT) {
  33. switch e := in.IR.(type) {
  34. case node.VariableNode:
  35. out = Now(getVar)
  36. case node.ParameterNode:
  37. out = Now(getVarPar)
  38. case node.ProcedureNode:
  39. out = Now(getProc)
  40. case node.DerefNode:
  41. out = Now(getDeref)
  42. case node.FieldNode:
  43. out = Now(getField)
  44. case node.IndexNode:
  45. out = Now(getIndex)
  46. case node.GuardNode:
  47. out = Now(getGuard)
  48. default:
  49. halt.As(100, reflect.TypeOf(e))
  50. }
  51. return
  52. }
  53. func GetStrange(in IN, key interface{}, ss node.Node, next Do) (out OUT) {
  54. assert.For(ss != nil, 20)
  55. assert.For(key != nil, 21)
  56. switch ss.(type) {
  57. case node.IfNode:
  58. nf := rt2.New(ss)
  59. rt2.Push(nf, in.Frame)
  60. rt2.RegOf(in.Frame)[context.KEY] = key
  61. rt2.Assert(in.Frame, func(f frame.Frame, do frame.Condition) {
  62. v := rt2.RegOf(f)[key]
  63. do(v != nil, 1980)
  64. })
  65. return Later(func(IN) OUT {
  66. return Now(next)
  67. })
  68. default:
  69. halt.As(100, reflect.TypeOf(ss))
  70. }
  71. return
  72. }
  73. func GetExpression(in IN, key interface{}, expr node.Node, next Do) OUT {
  74. assert.For(expr != nil, 20)
  75. _, e_ok := expr.(node.Expression)
  76. _, d_ok := expr.(node.Designator)
  77. assert.For(e_ok || d_ok, 21, reflect.TypeOf(expr))
  78. assert.For(key != nil, 22)
  79. nf := rt2.New(expr)
  80. rt2.Push(nf, in.Frame)
  81. rt2.RegOf(in.Frame)[context.KEY] = key
  82. rt2.RegOf(in.Frame)[key] = nil
  83. rt2.Assert(in.Frame, func(f frame.Frame, do frame.Condition) {
  84. v := rt2.RegOf(f)[key]
  85. do(v != nil, 1961, key)
  86. })
  87. return Later(func(IN) OUT {
  88. return Now(next)
  89. })
  90. }
  91. func GetDesignator(in IN, key interface{}, design node.Node, next Do) OUT {
  92. assert.For(design != nil, 20)
  93. _, ok := design.(node.Designator)
  94. assert.For(ok, 21)
  95. assert.For(key != nil, 22)
  96. nf := rt2.New(design)
  97. rt2.Push(nf, in.Frame)
  98. rt2.RegOf(in.Frame)[context.KEY] = key
  99. rt2.RegOf(in.Frame)[key] = nil
  100. rt2.RegOf(in.Frame)[context.META] = nil
  101. rt2.Assert(in.Frame, func(f frame.Frame, do frame.Condition) {
  102. v := rt2.RegOf(f)[key]
  103. m := rt2.RegOf(f)[context.META]
  104. do(v != nil, 1957, " no data for ", key)
  105. do(m != nil, 1480, " no meta")
  106. })
  107. return Later(func(IN) OUT {
  108. return Now(next)
  109. })
  110. }
  111. func BeginStrange(in IN) OUT {
  112. switch s := in.IR.(type) {
  113. case node.IfNode:
  114. return Now(doIf)
  115. default:
  116. halt.As(100, reflect.TypeOf(s))
  117. }
  118. panic(0)
  119. }
  120. func BeginStatement(in IN) (out OUT) {
  121. switch n := in.IR.(type) {
  122. case node.EnterNode:
  123. var tail Do
  124. tail = func(in IN) OUT {
  125. q := in.Frame.Root().Queue()
  126. if q != nil {
  127. in.Frame.Root().PushFor(q, nil)
  128. return Later(tail)
  129. } else {
  130. return Now(doEnter)
  131. }
  132. }
  133. out = Now(tail)
  134. case node.CompNode:
  135. next := n
  136. return Now(func(IN) OUT {
  137. right := func(in IN) OUT {
  138. if next.Right() != nil {
  139. rt2.Push(rt2.New(next.Right()), in.Frame)
  140. return Later(Tail(STOP))
  141. }
  142. return End()
  143. }
  144. left := func(in IN) OUT {
  145. if next.Left() != nil {
  146. rt2.Push(rt2.New(next.Left()), in.Frame)
  147. return Later(right)
  148. }
  149. return Now(right)
  150. }
  151. return Now(left)
  152. })
  153. case node.AssignNode:
  154. out = Now(doAssign)
  155. case node.CallNode:
  156. out = Now(doCall)
  157. case node.ReturnNode:
  158. out = Now(doReturn)
  159. case node.ConditionalNode:
  160. out = Now(doCondition)
  161. case node.WhileNode:
  162. out = Now(doWhile)
  163. case node.RepeatNode:
  164. out = Now(doRepeat)
  165. case node.LoopNode:
  166. out = Now(doLoop)
  167. case node.ExitNode:
  168. out = Now(doExit)
  169. case node.InitNode:
  170. out = Later(Tail(STOP))
  171. case node.TrapNode:
  172. out = Now(doTrap)
  173. case node.WithNode:
  174. out = Now(doWith)
  175. case node.CaseNode:
  176. out = Now(doCase)
  177. default:
  178. halt.As(100, reflect.TypeOf(n))
  179. }
  180. return
  181. }
  182. func EndStatement(in IN) (out OUT) {
  183. switch n := in.IR.(type) {
  184. case node.EnterNode:
  185. out = Now(func(in IN) OUT {
  186. if n.Enter() == enter.PROCEDURE {
  187. rt2.CallScope(in.Frame).Target().(scope.ScopeAllocator).Dispose(n)
  188. }
  189. if in.Parent != nil {
  190. par := rt2.RegOf(in.Parent)
  191. for k, v := range rt2.RegOf(in.Frame) {
  192. par[k] = v
  193. }
  194. val := rt2.ValueOf(in.Parent)
  195. for k, v := range rt2.ValueOf(in.Frame) {
  196. val[k] = v
  197. }
  198. }
  199. return End()
  200. })
  201. case node.CallNode:
  202. out = Now(func(in IN) OUT {
  203. next := n.Link()
  204. if next != nil {
  205. nf := rt2.New(next)
  206. if nf != nil {
  207. in.Frame.Root().PushFor(nf, in.Parent)
  208. }
  209. }
  210. if _, ok := n.(node.CallNode); ok {
  211. if in.Parent != nil {
  212. par := rt2.RegOf(in.Parent)
  213. for k, v := range rt2.RegOf(in.Frame) {
  214. par[k] = v
  215. }
  216. val := rt2.ValueOf(in.Parent)
  217. for k, v := range rt2.ValueOf(in.Frame) {
  218. val[k] = v
  219. }
  220. }
  221. }
  222. return End()
  223. })
  224. case node.AssignNode, node.ConditionalNode, node.WhileNode, node.RepeatNode, node.ExitNode, node.InitNode, node.WithNode, node.CaseNode, node.CompNode:
  225. out = Now(func(in IN) OUT {
  226. next := n.Link()
  227. if next != nil {
  228. nf := rt2.New(next)
  229. if nf != nil {
  230. in.Frame.Root().PushFor(nf, in.Parent)
  231. }
  232. }
  233. return End()
  234. })
  235. case node.ReturnNode, node.LoopNode: //do nothing
  236. default:
  237. halt.As(100, "statement with no end", reflect.TypeOf(n))
  238. }
  239. if out.Next != WRONG {
  240. return out.Do(in)
  241. }
  242. return End()
  243. }