enter.go 1.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445
  1. package rules
  2. import (
  3. "fw/cp/node"
  4. "fw/rt2/context"
  5. "fw/rt2/frame"
  6. "fw/rt2/nodeframe"
  7. "fw/rt2/scope"
  8. "ypk/assert"
  9. )
  10. func enterSeq(f frame.Frame) (seq frame.Sequence, ret frame.WAIT) {
  11. var fu nodeframe.FrameUtils
  12. n := fu.NodeOf(f)
  13. body := fu.NodeOf(f).Right()
  14. assert.For(body != nil, 40)
  15. sm := scope.This(f.Domain().Discover(context.SCOPE))
  16. sm.Allocate(n)
  17. if n.Object() != nil {
  18. par, ok := fu.DataOf(f)[n.Object()].(node.Node)
  19. if ok {
  20. sm.Initialize(n, n.Object().Link(), par)
  21. }
  22. }
  23. if f.Parent() != nil {
  24. //Вход в процедуру не несет значимых действий и просто заменяет себя в цепочке родителей на своего родителя
  25. fu.Push(fu.New(body), f.Parent())
  26. return frame.Tail(frame.STOP), frame.LATER
  27. } else {
  28. //Особый случай, вход в модуль, секция BEGIN
  29. fu.Push(fu.New(body), f)
  30. //Выход из модуля, секция CLOSE
  31. next := n.Link()
  32. if next != nil {
  33. seq = func(f frame.Frame) (frame.Sequence, frame.WAIT) {
  34. f.Root().PushFor(fu.New(next), f)
  35. return frame.Tail(frame.STOP), frame.LATER
  36. }
  37. } else {
  38. seq = frame.Tail(frame.STOP)
  39. }
  40. return seq, frame.LATER
  41. }
  42. }