val.go 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558
  1. package modern
  2. import (
  3. "fmt"
  4. "fw/cp"
  5. "fw/cp/node"
  6. "fw/cp/object"
  7. "fw/rt2/scope"
  8. "math/big"
  9. "reflect"
  10. "ypk/assert"
  11. "ypk/halt"
  12. )
  13. type data struct {
  14. link object.Object
  15. val interface{}
  16. }
  17. type arr struct {
  18. link object.Object
  19. val []interface{}
  20. length int64
  21. }
  22. type dynarr struct {
  23. link object.Object
  24. val []interface{}
  25. }
  26. type proc struct {
  27. link object.Object
  28. }
  29. type rec struct {
  30. link object.Object
  31. scope.Record
  32. l *level
  33. }
  34. func (r *rec) String() string {
  35. return r.link.Name()
  36. }
  37. func (r *rec) Id() cp.ID {
  38. return r.link.Adr()
  39. }
  40. func (r *rec) Set(v scope.Value) {
  41. }
  42. func (r *rec) Get(id cp.ID) scope.Value {
  43. k := r.l.k[id]
  44. if r.l.v[k] == nil { //ref
  45. return r.l.r[k]
  46. } else {
  47. return r.l.v[k]
  48. }
  49. }
  50. func newRec(o object.Object) *rec {
  51. _, ok := o.Complex().(object.RecordType)
  52. assert.For(ok, 20)
  53. return &rec{link: o}
  54. }
  55. func (p *proc) String() string {
  56. return fmt.Sprint(p.link.Adr(), p.link.Name())
  57. }
  58. func (x *data) Id() cp.ID {
  59. return x.link.Adr()
  60. }
  61. func (x *arr) Id() cp.ID {
  62. return x.link.Adr()
  63. }
  64. func (x *dynarr) Id() cp.ID {
  65. return x.link.Adr()
  66. }
  67. func (a *arr) Set(v scope.Value) {
  68. switch x := v.(type) {
  69. case STRING:
  70. v := make([]interface{}, int(a.length))
  71. for i := 0; i < int(a.length) && i < len(x); i++ {
  72. v[i] = CHAR(x[i])
  73. }
  74. a.val = v
  75. default:
  76. halt.As(100, reflect.TypeOf(x))
  77. }
  78. }
  79. func (a *dynarr) Set(v scope.Value) {
  80. switch x := v.(type) {
  81. case *arr:
  82. a.val = x.val
  83. case STRING:
  84. v := make([]interface{}, len(x))
  85. for i := 0; i < len(x); i++ {
  86. v[i] = CHAR(x[i])
  87. }
  88. a.val = v
  89. case SHORTSTRING:
  90. v := make([]interface{}, len(x))
  91. for i := 0; i < len(x); i++ {
  92. v[i] = SHORTCHAR(x[i])
  93. }
  94. a.val = v
  95. default:
  96. halt.As(100, reflect.TypeOf(x))
  97. }
  98. }
  99. func (a *arr) String() (ret string) {
  100. ret = fmt.Sprint("array", "[", a.length, "]")
  101. for i := 0; i < len(a.val) && a.val[i] != nil; i++ {
  102. switch x := a.val[i].(type) {
  103. case CHAR:
  104. ret = fmt.Sprint(ret, string([]rune{rune(x)}))
  105. case SHORTCHAR:
  106. ret = fmt.Sprint(ret, string([]rune{rune(x)}))
  107. default:
  108. halt.As(100, reflect.TypeOf(x))
  109. }
  110. }
  111. return ret
  112. }
  113. func (a *dynarr) String() (ret string) {
  114. ret = fmt.Sprint("dyn array")
  115. for i := 0; i < len(a.val) && a.val[i] != nil; i++ {
  116. switch x := a.val[i].(type) {
  117. case CHAR:
  118. ret = fmt.Sprint(ret, string([]rune{rune(x)}))
  119. case SHORTCHAR:
  120. ret = fmt.Sprint(ret, string([]rune{rune(x)}))
  121. default:
  122. halt.As(100, reflect.TypeOf(x))
  123. }
  124. }
  125. return ret
  126. }
  127. func (d *data) Set(v scope.Value) {
  128. fmt.Println("set data")
  129. switch x := v.(type) {
  130. case *data:
  131. assert.For(d.link.Type() == x.link.Type(), 20)
  132. d.val = x.val
  133. case *proc:
  134. assert.For(d.link.Type() == object.COMPLEX, 20)
  135. t, ok := d.link.Complex().(object.BasicType)
  136. assert.For(ok, 21, reflect.TypeOf(d.link.Complex()))
  137. assert.For(t.Type() == object.PROCEDURE, 22)
  138. d.val = x
  139. case INTEGER:
  140. switch d.link.Type() {
  141. case object.INTEGER:
  142. d.val = x
  143. case object.LONGINT:
  144. d.val = LONGINT(x)
  145. default:
  146. halt.As(20, d.link.Type())
  147. }
  148. case BOOLEAN:
  149. assert.For(d.link.Type() == object.BOOLEAN, 20)
  150. d.val = x
  151. case SHORTCHAR:
  152. assert.For(d.link.Type() == object.SHORTCHAR, 20)
  153. d.val = x
  154. case CHAR:
  155. assert.For(d.link.Type() == object.CHAR, 20)
  156. d.val = x
  157. case SHORTINT:
  158. assert.For(d.link.Type() == object.SHORTINT, 20)
  159. d.val = x
  160. case LONGINT:
  161. assert.For(d.link.Type() == object.LONGINT, 20)
  162. d.val = x
  163. case BYTE:
  164. assert.For(d.link.Type() == object.BYTE, 20)
  165. d.val = x
  166. case SET:
  167. assert.For(d.link.Type() == object.SET, 20)
  168. d.val = x
  169. case REAL:
  170. assert.For(d.link.Type() == object.REAL, 20)
  171. d.val = x
  172. case SHORTREAL:
  173. assert.For(d.link.Type() == object.SHORTREAL, 20)
  174. d.val = x
  175. default:
  176. panic(fmt.Sprintln(reflect.TypeOf(x)))
  177. }
  178. }
  179. func (d *data) String() string {
  180. return fmt.Sprint(d.link.Name(), "=", d.val)
  181. }
  182. type INTEGER int32
  183. type BOOLEAN bool
  184. type BYTE int8
  185. type SHORTINT int16
  186. type LONGINT int64
  187. type SET struct {
  188. bits *big.Int
  189. }
  190. type CHAR rune
  191. type REAL float64
  192. type SHORTREAL float32
  193. type SHORTCHAR rune
  194. type STRING string
  195. type SHORTSTRING string
  196. func (x SHORTSTRING) String() string { return string(x) }
  197. func (x STRING) String() string { return string(x) }
  198. func (x SHORTCHAR) String() string { return fmt.Sprint(rune(x)) }
  199. func (x SHORTREAL) String() string { return fmt.Sprint(float32(x)) }
  200. func (x REAL) String() string { return fmt.Sprint(float64(x)) }
  201. func (x CHAR) String() string { return fmt.Sprint(rune(x)) }
  202. func (x SET) String() string { return fmt.Sprint(x.bits) }
  203. func (x LONGINT) String() string { return fmt.Sprint(int64(x)) }
  204. func (x SHORTINT) String() string { return fmt.Sprint(int16(x)) }
  205. func (x BYTE) String() string { return fmt.Sprint(int8(x)) }
  206. func (x INTEGER) String() string { return fmt.Sprint(int32(x)) }
  207. func (x BOOLEAN) String() string { return fmt.Sprint(bool(x)) }
  208. func NewData(o object.Object) (ret scope.Variable) {
  209. switch o.Type() {
  210. case object.INTEGER:
  211. ret = &data{link: o, val: INTEGER(0)}
  212. case object.BOOLEAN:
  213. ret = &data{link: o, val: BOOLEAN(false)}
  214. case object.BYTE:
  215. ret = &data{link: o, val: BYTE(0)}
  216. case object.CHAR:
  217. ret = &data{link: o, val: CHAR(0)}
  218. case object.LONGINT:
  219. ret = &data{link: o, val: LONGINT(0)}
  220. case object.SHORTINT:
  221. ret = &data{link: o, val: SHORTINT(0)}
  222. case object.SET:
  223. ret = &data{link: o, val: SET{bits: big.NewInt(0)}}
  224. case object.REAL:
  225. ret = &data{link: o, val: REAL(0)}
  226. case object.SHORTREAL:
  227. ret = &data{link: o, val: SHORTREAL(0)}
  228. case object.SHORTCHAR:
  229. ret = &data{link: o, val: SHORTCHAR(0)}
  230. case object.COMPLEX:
  231. switch t := o.Complex().(type) {
  232. case object.BasicType:
  233. switch t.Type() {
  234. case object.PROCEDURE:
  235. ret = &data{link: o, val: nil}
  236. default:
  237. halt.As(100, t.Type())
  238. }
  239. case object.ArrayType:
  240. ret = &arr{link: o, length: t.Len()}
  241. case object.DynArrayType:
  242. ret = &dynarr{link: o}
  243. default:
  244. halt.As(100, reflect.TypeOf(t))
  245. }
  246. default:
  247. panic(fmt.Sprintln("unsupported type", o.Type()))
  248. }
  249. return ret
  250. }
  251. func fromg(x interface{}) scope.Value {
  252. switch x := x.(type) {
  253. case int32:
  254. return INTEGER(x)
  255. case bool:
  256. return BOOLEAN(x)
  257. default:
  258. halt.As(100, reflect.TypeOf(x))
  259. }
  260. panic(100)
  261. }
  262. func NewProc(o object.Object) scope.Value {
  263. p, ok := o.(object.ProcedureObject)
  264. assert.For(ok, 20, reflect.TypeOf(o))
  265. return &proc{link: p}
  266. }
  267. func NewConst(n node.Node) scope.Value {
  268. switch x := n.(type) {
  269. case node.ConstantNode:
  270. switch x.Type() {
  271. case object.INTEGER:
  272. return INTEGER(x.Data().(int32))
  273. case object.REAL:
  274. return REAL(x.Data().(float64))
  275. case object.BOOLEAN:
  276. return BOOLEAN(x.Data().(bool))
  277. case object.SHORTCHAR:
  278. return SHORTCHAR(x.Data().(rune))
  279. case object.LONGINT:
  280. return LONGINT(x.Data().(int64))
  281. case object.SHORTINT:
  282. return SHORTINT(x.Data().(int16))
  283. case object.SHORTREAL:
  284. return SHORTREAL(x.Data().(float32))
  285. case object.BYTE:
  286. return BYTE(x.Data().(int8))
  287. case object.SET:
  288. return SET{bits: x.Data().(*big.Int)}
  289. case object.CHAR:
  290. return CHAR(x.Data().(rune))
  291. case object.STRING:
  292. return STRING(x.Data().(string))
  293. case object.SHORTSTRING:
  294. return SHORTSTRING(x.Data().(string))
  295. default:
  296. panic(fmt.Sprintln(x.Type()))
  297. }
  298. }
  299. panic(0)
  300. }
  301. func vfrom(v scope.Value) scope.Value {
  302. switch n := v.(type) {
  303. case *data:
  304. switch n.link.Type() {
  305. case object.INTEGER:
  306. return n.val.(INTEGER)
  307. case object.BYTE:
  308. return n.val.(BYTE)
  309. default:
  310. halt.As(100, n.link.Type())
  311. }
  312. case INTEGER:
  313. return n
  314. default:
  315. halt.As(100, reflect.TypeOf(n))
  316. }
  317. return nil
  318. }
  319. func gfrom(v scope.Value) interface{} {
  320. switch n := v.(type) {
  321. case *data:
  322. if n.val == nil {
  323. return nil
  324. } else {
  325. return gfrom(n.val.(scope.Value))
  326. }
  327. case *proc:
  328. return n.link
  329. case INTEGER:
  330. return int32(n)
  331. case BOOLEAN:
  332. return bool(n)
  333. default:
  334. halt.As(100, reflect.TypeOf(n))
  335. }
  336. return nil
  337. }
  338. type ops struct{}
  339. func (o *ops) Sum(a, b scope.Value) scope.Value {
  340. switch a.(type) {
  341. case *data:
  342. return o.Sum(vfrom(a), b)
  343. default:
  344. switch b.(type) {
  345. case *data:
  346. return o.Sum(a, vfrom(b))
  347. default:
  348. switch x := a.(type) {
  349. case INTEGER:
  350. switch y := b.(type) {
  351. case INTEGER:
  352. return INTEGER(int32(x) + int32(y))
  353. default:
  354. panic(fmt.Sprintln(reflect.TypeOf(y)))
  355. }
  356. default:
  357. panic(fmt.Sprintln(reflect.TypeOf(x)))
  358. }
  359. }
  360. }
  361. panic(0)
  362. }
  363. func (o *ops) Sub(a, b scope.Value) scope.Value {
  364. switch a.(type) {
  365. case *data:
  366. return o.Sub(vfrom(a), b)
  367. default:
  368. switch b.(type) {
  369. case *data:
  370. return o.Sub(a, vfrom(b))
  371. default:
  372. switch x := a.(type) {
  373. case INTEGER:
  374. switch y := b.(type) {
  375. case INTEGER:
  376. return INTEGER(int32(x) - int32(y))
  377. default:
  378. panic(fmt.Sprintln(reflect.TypeOf(y)))
  379. }
  380. default:
  381. panic(fmt.Sprintln(reflect.TypeOf(x)))
  382. }
  383. }
  384. }
  385. panic(0)
  386. }
  387. func (o *ops) Len(a object.Object, _a, _b scope.Value) (ret scope.Value) {
  388. //assert.For(a != nil, 20)
  389. assert.For(_b != nil, 21)
  390. var b int32 = gfrom(_b).(int32)
  391. assert.For(b == 0, 22)
  392. if a != nil {
  393. assert.For(a.Type() == object.COMPLEX, 23)
  394. switch typ := a.Complex().(type) {
  395. case object.ArrayType:
  396. ret = INTEGER(int32(typ.Len()))
  397. case object.DynArrayType:
  398. switch t := _a.(type) {
  399. //case string:
  400. // ret = int64(utf8.RuneCountInString(_a.(string)))
  401. default:
  402. ret = INTEGER(0)
  403. fmt.Sprintln("unsupported", reflect.TypeOf(t))
  404. }
  405. default:
  406. panic(fmt.Sprintln("unsupported", reflect.TypeOf(a.Complex())))
  407. }
  408. } else {
  409. switch a := _a.(type) {
  410. // case string:
  411. // ret = int64(utf8.RuneCountInString(_a.(string)))
  412. // case []interface{}:
  413. // ret = int64(len(_a.([]interface{})))
  414. case *arr:
  415. ret = INTEGER(int32(a.length))
  416. case *dynarr:
  417. ret = INTEGER(int32(len(a.val)))
  418. default:
  419. panic(fmt.Sprintln("unsupported", reflect.TypeOf(a)))
  420. }
  421. }
  422. return ret
  423. }
  424. func (o *ops) Conv(a scope.Value, typ object.Type) scope.Value {
  425. switch typ {
  426. case object.INTEGER:
  427. switch x := a.(type) {
  428. case *data:
  429. return o.Conv(vfrom(x), typ)
  430. case BYTE:
  431. return INTEGER(x)
  432. default:
  433. halt.As(100, reflect.TypeOf(x))
  434. }
  435. default:
  436. halt.As(100, typ)
  437. }
  438. panic(100)
  439. }
  440. func (o *ops) Eq(a, b scope.Value) scope.Value {
  441. switch a.(type) {
  442. case *data:
  443. return o.Eq(vfrom(a), b)
  444. default:
  445. switch b.(type) {
  446. case *data:
  447. return o.Eq(a, vfrom(b))
  448. default:
  449. switch x := a.(type) {
  450. case INTEGER:
  451. switch y := b.(type) {
  452. case INTEGER:
  453. return BOOLEAN(x == y)
  454. default:
  455. panic(fmt.Sprintln(reflect.TypeOf(y)))
  456. }
  457. default:
  458. panic(fmt.Sprintln(reflect.TypeOf(x)))
  459. }
  460. }
  461. }
  462. panic(0)
  463. }
  464. func (o *ops) Lss(a, b scope.Value) scope.Value {
  465. switch a.(type) {
  466. case *data:
  467. return o.Lss(vfrom(a), b)
  468. default:
  469. switch b.(type) {
  470. case *data:
  471. return o.Lss(a, vfrom(b))
  472. default:
  473. switch x := a.(type) {
  474. case INTEGER:
  475. switch y := b.(type) {
  476. case INTEGER:
  477. return BOOLEAN(x < y)
  478. default:
  479. panic(fmt.Sprintln(reflect.TypeOf(y)))
  480. }
  481. default:
  482. panic(fmt.Sprintln(reflect.TypeOf(x)))
  483. }
  484. }
  485. }
  486. panic(0)
  487. }
  488. func (o *ops) Leq(a, b scope.Value) scope.Value {
  489. switch a.(type) {
  490. case *data:
  491. return o.Leq(vfrom(a), b)
  492. default:
  493. switch b.(type) {
  494. case *data:
  495. return o.Leq(a, vfrom(b))
  496. default:
  497. switch x := a.(type) {
  498. case INTEGER:
  499. switch y := b.(type) {
  500. case INTEGER:
  501. return BOOLEAN(x <= y)
  502. default:
  503. panic(fmt.Sprintln(reflect.TypeOf(y)))
  504. }
  505. default:
  506. panic(fmt.Sprintln(reflect.TypeOf(x)))
  507. }
  508. }
  509. }
  510. panic(0)
  511. }
  512. func init() {
  513. scope.ValueFrom = vfrom
  514. scope.GoTypeFrom = gfrom
  515. scope.TypeFromGo = fromg
  516. scope.Ops = &ops{}
  517. }