123456789101112131415161718192021222324252627282930313233343536373839404142434445 |
- package rules
- import (
- "fw/cp/node"
- "fw/rt2/context"
- "fw/rt2/frame"
- "fw/rt2/nodeframe"
- "fw/rt2/scope"
- "ypk/assert"
- )
- func enterSeq(f frame.Frame) (seq frame.Sequence, ret frame.WAIT) {
- var fu nodeframe.FrameUtils
- n := fu.NodeOf(f)
- body := fu.NodeOf(f).Right()
- assert.For(body != nil, 40)
- sm := scope.This(f.Domain().Discover(context.SCOPE))
- sm.Allocate(n)
- if n.Object() != nil {
- par, ok := fu.DataOf(f)[n.Object()].(node.Node)
- if ok {
- sm.Initialize(n, n.Object().Link(), par)
- }
- }
- if f.Parent() != nil {
- //Вход в процедуру не несет значимых действий и просто заменяет себя в цепочке родителей на своего родителя
- fu.Push(fu.New(body), f.Parent())
- return frame.Tail(frame.STOP), frame.LATER
- } else {
- //Особый случай, вход в модуль, секция BEGIN
- fu.Push(fu.New(body), f)
- //Выход из модуля, секция CLOSE
- next := n.Link()
- if next != nil {
- seq = func(f frame.Frame) (frame.Sequence, frame.WAIT) {
- f.Root().PushFor(fu.New(next), f)
- return frame.Tail(frame.STOP), frame.LATER
- }
- } else {
- seq = frame.Tail(frame.STOP)
- }
- return seq, frame.LATER
- }
- }
|