if.go 1.5 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758
  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 ifExpr(f frame.Frame) (seq frame.Sequence, ret frame.WAIT) {
  11. n := rt2.NodeOf(f)
  12. switch n.Left().(type) {
  13. case node.OperationNode:
  14. rt2.Push(rt2.New(n.Left()), f)
  15. seq = func(f frame.Frame) (seq frame.Sequence, ret frame.WAIT) {
  16. rt2.RegOf(f.Parent())[n] = rt2.RegOf(f)[n.Left()]
  17. rt2.ValueOf(f.Parent())[n.Adr()] = rt2.ValueOf(f)[n.Left().Adr()]
  18. return frame.End()
  19. }
  20. ret = frame.LATER
  21. default:
  22. panic(fmt.Sprintf("unknown condition expression", reflect.TypeOf(n.Left())))
  23. }
  24. return seq, ret
  25. }
  26. func ifSeq(f frame.Frame) (seq frame.Sequence, ret frame.WAIT) {
  27. n := rt2.NodeOf(f)
  28. rt2.RegOf(f)[0] = n.Left() //if
  29. rt2.Push(rt2.New(n.Left()), f)
  30. seq = func(f frame.Frame) (frame.Sequence, frame.WAIT) {
  31. last := rt2.RegOf(f)[0].(node.Node)
  32. done := scope.GoTypeFrom(rt2.ValueOf(f)[last.Adr()]).(bool)
  33. rt2.RegOf(f)[last] = nil
  34. if done && last.Right() != nil {
  35. rt2.Push(rt2.New(last.Right()), f)
  36. return frame.Tail(frame.STOP), frame.LATER
  37. } else if last.Right() == nil {
  38. return frame.End()
  39. } else if last.Link() != nil { //elsif
  40. rt2.RegOf(f)[0] = last.Link()
  41. rt2.Push(rt2.New(last.Link()), f)
  42. return seq, frame.LATER
  43. } else if n.Right() != nil { //else
  44. rt2.Push(rt2.New(n.Right()), f)
  45. return frame.Tail(frame.STOP), frame.LATER
  46. } else if n.Right() == nil {
  47. return frame.End()
  48. } else if last == n.Right() {
  49. return frame.End()
  50. } else {
  51. panic("conditional sequence wrong")
  52. }
  53. }
  54. return seq, frame.LATER
  55. }