enter.go 2.2 KB

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