assign.go 5.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200
  1. package rules
  2. import (
  3. "fmt"
  4. "fw/cp"
  5. "fw/cp/constant"
  6. "fw/cp/constant/operation"
  7. "fw/cp/constant/statement"
  8. "fw/cp/node"
  9. "fw/rt2"
  10. "fw/rt2/context"
  11. "fw/rt2/frame"
  12. "fw/rt2/nodeframe"
  13. "fw/rt2/scope"
  14. "reflect"
  15. )
  16. func incSeq(f frame.Frame) (seq frame.Sequence, ret frame.WAIT) {
  17. n := rt2.NodeOf(f)
  18. op := node.New(constant.DYADIC, cp.SomeAdr()).(node.OperationNode)
  19. op.SetOperation(operation.PLUS)
  20. op.SetLeft(n.Left())
  21. op.SetRight(n.Right())
  22. rt2.Push(rt2.New(op), f)
  23. seq = func(f frame.Frame) (seq frame.Sequence, ret frame.WAIT) {
  24. sc := f.Domain().Discover(context.SCOPE).(scope.Manager)
  25. sc.Update(scope.Designator(n.Left()), func(interface{}) interface{} {
  26. return rt2.DataOf(f)[op]
  27. })
  28. return frame.End()
  29. }
  30. ret = frame.LATER
  31. return seq, ret
  32. }
  33. func decSeq(f frame.Frame) (seq frame.Sequence, ret frame.WAIT) {
  34. n := rt2.NodeOf(f)
  35. op := node.New(constant.DYADIC, cp.SomeAdr()).(node.OperationNode)
  36. op.SetOperation(operation.MINUS)
  37. op.SetLeft(n.Left())
  38. op.SetRight(n.Right())
  39. rt2.Push(rt2.New(op), f)
  40. seq = func(f frame.Frame) (seq frame.Sequence, ret frame.WAIT) {
  41. sc := f.Domain().Discover(context.SCOPE).(scope.Manager)
  42. sc.Update(scope.Designator(n.Left()), func(interface{}) interface{} {
  43. return rt2.DataOf(f)[op]
  44. })
  45. return frame.End()
  46. }
  47. ret = frame.LATER
  48. return seq, ret
  49. }
  50. func assignSeq(f frame.Frame) (seq frame.Sequence, ret frame.WAIT) {
  51. var fu nodeframe.FrameUtils
  52. a := fu.NodeOf(f)
  53. var leftId scope.ID
  54. var rightId scope.ID
  55. right := func(f frame.Frame) (seq frame.Sequence, ret frame.WAIT) {
  56. switch a.Right().(type) {
  57. case node.ConstantNode:
  58. seq = func(f frame.Frame) (seq frame.Sequence, ret frame.WAIT) {
  59. sc := f.Domain().Discover(context.SCOPE).(scope.Manager)
  60. sc.Update(leftId, func(interface{}) interface{} {
  61. return a.Right().(node.ConstantNode).Data()
  62. })
  63. return frame.End()
  64. }
  65. ret = frame.NOW
  66. case node.VariableNode, node.ParameterNode:
  67. seq = func(f frame.Frame) (seq frame.Sequence, ret frame.WAIT) {
  68. sc := f.Domain().Discover(context.SCOPE).(scope.Manager)
  69. sc.Update(leftId, func(interface{}) interface{} {
  70. return sc.Select(scope.Designator(a.Right()))
  71. })
  72. return frame.End()
  73. }
  74. ret = frame.NOW
  75. case node.OperationNode, node.CallNode, node.DerefNode:
  76. fu.Push(fu.New(a.Right()), f)
  77. seq = func(f frame.Frame) (seq frame.Sequence, ret frame.WAIT) {
  78. sc := f.Domain().Discover(context.SCOPE).(scope.Manager)
  79. sc.Update(leftId, func(interface{}) interface{} {
  80. return fu.DataOf(f)[a.Right()]
  81. })
  82. return frame.End()
  83. }
  84. ret = frame.LATER
  85. case node.IndexNode:
  86. rightId = scope.Designator(a.Right())
  87. rt2.Push(rt2.New(a.Right()), f)
  88. seq = func(f frame.Frame) (seq frame.Sequence, ret frame.WAIT) {
  89. rightId.Index = new(int64)
  90. *rightId.Index = int64(rt2.DataOf(f)[a.Right()].(int32))
  91. sc := f.Domain().Discover(context.SCOPE).(scope.Manager)
  92. sc.Update(leftId, func(interface{}) interface{} {
  93. return sc.Select(rightId)
  94. })
  95. return frame.End()
  96. }
  97. ret = frame.LATER
  98. case node.ProcedureNode:
  99. sc := f.Domain().Discover(context.SCOPE).(scope.Manager)
  100. sc.Update(leftId, func(interface{}) interface{} {
  101. return a.Right().Object()
  102. })
  103. return frame.End()
  104. default:
  105. fmt.Println(reflect.TypeOf(a.Right()))
  106. panic("wrong right")
  107. }
  108. return seq, ret
  109. }
  110. switch a.(node.AssignNode).Statement() {
  111. case statement.ASSIGN:
  112. switch l := a.Left().(type) {
  113. case node.VariableNode, node.ParameterNode:
  114. leftId = scope.Designator(a.Left())
  115. seq, ret = right(f)
  116. case node.FieldNode:
  117. switch l.Left().(type) {
  118. case node.GuardNode:
  119. rt2.Push(rt2.New(l.Left()), f)
  120. seq = func(f frame.Frame) (seq frame.Sequence, ret frame.WAIT) {
  121. x := rt2.DataOf(f)[l.Left()].(node.Node)
  122. leftId = scope.Designator(a.Left(), x)
  123. fmt.Println(leftId)
  124. return right(f)
  125. }
  126. ret = frame.LATER
  127. case node.DerefNode:
  128. rt2.DataOf(f)[l.Left()] = scope.ID{}
  129. rt2.Push(rt2.New(l.Left()), f)
  130. seq = func(f frame.Frame) (frame.Sequence, frame.WAIT) {
  131. leftId = rt2.DataOf(f)[l.Left()].(scope.ID)
  132. leftId.Path = a.Left().Object().Name()
  133. return right(f)
  134. }
  135. ret = frame.LATER
  136. default:
  137. leftId = scope.Designator(a.Left())
  138. seq, ret = right(f)
  139. }
  140. case node.IndexNode:
  141. leftId = scope.Designator(a.Left())
  142. rt2.Push(rt2.New(a.Left()), f)
  143. seq = func(f frame.Frame) (seq frame.Sequence, ret frame.WAIT) {
  144. leftId.Index = new(int64)
  145. *leftId.Index = int64(rt2.DataOf(f)[a.Left()].(int32))
  146. return right(f)
  147. }
  148. ret = frame.LATER
  149. case node.DerefNode:
  150. rt2.DataOf(f)[a.Left()] = scope.ID{}
  151. rt2.Push(rt2.New(a.Left()), f)
  152. seq = func(f frame.Frame) (frame.Sequence, frame.WAIT) {
  153. leftId = rt2.DataOf(f)[a.Left()].(scope.ID)
  154. return right(f)
  155. }
  156. ret = frame.LATER
  157. default:
  158. fmt.Println(reflect.TypeOf(a.Left()))
  159. panic("wrong left")
  160. }
  161. case statement.INC, statement.INCL:
  162. switch a.Left().(type) {
  163. case node.VariableNode, node.ParameterNode:
  164. seq, ret = incSeq(f)
  165. default:
  166. panic(fmt.Sprintln("wrong left", reflect.TypeOf(a.Left())))
  167. }
  168. case statement.DEC, statement.EXCL:
  169. switch a.Left().(type) {
  170. case node.VariableNode, node.ParameterNode:
  171. seq, ret = decSeq(f)
  172. default:
  173. panic(fmt.Sprintln("wrong left", reflect.TypeOf(a.Left())))
  174. }
  175. case statement.NEW:
  176. sc := f.Domain().Discover(context.SCOPE).(scope.Manager)
  177. heap := scope.This(f.Domain().Discover(context.HEAP))
  178. if a.Right() != nil {
  179. seq, ret = This(expectExpr(f, a.Right(), func(...IN) OUT {
  180. fmt.Println("NEW", rt2.DataOf(f)[a.Right()], "here")
  181. sc.Update(scope.Designator(a.Left()), heap.Target().(scope.HeapAllocator).Allocate(a.Left(), rt2.DataOf(f)[a.Right()]))
  182. return End()
  183. }))
  184. } else {
  185. fmt.Println("NEW here")
  186. sc.Update(scope.Designator(a.Left()), heap.Target().(scope.HeapAllocator).Allocate(a.Left()))
  187. return frame.End()
  188. }
  189. default:
  190. panic(fmt.Sprintln("wrong statement", a.(node.AssignNode).Statement()))
  191. }
  192. return seq, ret
  193. }