assign.go 5.2 KB

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