while.go 1.2 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647
  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 whileSeq(f frame.Frame) (seq frame.Sequence, ret frame.WAIT) {
  11. n := rt2.NodeOf(f)
  12. var cond func(f frame.Frame) (frame.Sequence, frame.WAIT)
  13. next := func(f frame.Frame) (frame.Sequence, frame.WAIT) {
  14. done := scope.GoTypeFrom(rt2.ValueOf(f)[n.Left().Adr()]).(bool)
  15. rt2.RegOf(f)[n.Left()] = nil
  16. if done && n.Right() != nil {
  17. rt2.Push(rt2.New(n.Right()), f)
  18. return cond, frame.LATER
  19. } else if !done {
  20. return frame.End()
  21. } else if n.Right() == nil {
  22. return frame.End()
  23. } else {
  24. panic("unexpected while seq")
  25. }
  26. }
  27. cond = func(f frame.Frame) (frame.Sequence, frame.WAIT) {
  28. switch n.Left().(type) {
  29. case node.OperationNode:
  30. rt2.Push(rt2.New(n.Left()), f)
  31. seq = func(f frame.Frame) (seq frame.Sequence, ret frame.WAIT) {
  32. rt2.RegOf(f.Parent())[n] = rt2.RegOf(f)[n.Left()]
  33. rt2.ValueOf(f.Parent())[n.Adr()] = rt2.ValueOf(f)[n.Left().Adr()]
  34. return next, frame.LATER
  35. }
  36. ret = frame.LATER
  37. return seq, ret
  38. default:
  39. panic(fmt.Sprintf("unknown while expression", reflect.TypeOf(n.Left())))
  40. }
  41. }
  42. return cond, frame.NOW
  43. }