assign.go 5.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190
  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. "ypk/halt"
  15. )
  16. func incSeq(f frame.Frame) (seq frame.Sequence, ret frame.WAIT) {
  17. n := rt2.NodeOf(f)
  18. op := node.New(constant.DYADIC, int(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(n.Left().Object().Adr(), scope.Simple(rt2.ValueOf(f)[op.Adr()]))
  26. return frame.End()
  27. }
  28. ret = frame.LATER
  29. return seq, ret
  30. }
  31. func decSeq(f frame.Frame) (seq frame.Sequence, ret frame.WAIT) {
  32. n := rt2.NodeOf(f)
  33. op := node.New(constant.DYADIC, int(cp.SomeAdr())).(node.OperationNode)
  34. op.SetOperation(operation.MINUS)
  35. op.SetLeft(n.Left())
  36. op.SetRight(n.Right())
  37. rt2.Push(rt2.New(op), f)
  38. seq = func(f frame.Frame) (seq frame.Sequence, ret frame.WAIT) {
  39. sc := f.Domain().Discover(context.SCOPE).(scope.Manager)
  40. sc.Update(n.Left().Object().Adr(), scope.Simple(rt2.ValueOf(f)[op.Adr()]))
  41. return frame.End()
  42. }
  43. ret = frame.LATER
  44. return seq, ret
  45. }
  46. func assignSeq(f frame.Frame) (seq frame.Sequence, ret frame.WAIT) {
  47. a := rt2.NodeOf(f)
  48. var leftId cp.ID
  49. var rightId cp.ID
  50. right := func(f frame.Frame) (seq frame.Sequence, ret frame.WAIT) {
  51. switch 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. sc.Update(leftId, sc.Provide(a.Right())) //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. sc.Update(leftId, scope.Simple(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. sc.Update(leftId, scope.Simple(rt2.ValueOf(f)[a.Right().Adr()]))
  74. return frame.End()
  75. }
  76. ret = frame.LATER
  77. case node.IndexNode:
  78. rightId = a.Right().Adr()
  79. rt2.Push(rt2.New(a.Right()), f)
  80. seq = func(f frame.Frame) (seq frame.Sequence, ret frame.WAIT) {
  81. /* rightId.Index = new(int64)
  82. *rightId.Index = int64(rt2.DataOf(f)[a.Right()].(int32))
  83. sc := f.Domain().Discover(context.SCOPE).(scope.Manager)
  84. sc.Update(leftId, func(interface{}) interface{} {
  85. return sc.Select(rightId)
  86. }) */
  87. return frame.End()
  88. }
  89. ret = frame.LATER
  90. case node.ProcedureNode:
  91. sc := f.Domain().Discover(context.SCOPE).(scope.Manager)
  92. sc.Update(leftId, sc.Provide(a.Right().Object()))
  93. return frame.End()
  94. default:
  95. fmt.Println(reflect.TypeOf(a.Right()))
  96. panic("wrong right")
  97. }
  98. return seq, ret
  99. }
  100. switch a.(node.AssignNode).Statement() {
  101. case statement.ASSIGN:
  102. switch l := a.Left().(type) {
  103. case node.VariableNode, node.ParameterNode:
  104. leftId = a.Left().Object().Adr()
  105. seq, ret = right(f)
  106. case node.FieldNode:
  107. switch l.Left().(type) {
  108. case node.GuardNode:
  109. rt2.Push(rt2.New(l.Left()), f)
  110. seq = func(f frame.Frame) (seq frame.Sequence, ret frame.WAIT) {
  111. // x := rt2.DataOf(f)[l.Left()].(node.Node)
  112. // leftId = scope.Designator(a.Left(), x)
  113. return right(f)
  114. }
  115. ret = frame.LATER
  116. case node.DerefNode:
  117. // rt2.DataOf(f)[l.Left()] = scope.ID{}
  118. rt2.Push(rt2.New(l.Left()), f)
  119. seq = func(f frame.Frame) (frame.Sequence, frame.WAIT) {
  120. // leftId = rt2.DataOf(f)[l.Left()].(scope.ID)
  121. // leftId.Path = a.Left().Object().Name()
  122. return right(f)
  123. }
  124. ret = frame.LATER
  125. default:
  126. halt.As(100, l.Object().Adr(), l.Left().Object().Adr())
  127. // leftId = scope.Designator(a.Left())
  128. seq, ret = right(f)
  129. }
  130. case node.IndexNode:
  131. // leftId = scope.Designator(a.Left())
  132. rt2.Push(rt2.New(a.Left()), f)
  133. seq = func(f frame.Frame) (seq frame.Sequence, ret frame.WAIT) {
  134. /* leftId.Index = new(int64)
  135. *leftId.Index = int64(rt2.DataOf(f)[a.Left()].(int32))*/
  136. return right(f)
  137. }
  138. ret = frame.LATER
  139. case node.DerefNode:
  140. // rt2.DataOf(f)[a.Left()] = scope.ID{}
  141. rt2.Push(rt2.New(a.Left()), f)
  142. seq = func(f frame.Frame) (frame.Sequence, frame.WAIT) {
  143. // leftId = rt2.DataOf(f)[a.Left()].(scope.ID)
  144. return right(f)
  145. }
  146. ret = frame.LATER
  147. default:
  148. fmt.Println(reflect.TypeOf(a.Left()))
  149. panic("wrong left")
  150. }
  151. case statement.INC, statement.INCL:
  152. switch a.Left().(type) {
  153. case node.VariableNode, node.ParameterNode:
  154. seq, ret = incSeq(f)
  155. default:
  156. panic(fmt.Sprintln("wrong left", reflect.TypeOf(a.Left())))
  157. }
  158. case statement.DEC, statement.EXCL:
  159. switch a.Left().(type) {
  160. case node.VariableNode, node.ParameterNode:
  161. seq, ret = decSeq(f)
  162. default:
  163. panic(fmt.Sprintln("wrong left", reflect.TypeOf(a.Left())))
  164. }
  165. case statement.NEW:
  166. // sc := f.Domain().Discover(context.SCOPE).(scope.Manager)
  167. // heap := scope.This(f.Domain().Discover(context.HEAP))
  168. if a.Right() != nil {
  169. seq, ret = This(expectExpr(f, a.Right(), func(...IN) OUT {
  170. fmt.Println("NEW", rt2.DataOf(f)[a.Right()], "here")
  171. // sc.Update(scope.Designator(a.Left()), heap.Target().(scope.HeapAllocator).Allocate(a.Left(), rt2.DataOf(f)[a.Right()]))
  172. return End()
  173. }))
  174. } else {
  175. fmt.Println("NEW here")
  176. // sc.Update(scope.Designator(a.Left()), heap.Target().(scope.HeapAllocator).Allocate(a.Left()))
  177. return frame.End()
  178. }
  179. default:
  180. panic(fmt.Sprintln("wrong statement", a.(node.AssignNode).Statement()))
  181. }
  182. return seq, ret
  183. }