assign.go 5.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191
  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 leftId cp.ID
  48. var rightId cp.ID
  49. right := func(f frame.Frame) (seq frame.Sequence, ret frame.WAIT) {
  50. switch a.Right().(type) {
  51. case node.ConstantNode:
  52. seq = func(f frame.Frame) (seq frame.Sequence, ret frame.WAIT) {
  53. sc := f.Domain().Discover(context.SCOPE).(scope.Manager)
  54. sc.Update(leftId, sc.Provide(a.Right())) //scope.Simple(a.Right().(node.ConstantNode).Data()))
  55. return frame.End()
  56. }
  57. ret = frame.NOW
  58. case node.VariableNode, node.ParameterNode:
  59. seq = func(f frame.Frame) (seq frame.Sequence, ret frame.WAIT) {
  60. sc := f.Domain().Discover(context.SCOPE).(scope.Manager)
  61. sc.Update(leftId, scope.Simple(sc.Select(a.Right().Object().Adr())))
  62. return frame.End()
  63. }
  64. ret = frame.NOW
  65. case node.OperationNode, node.CallNode, node.DerefNode:
  66. rt2.Push(rt2.New(a.Right()), f)
  67. rt2.Assert(f, func(f frame.Frame) (bool, int) {
  68. return rt2.ValueOf(f)[a.Right().Adr()] != nil, 61
  69. })
  70. seq = func(f frame.Frame) (seq frame.Sequence, ret frame.WAIT) {
  71. sc := f.Domain().Discover(context.SCOPE).(scope.Manager)
  72. sc.Update(leftId, scope.Simple(rt2.ValueOf(f)[a.Right().Adr()]))
  73. return frame.End()
  74. }
  75. ret = frame.LATER
  76. case node.IndexNode:
  77. rightId = a.Right().Adr()
  78. rt2.Push(rt2.New(a.Right()), f)
  79. seq = func(f frame.Frame) (seq frame.Sequence, ret frame.WAIT) {
  80. /* rightId.Index = new(int64)
  81. *rightId.Index = int64(rt2.DataOf(f)[a.Right()].(int32))
  82. sc := f.Domain().Discover(context.SCOPE).(scope.Manager)
  83. sc.Update(leftId, func(interface{}) interface{} {
  84. return sc.Select(rightId)
  85. }) */
  86. return frame.End()
  87. }
  88. ret = frame.LATER
  89. case node.ProcedureNode:
  90. // sc := f.Domain().Discover(context.SCOPE).(scope.Manager)
  91. /*sc.Update(leftId, func(interface{}) interface{} {
  92. return a.Right().Object()
  93. })*/
  94. return frame.End()
  95. default:
  96. fmt.Println(reflect.TypeOf(a.Right()))
  97. panic("wrong right")
  98. }
  99. return seq, ret
  100. }
  101. switch a.(node.AssignNode).Statement() {
  102. case statement.ASSIGN:
  103. switch l := a.Left().(type) {
  104. case node.VariableNode, node.ParameterNode:
  105. leftId = a.Left().Object().Adr()
  106. seq, ret = right(f)
  107. case node.FieldNode:
  108. switch l.Left().(type) {
  109. case node.GuardNode:
  110. rt2.Push(rt2.New(l.Left()), f)
  111. seq = func(f frame.Frame) (seq frame.Sequence, ret frame.WAIT) {
  112. // x := rt2.DataOf(f)[l.Left()].(node.Node)
  113. // leftId = scope.Designator(a.Left(), x)
  114. fmt.Println(leftId)
  115. return right(f)
  116. }
  117. ret = frame.LATER
  118. case node.DerefNode:
  119. // rt2.DataOf(f)[l.Left()] = scope.ID{}
  120. rt2.Push(rt2.New(l.Left()), f)
  121. seq = func(f frame.Frame) (frame.Sequence, frame.WAIT) {
  122. // leftId = rt2.DataOf(f)[l.Left()].(scope.ID)
  123. // leftId.Path = a.Left().Object().Name()
  124. return right(f)
  125. }
  126. ret = frame.LATER
  127. default:
  128. // leftId = scope.Designator(a.Left())
  129. seq, ret = right(f)
  130. }
  131. case node.IndexNode:
  132. // leftId = scope.Designator(a.Left())
  133. rt2.Push(rt2.New(a.Left()), f)
  134. seq = func(f frame.Frame) (seq frame.Sequence, ret frame.WAIT) {
  135. /* leftId.Index = new(int64)
  136. *leftId.Index = int64(rt2.DataOf(f)[a.Left()].(int32))*/
  137. return right(f)
  138. }
  139. ret = frame.LATER
  140. case node.DerefNode:
  141. // rt2.DataOf(f)[a.Left()] = scope.ID{}
  142. rt2.Push(rt2.New(a.Left()), f)
  143. seq = func(f frame.Frame) (frame.Sequence, frame.WAIT) {
  144. // leftId = rt2.DataOf(f)[a.Left()].(scope.ID)
  145. return right(f)
  146. }
  147. ret = frame.LATER
  148. default:
  149. fmt.Println(reflect.TypeOf(a.Left()))
  150. panic("wrong left")
  151. }
  152. case statement.INC, statement.INCL:
  153. switch a.Left().(type) {
  154. case node.VariableNode, node.ParameterNode:
  155. seq, ret = incSeq(f)
  156. default:
  157. panic(fmt.Sprintln("wrong left", reflect.TypeOf(a.Left())))
  158. }
  159. case statement.DEC, statement.EXCL:
  160. switch a.Left().(type) {
  161. case node.VariableNode, node.ParameterNode:
  162. seq, ret = decSeq(f)
  163. default:
  164. panic(fmt.Sprintln("wrong left", reflect.TypeOf(a.Left())))
  165. }
  166. case statement.NEW:
  167. // sc := f.Domain().Discover(context.SCOPE).(scope.Manager)
  168. // heap := scope.This(f.Domain().Discover(context.HEAP))
  169. if a.Right() != nil {
  170. seq, ret = This(expectExpr(f, a.Right(), func(...IN) OUT {
  171. fmt.Println("NEW", rt2.DataOf(f)[a.Right()], "here")
  172. // sc.Update(scope.Designator(a.Left()), heap.Target().(scope.HeapAllocator).Allocate(a.Left(), rt2.DataOf(f)[a.Right()]))
  173. return End()
  174. }))
  175. } else {
  176. fmt.Println("NEW here")
  177. // sc.Update(scope.Designator(a.Left()), heap.Target().(scope.HeapAllocator).Allocate(a.Left()))
  178. return frame.End()
  179. }
  180. default:
  181. panic(fmt.Sprintln("wrong statement", a.(node.AssignNode).Statement()))
  182. }
  183. return seq, ret
  184. }