enter.go 2.0 KB

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