enter.go 1.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354
  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. )
  9. func enterSeq(f frame.Frame) (seq frame.Sequence, ret frame.WAIT) {
  10. var fu nodeframe.FrameUtils
  11. n := fu.NodeOf(f)
  12. body := fu.NodeOf(f).Right()
  13. if body == nil {
  14. return frame.End()
  15. }
  16. sm := scope.This(f.Domain().Discover(context.SCOPE))
  17. //fmt.Println(n.Object())
  18. if n.Object() != nil {
  19. par, ok := fu.DataOf(f)[n.Object()].(node.Node)
  20. //fmt.Println(fu.DataOf(f)[n.Object()])
  21. //fmt.Println(ok)
  22. if ok {
  23. sm.Allocate(n, false)
  24. sm.Initialize(n, n.Object().Link(), par)
  25. } else {
  26. sm.Allocate(n, true)
  27. }
  28. } else {
  29. sm.Allocate(n, true)
  30. }
  31. if f.Parent() != nil {
  32. //Вход в процедуру не несет значимых действий и просто заменяет себя в цепочке родителей на своего родителя
  33. fu.Push(fu.New(body), f.Parent())
  34. return frame.Tail(frame.STOP), frame.LATER
  35. } else {
  36. //Особый случай, вход в модуль, секция BEGIN
  37. fu.Push(fu.New(body), f)
  38. //Выход из модуля, секция CLOSE
  39. next := n.Link()
  40. if next != nil {
  41. seq = func(f frame.Frame) (frame.Sequence, frame.WAIT) {
  42. f.Root().PushFor(fu.New(next), f)
  43. return frame.Tail(frame.STOP), frame.LATER
  44. }
  45. } else {
  46. seq = frame.Tail(frame.STOP)
  47. }
  48. return seq, frame.LATER
  49. }
  50. }