repeat.go 1.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748
  1. package rules
  2. import (
  3. "fmt"
  4. "fw/cp/node"
  5. "fw/rt2"
  6. "fw/rt2/frame"
  7. "fw/rt2/scope"
  8. "reflect"
  9. )
  10. func repeatSeq(f frame.Frame) (seq frame.Sequence, ret frame.WAIT) {
  11. n := rt2.NodeOf(f)
  12. rt2.ValueOf(f)[n.Right().Adr()] = scope.TypeFromGo(false)
  13. var cond func(f frame.Frame) (frame.Sequence, frame.WAIT)
  14. next := func(f frame.Frame) (frame.Sequence, frame.WAIT) {
  15. done := scope.GoTypeFrom(rt2.ValueOf(f)[n.Right().Adr()]).(bool)
  16. rt2.ValueOf(f)[n.Right().Adr()] = nil
  17. if !done && n.Left() != nil {
  18. rt2.Push(rt2.New(n.Left()), f)
  19. return cond, frame.LATER
  20. } else if done {
  21. return frame.End()
  22. } else if n.Left() == nil {
  23. return frame.End()
  24. } else {
  25. panic("unexpected repeat seq")
  26. }
  27. }
  28. cond = func(f frame.Frame) (frame.Sequence, frame.WAIT) {
  29. switch n.Right().(type) {
  30. case node.OperationNode:
  31. rt2.Push(rt2.New(n.Right()), f)
  32. seq = func(f frame.Frame) (seq frame.Sequence, ret frame.WAIT) {
  33. rt2.RegOf(f.Parent())[n] = rt2.RegOf(f)[n.Right()]
  34. rt2.ValueOf(f.Parent())[n.Adr()] = rt2.ValueOf(f)[n.Right().Adr()]
  35. return next, frame.LATER
  36. }
  37. ret = frame.LATER
  38. return seq, ret
  39. default:
  40. panic(fmt.Sprintf("unknown repeat expression", reflect.TypeOf(n.Left())))
  41. }
  42. }
  43. return next, frame.NOW
  44. }