do.go 5.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247
  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) (bool, int) {
  62. v := rt2.RegOf(f)[key]
  63. return 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.Assert(in.Frame, func(f frame.Frame) (bool, int) {
  83. v := rt2.RegOf(f)[key]
  84. return v != nil, 1961
  85. })
  86. return Later(func(IN) OUT {
  87. return Now(next)
  88. })
  89. }
  90. func GetDesignator(in IN, key interface{}, design node.Node, next Do) OUT {
  91. assert.For(design != nil, 20)
  92. _, ok := design.(node.Designator)
  93. assert.For(ok, 21)
  94. assert.For(key != nil, 22)
  95. nf := rt2.New(design)
  96. rt2.Push(nf, in.Frame)
  97. rt2.RegOf(in.Frame)[context.KEY] = key
  98. rt2.Assert(in.Frame, func(f frame.Frame) (bool, int) {
  99. v := rt2.RegOf(f)[key]
  100. return v != nil, 1957
  101. })
  102. return Later(func(IN) OUT {
  103. return Now(next)
  104. })
  105. }
  106. func BeginStrange(in IN) OUT {
  107. switch s := in.IR.(type) {
  108. case node.IfNode:
  109. return Now(doIf)
  110. default:
  111. halt.As(100, reflect.TypeOf(s))
  112. }
  113. panic(0)
  114. }
  115. func BeginStatement(in IN) (out OUT) {
  116. switch n := in.IR.(type) {
  117. case node.EnterNode:
  118. var tail Do
  119. tail = func(in IN) OUT {
  120. q := in.Frame.Root().Queue()
  121. if q != nil {
  122. in.Frame.Root().PushFor(q, nil)
  123. return Later(tail)
  124. } else {
  125. return Now(doEnter)
  126. }
  127. }
  128. out = Now(tail)
  129. case node.CompNode:
  130. next := n
  131. return Now(func(IN) OUT {
  132. right := func(in IN) OUT {
  133. if next.Right() != nil {
  134. rt2.Push(rt2.New(next.Right()), in.Frame)
  135. return Later(Tail(STOP))
  136. }
  137. return End()
  138. }
  139. left := func(in IN) OUT {
  140. if next.Left() != nil {
  141. rt2.Push(rt2.New(next.Left()), in.Frame)
  142. return Later(right)
  143. }
  144. return Now(right)
  145. }
  146. return Now(left)
  147. })
  148. case node.AssignNode:
  149. out = Now(doAssign)
  150. case node.CallNode:
  151. out = Now(doCall)
  152. case node.ReturnNode:
  153. out = Now(doReturn)
  154. case node.ConditionalNode:
  155. out = Now(doCondition)
  156. case node.WhileNode:
  157. out = Now(doWhile)
  158. case node.RepeatNode:
  159. out = Now(doRepeat)
  160. case node.LoopNode:
  161. out = Now(doLoop)
  162. case node.ExitNode:
  163. out = Now(doExit)
  164. case node.InitNode:
  165. out = Later(Tail(STOP))
  166. case node.TrapNode:
  167. out = Now(doTrap)
  168. case node.WithNode:
  169. out = Now(doWith)
  170. case node.CaseNode:
  171. out = Now(doCase)
  172. default:
  173. halt.As(100, reflect.TypeOf(n))
  174. }
  175. return
  176. }
  177. func EndStatement(in IN) (out OUT) {
  178. switch n := in.IR.(type) {
  179. case node.EnterNode:
  180. out = Now(func(in IN) OUT {
  181. if n.Enter() == enter.PROCEDURE {
  182. rt2.ThisScope(in.Frame).Target().(scope.ScopeAllocator).Dispose(n)
  183. }
  184. if in.Parent != nil {
  185. par := rt2.RegOf(in.Parent)
  186. for k, v := range rt2.RegOf(in.Frame) {
  187. par[k] = v
  188. }
  189. val := rt2.ValueOf(in.Parent)
  190. for k, v := range rt2.ValueOf(in.Frame) {
  191. val[k] = v
  192. }
  193. }
  194. return End()
  195. })
  196. case node.CallNode:
  197. out = Now(func(in IN) OUT {
  198. next := n.Link()
  199. if next != nil {
  200. nf := rt2.New(next)
  201. if nf != nil {
  202. in.Frame.Root().PushFor(nf, in.Parent)
  203. }
  204. }
  205. if _, ok := n.(node.CallNode); ok {
  206. if in.Parent != nil {
  207. par := rt2.RegOf(in.Parent)
  208. for k, v := range rt2.RegOf(in.Frame) {
  209. par[k] = v
  210. }
  211. val := rt2.ValueOf(in.Parent)
  212. for k, v := range rt2.ValueOf(in.Frame) {
  213. val[k] = v
  214. }
  215. }
  216. }
  217. return End()
  218. })
  219. case node.AssignNode, node.ConditionalNode, node.WhileNode, node.RepeatNode, node.ExitNode, node.InitNode, node.WithNode, node.CaseNode, node.CompNode:
  220. out = Now(func(in IN) OUT {
  221. next := n.Link()
  222. if next != nil {
  223. nf := rt2.New(next)
  224. if nf != nil {
  225. in.Frame.Root().PushFor(nf, in.Parent)
  226. }
  227. }
  228. return End()
  229. })
  230. case node.ReturnNode, node.LoopNode: //do nothing
  231. default:
  232. halt.As(100, "statement with no end", reflect.TypeOf(n))
  233. }
  234. if out.Next != WRONG {
  235. return out.Do(in)
  236. }
  237. return End()
  238. }