flow.go 4.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262
  1. package ir
  2. import (
  3. . "github.com/kpmy/ypk/tc"
  4. )
  5. type Block struct {
  6. ns `sexpr:"block"`
  7. End snamed //label in the end
  8. Expr []CodeExpr
  9. }
  10. func (b *Block) Validate() error { return nil }
  11. func (b *Block) Eval() {}
  12. func (b *Block) Children() (ret []interface{}) {
  13. if b.End.name != "" {
  14. ret = append(ret, b.End.name)
  15. }
  16. for _, e := range b.Expr {
  17. ret = append(ret, e)
  18. }
  19. return
  20. }
  21. type Loop struct {
  22. ns `sexpr:"loop"`
  23. Start snamed
  24. End snamed
  25. Expr []CodeExpr
  26. }
  27. func (l *Loop) Validate() error { return nil }
  28. func (l *Loop) Eval() {}
  29. func (l *Loop) Children() (ret []interface{}) {
  30. if l.End.name != "" {
  31. ret = append(ret, l.End.name)
  32. }
  33. if l.Start.name != "" {
  34. ret = append(ret, l.Start.name)
  35. }
  36. for _, e := range l.Expr {
  37. ret = append(ret, e)
  38. }
  39. return
  40. }
  41. type SelectExpr struct {
  42. ns `sexpr:"select"`
  43. Expr, ElseExpr CodeExpr
  44. CondExpr CodeExpr
  45. }
  46. func (s *SelectExpr) Validate() error {
  47. if s.Expr == nil {
  48. return Error("select expr is nil")
  49. }
  50. if s.ElseExpr == nil {
  51. return Error("select else expr is nil")
  52. }
  53. if s.CondExpr == nil {
  54. return Error("select cond expr is nil")
  55. }
  56. return nil
  57. }
  58. func (*SelectExpr) Eval() {}
  59. func (s *SelectExpr) Children() (ret []interface{}) {
  60. return append(ret, s.Expr, s.ElseExpr, s.CondExpr)
  61. }
  62. type If struct {
  63. ns `sexpr:"if"`
  64. Expr, ElseExpr []CodeExpr
  65. Name, ElseName snamed
  66. CondExpr CodeExpr
  67. }
  68. type thenExpr struct {
  69. ns `sexpr:"then"`
  70. snamed
  71. Expr []CodeExpr
  72. }
  73. type elseExpr struct {
  74. ns `sexpr:"else"`
  75. snamed
  76. Expr []CodeExpr
  77. }
  78. func (t *thenExpr) Validate() error { return nil }
  79. func (t *thenExpr) Children() (ret []interface{}) {
  80. if t.name != "" {
  81. ret = append(ret, t.name)
  82. }
  83. for _, e := range t.Expr {
  84. ret = append(ret, e)
  85. }
  86. return
  87. }
  88. func (e *elseExpr) Validate() error { return nil }
  89. func (e *elseExpr) Children() (ret []interface{}) {
  90. if e.name != "" {
  91. ret = append(ret, e.name)
  92. }
  93. for _, e := range e.Expr {
  94. ret = append(ret, e)
  95. }
  96. return
  97. }
  98. func (i *If) Validate() error {
  99. if i.Expr == nil {
  100. return Error("if expr is nil")
  101. }
  102. if i.ElseExpr == nil {
  103. return Error("if else expr is nil")
  104. }
  105. if i.CondExpr == nil {
  106. return Error("if cond expr is nil")
  107. }
  108. return nil
  109. }
  110. func (*If) Eval() {}
  111. func (s *If) Children() (ret []interface{}) {
  112. ret = append(ret, s.CondExpr)
  113. then := &thenExpr{}
  114. then.snamed = s.Name
  115. then.Expr = s.Expr
  116. ret = append(ret, then)
  117. els := &elseExpr{}
  118. els.snamed = s.ElseName
  119. els.Expr = s.ElseExpr
  120. ret = append(ret, els)
  121. return
  122. }
  123. type IfExpr struct {
  124. ns `sexpr:"if"`
  125. Expr, ElseExpr CodeExpr
  126. CondExpr CodeExpr
  127. }
  128. func (i *IfExpr) Validate() error {
  129. if i.Expr == nil {
  130. return Error("if expr is nil")
  131. }
  132. if i.CondExpr == nil {
  133. return Error("if cond expr is nil")
  134. }
  135. return nil
  136. }
  137. func (*IfExpr) Eval() {}
  138. func (i *IfExpr) Children() (ret []interface{}) {
  139. ret = append(ret, i.CondExpr, i.Expr)
  140. if i.ElseExpr != nil {
  141. ret = append(ret, i.ElseExpr)
  142. }
  143. return
  144. }
  145. type Br struct {
  146. ns `sexpr:"br"`
  147. Var Variable
  148. Expr CodeExpr
  149. }
  150. func (b *Br) Validate() error {
  151. if b.Var.IsEmpty() {
  152. return Error("br variable empty")
  153. }
  154. return nil
  155. }
  156. func (b *Br) Eval() {}
  157. func (b *Br) Children() (ret []interface{}) {
  158. ret = append(ret, b.Var)
  159. if b.Expr != nil {
  160. ret = append(ret, b.Expr)
  161. }
  162. return
  163. }
  164. type BrIf struct {
  165. ns `sexpr:"br_if"`
  166. Var Variable
  167. Cond, Expr CodeExpr
  168. }
  169. func (b *BrIf) Validate() error {
  170. if b.Var.IsEmpty() {
  171. return Error("br_if variable empty")
  172. }
  173. return nil
  174. }
  175. func (b *BrIf) Eval() {}
  176. func (b *BrIf) Children() (ret []interface{}) {
  177. ret = append(ret, b.Var)
  178. if b.Cond != nil {
  179. ret = append(ret, b.Cond)
  180. }
  181. if b.Expr != nil {
  182. ret = append(ret, b.Expr)
  183. }
  184. return
  185. }
  186. type BrTable struct {
  187. ns `sexpr:"br_table"`
  188. Vars []Variable
  189. Default Variable
  190. Cond, Expr CodeExpr
  191. }
  192. func (b *BrTable) Validate() error {
  193. if b.Default.IsEmpty() {
  194. return Error("br_table variable empty")
  195. }
  196. if b.Cond == nil {
  197. return Error("br_table condition is empty")
  198. }
  199. return nil
  200. }
  201. func (b *BrTable) Eval() {}
  202. func (b *BrTable) Children() (ret []interface{}) {
  203. for _, v := range b.Vars {
  204. ret = append(ret, v)
  205. }
  206. ret = append(ret, b.Default, b.Cond)
  207. if b.Expr != nil {
  208. ret = append(ret, b.Expr)
  209. }
  210. return
  211. }