do.go 5.6 KB

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