assign.go 4.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143
  1. package rules
  2. import (
  3. "fmt"
  4. "fw/cp/constant"
  5. "fw/cp/constant/operation"
  6. "fw/cp/node"
  7. "fw/cp/statement"
  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.Utils.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.Utils.Push(rt2.Utils.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.Utils.DataOf(f)[op]
  26. })
  27. return frame.End()
  28. }
  29. ret = frame.LATER
  30. return seq, ret
  31. }
  32. func assignSeq(f frame.Frame) (seq frame.Sequence, ret frame.WAIT) {
  33. var fu nodeframe.FrameUtils
  34. a := fu.NodeOf(f)
  35. var leftId scope.ID
  36. var rightId scope.ID
  37. right := func(f frame.Frame) (seq frame.Sequence, ret frame.WAIT) {
  38. switch a.Right().(type) {
  39. case node.ConstantNode:
  40. seq = func(f frame.Frame) (seq frame.Sequence, ret frame.WAIT) {
  41. sc := f.Domain().Discover(context.SCOPE).(scope.Manager)
  42. sc.Update(leftId, func(interface{}) interface{} {
  43. return a.Right().(node.ConstantNode).Data()
  44. })
  45. return frame.End()
  46. }
  47. ret = frame.NOW
  48. case node.VariableNode:
  49. seq = func(f frame.Frame) (seq frame.Sequence, ret frame.WAIT) {
  50. sc := f.Domain().Discover(context.SCOPE).(scope.Manager)
  51. sc.Update(leftId, func(interface{}) interface{} {
  52. return sc.Select(scope.Designator(a.Right()))
  53. })
  54. return frame.End()
  55. }
  56. ret = frame.NOW
  57. case node.OperationNode, node.CallNode:
  58. fu.Push(fu.New(a.Right()), f)
  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, func(interface{}) interface{} {
  62. return fu.DataOf(f)[a.Right()]
  63. })
  64. return frame.End()
  65. }
  66. ret = frame.LATER
  67. case node.IndexNode:
  68. rightId = scope.Designator(a.Right())
  69. rt2.Utils.Push(rt2.Utils.New(a.Right()), f)
  70. seq = func(f frame.Frame) (seq frame.Sequence, ret frame.WAIT) {
  71. rightId.Index = new(int64)
  72. *rightId.Index = int64(rt2.Utils.DataOf(f)[a.Right()].(int32))
  73. sc := f.Domain().Discover(context.SCOPE).(scope.Manager)
  74. sc.Update(leftId, func(interface{}) interface{} {
  75. return sc.Select(rightId)
  76. })
  77. return frame.End()
  78. }
  79. ret = frame.LATER
  80. case node.ProcedureNode:
  81. sc := f.Domain().Discover(context.SCOPE).(scope.Manager)
  82. sc.Update(leftId, func(interface{}) interface{} {
  83. return a.Right().Object()
  84. })
  85. return frame.End()
  86. default:
  87. fmt.Println(reflect.TypeOf(a.Right()))
  88. panic("wrong right")
  89. }
  90. return seq, ret
  91. }
  92. switch a.(node.AssignNode).Statement() {
  93. case statement.ASSIGN:
  94. switch l := a.Left().(type) {
  95. case node.VariableNode, node.ParameterNode:
  96. leftId = scope.Designator(a.Left())
  97. seq, ret = right(f)
  98. case node.FieldNode:
  99. switch l.Left().(type) {
  100. case node.GuardNode:
  101. rt2.Utils.Push(rt2.Utils.New(l.Left()), f)
  102. seq = func(f frame.Frame) (seq frame.Sequence, ret frame.WAIT) {
  103. x := rt2.Utils.DataOf(f)[l.Left()].(node.Node)
  104. leftId = scope.Designator(a.Left(), x)
  105. fmt.Println(leftId)
  106. return right(f)
  107. }
  108. ret = frame.LATER
  109. default:
  110. leftId = scope.Designator(a.Left())
  111. seq, ret = right(f)
  112. }
  113. case node.IndexNode:
  114. leftId = scope.Designator(a.Left())
  115. rt2.Utils.Push(rt2.Utils.New(a.Left()), f)
  116. seq = func(f frame.Frame) (seq frame.Sequence, ret frame.WAIT) {
  117. leftId.Index = new(int64)
  118. *leftId.Index = int64(rt2.Utils.DataOf(f)[a.Left()].(int32))
  119. return right(f)
  120. }
  121. ret = frame.LATER
  122. default:
  123. fmt.Println(reflect.TypeOf(a.Left()))
  124. panic("wrong left")
  125. }
  126. case statement.INC:
  127. switch a.Left().(type) {
  128. case node.VariableNode, node.ParameterNode:
  129. seq, ret = incSeq(f)
  130. default:
  131. panic(fmt.Sprintln("wrong left", reflect.TypeOf(a.Left())))
  132. }
  133. default:
  134. panic(fmt.Sprintln("wrong statement", a.(node.AssignNode).Statement()))
  135. }
  136. return seq, ret
  137. }