enter.go 2.3 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071
  1. package rules
  2. import (
  3. "fw/cp/node"
  4. "fw/rt2"
  5. "fw/rt2/context"
  6. "fw/rt2/frame"
  7. "fw/rt2/module"
  8. "fw/rt2/scope"
  9. "fw/utils"
  10. )
  11. func enterSeq(f frame.Frame) (seq frame.Sequence, ret frame.WAIT) {
  12. n := rt2.NodeOf(f)
  13. body := rt2.NodeOf(f).Right()
  14. tail := func(f frame.Frame) (seq frame.Sequence, ret frame.WAIT) {
  15. if body == nil {
  16. //случай пустого тела процедуры/секции BEGIN
  17. return frame.End()
  18. } else if f.Parent() != nil {
  19. //Вход в процедуру не несет значимых действий и просто заменяет себя в цепочке родителей на своего родителя
  20. //При вызове фрейма с другим доменом это мешает, надо убрать
  21. //Через DataOf(f.Parent()) может передаваться результат выполнения
  22. //rt2.Push(rt2.New(body), f.Parent())
  23. rt2.Push(rt2.New(body), f)
  24. return frame.Tail(frame.STOP), frame.LATER
  25. } else {
  26. //Особый случай, вход в модуль, секция BEGIN
  27. rt2.Push(rt2.New(body), f)
  28. utils.PrintFrame("begin", module.DomainModule(f.Domain()).Name)
  29. //Выход из модуля, секция CLOSE
  30. next := n.Link()
  31. if next != nil {
  32. seq = func(f frame.Frame) (frame.Sequence, frame.WAIT) {
  33. utils.PrintFrame("end", module.DomainModule(f.Domain()).Name)
  34. f.Root().PushFor(rt2.New(next), f)
  35. return frame.Tail(frame.STOP), frame.END
  36. }
  37. } else {
  38. seq = frame.Tail(frame.STOP)
  39. }
  40. return seq, frame.BEGIN
  41. }
  42. }
  43. sm := f.Domain().Discover(context.SCOPE).(scope.Manager)
  44. //fmt.Println(n.Object())
  45. if n.Object() != nil {
  46. par, ok := rt2.RegOf(f)[n.Object()].(node.Node)
  47. //fmt.Println(rt2.DataOf(f)[n.Object()])
  48. //fmt.Println(ok)
  49. if ok {
  50. sm.Target().(scope.ScopeAllocator).Allocate(n, false)
  51. seq = func(f frame.Frame) (frame.Sequence, frame.WAIT) {
  52. return sm.Target().(scope.ScopeAllocator).Initialize(n,
  53. scope.PARAM{
  54. Objects: n.Object().Link(),
  55. Values: par,
  56. Frame: f,
  57. Tail: tail})
  58. }
  59. } else {
  60. sm.Target().(scope.ScopeAllocator).Allocate(n, true)
  61. seq = tail
  62. }
  63. } else {
  64. sm.Target().(scope.ScopeAllocator).Allocate(n, true)
  65. seq = tail
  66. }
  67. return seq, frame.NOW
  68. }