enter.go 1.3 KB

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