assign.go 5.7 KB

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