proc.go 2.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160
  1. package rt
  2. import (
  3. "cp/constant/enter"
  4. "cp/module"
  5. "cp/node"
  6. "errors"
  7. "fmt"
  8. "reflect"
  9. )
  10. type Result int
  11. const (
  12. OK Result = iota
  13. END
  14. ERROR
  15. )
  16. type Processor interface {
  17. ConnectTo(mod *module.Module) error
  18. Do() (Result, error)
  19. }
  20. type Sequence interface {
  21. Do(f *frame) Wait
  22. }
  23. func NewProcessor() Processor {
  24. return new(procImpl).Init()
  25. }
  26. type frame struct {
  27. p *procImpl
  28. parent *frame
  29. ir node.Node
  30. seq Sequence
  31. ret map[node.Node]interface{}
  32. }
  33. func (f *frame) Do() (wait Wait) {
  34. if f.seq == nil {
  35. panic("no sequence")
  36. }
  37. return f.seq.Do(f)
  38. }
  39. func (f *frame) OnPush() {
  40. switch f.ir.(type) {
  41. case node.AssignNode:
  42. f.ret = make(map[node.Node]interface{}, 2)
  43. f.seq = new(assignSeq)
  44. case node.OperationNode:
  45. f.ret = make(map[node.Node]interface{}, 3)
  46. f.seq = new(opSeq)
  47. case node.CallNode:
  48. f.seq = new(callSeq)
  49. case node.EnterNode:
  50. if f.ir.(node.EnterNode).Enter() == enter.PROCEDURE {
  51. fmt.Println("proc")
  52. } else {
  53. panic("cannot enter to module")
  54. }
  55. f.seq = new(enterSeq)
  56. default:
  57. fmt.Println(reflect.TypeOf(f.ir))
  58. panic("unknown ir")
  59. }
  60. }
  61. func (f *frame) OnPop() {
  62. switch f.ir.(type) {
  63. case node.AssignNode:
  64. if f.ir.Link() != nil {
  65. f.p.stack.Push(NewFrame(f.p, f.ir.Link()))
  66. }
  67. case node.OperationNode:
  68. f.parent.ret[f.ir] = f.ret[f.ir]
  69. case node.CallNode:
  70. if f.ir.Link() != nil {
  71. f.p.stack.Push(NewFrame(f.p, f.ir.Link()))
  72. }
  73. }
  74. }
  75. func (f *frame) push(t *frame) {
  76. t.parent = f
  77. f.p.stack.Push(t)
  78. }
  79. func NewFrame(p *procImpl, ir node.Node) Frame {
  80. f := new(frame)
  81. f.ir = ir
  82. f.p = p
  83. return f
  84. }
  85. type procImpl struct {
  86. stack Stack
  87. heap Heap
  88. cycle int64
  89. thisMod *module.Module
  90. }
  91. func (p *procImpl) Init() *procImpl {
  92. p.stack = NewStack()
  93. p.heap = NewHeap()
  94. return p
  95. }
  96. func (p *procImpl) ConnectTo(mod *module.Module) (err error) {
  97. p.thisMod = mod
  98. head := p.thisMod.Enter
  99. if head != nil {
  100. switch head.(type) {
  101. // особый случай, после enter вправо, а не вниз
  102. case node.EnterNode:
  103. p.stack.Push(NewFrame(p, head.Right()))
  104. default:
  105. panic("oops")
  106. }
  107. } else {
  108. err = errors.New("not a head node")
  109. }
  110. return err
  111. }
  112. func (p *procImpl) Do() (res Result, err error) {
  113. if p.stack.Top() != nil {
  114. p.cycle++
  115. f := p.stack.Top()
  116. //цикл дейкстры
  117. for {
  118. wait := f.Do()
  119. fmt.Println(wait)
  120. if wait == SKIP {
  121. break
  122. } else if wait == DO {
  123. } else if wait == WRONG {
  124. panic("something wrong")
  125. } else {
  126. if f == p.stack.Top() {
  127. p.stack.Pop()
  128. } else {
  129. panic("do not stop if not top on stack")
  130. }
  131. break
  132. }
  133. }
  134. } else {
  135. err = errors.New("no program")
  136. }
  137. if p.stack.Top() != nil {
  138. res = OK
  139. } else {
  140. res = END
  141. fmt.Println(p.heap)
  142. }
  143. return res, err
  144. }