val.go 28 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399
  1. package modern
  2. import (
  3. "fmt"
  4. "fw/cp"
  5. "fw/cp/node"
  6. "fw/cp/object"
  7. "fw/rt2/scope"
  8. "fw/utils"
  9. "math"
  10. "math/big"
  11. "reflect"
  12. "strings"
  13. "ypk/assert"
  14. "ypk/halt"
  15. )
  16. type data struct {
  17. link object.Object
  18. val interface{}
  19. }
  20. type arr struct {
  21. link object.Object
  22. val []interface{}
  23. length int64
  24. }
  25. type dynarr struct {
  26. link object.Object
  27. val []interface{}
  28. }
  29. type proc struct {
  30. link object.Object
  31. }
  32. type rec struct {
  33. link object.Object
  34. scope.Record
  35. l *level
  36. }
  37. type ptr struct {
  38. link object.Object
  39. scope.Pointer
  40. val *ptrValue
  41. }
  42. type idx struct {
  43. arr *arr
  44. idx int
  45. }
  46. func (r *rec) String() string {
  47. return r.link.Name()
  48. }
  49. func (r *rec) Id() cp.ID {
  50. return r.link.Adr()
  51. }
  52. func (r *rec) Set(v scope.Value) {
  53. panic(0)
  54. }
  55. func (r *rec) Get(id cp.ID) scope.Value {
  56. k := r.l.k[id]
  57. if r.l.v[k] == nil { //ref
  58. return r.l.r[k]
  59. } else {
  60. return r.l.v[k]
  61. }
  62. }
  63. func newRec(o object.Object) *rec {
  64. _, ok := o.Complex().(object.RecordType)
  65. assert.For(ok, 20)
  66. return &rec{link: o}
  67. }
  68. func (p *proc) String() string {
  69. return fmt.Sprint(p.link.Adr(), p.link.Name())
  70. }
  71. func (x *data) Id() cp.ID { return x.link.Adr() }
  72. func (x *arr) Id() cp.ID { return x.link.Adr() }
  73. func (x *dynarr) Id() cp.ID { return x.link.Adr() }
  74. func (a *arr) Set(v scope.Value) {
  75. switch x := v.(type) {
  76. case *arr:
  77. a.Set(STRING(x.tryString()))
  78. case STRING:
  79. v := make([]interface{}, int(a.length))
  80. for i := 0; i < int(a.length) && i < len(x); i++ {
  81. v[i] = CHAR(x[i])
  82. }
  83. a.val = v
  84. case SHORTSTRING:
  85. v := make([]interface{}, int(a.length))
  86. for i := 0; i < int(a.length) && i < len(x); i++ {
  87. v[i] = SHORTCHAR(x[i])
  88. }
  89. a.val = v
  90. default:
  91. halt.As(100, reflect.TypeOf(x))
  92. }
  93. }
  94. func (a *dynarr) Set(v scope.Value) {
  95. switch x := v.(type) {
  96. case *arr:
  97. a.val = x.val
  98. case *dynarr:
  99. a.val = x.val
  100. case STRING:
  101. v := make([]interface{}, len(x))
  102. for i := 0; i < len(x); i++ {
  103. v[i] = CHAR(x[i])
  104. }
  105. a.val = v
  106. case SHORTSTRING:
  107. v := make([]interface{}, len(x))
  108. for i := 0; i < len(x); i++ {
  109. v[i] = SHORTCHAR(x[i])
  110. }
  111. a.val = v
  112. case INTEGER:
  113. a.val = make([]interface{}, int(x))
  114. default:
  115. halt.As(100, reflect.TypeOf(x))
  116. }
  117. }
  118. func (a *arr) tryString() (ret string) {
  119. for i := 0; i < len(a.val) && a.val[i] != nil; i++ {
  120. switch x := a.val[i].(type) {
  121. case CHAR:
  122. if int(x) == 0 {
  123. break
  124. }
  125. ret = fmt.Sprint(ret, string([]rune{rune(x)}))
  126. case SHORTCHAR:
  127. if int(x) == 0 {
  128. break
  129. }
  130. ret = fmt.Sprint(ret, string([]rune{rune(x)}))
  131. default:
  132. halt.As(100, reflect.TypeOf(x))
  133. }
  134. }
  135. return ret
  136. }
  137. func (a *arr) String() (ret string) {
  138. ret = fmt.Sprint("array", "[", a.length, "]")
  139. for i := 0; i < len(a.val) && a.val[i] != nil; i++ {
  140. switch x := a.val[i].(type) {
  141. case CHAR:
  142. ret = fmt.Sprint(ret, string([]rune{rune(x)}))
  143. case SHORTCHAR:
  144. ret = fmt.Sprint(ret, string([]rune{rune(x)}))
  145. default:
  146. halt.As(100, reflect.TypeOf(x))
  147. }
  148. }
  149. return ret
  150. }
  151. func (a *arr) Get(id scope.Value) scope.Value {
  152. switch i := id.(type) {
  153. case *data:
  154. return a.Get(i.val.(scope.Value))
  155. case INTEGER:
  156. assert.For(int64(i) < a.length, 20)
  157. if len(a.val) == 0 {
  158. a.val = make([]interface{}, int(a.length))
  159. }
  160. return &idx{arr: a, idx: int(i)}
  161. default:
  162. halt.As(100, reflect.TypeOf(i))
  163. }
  164. panic(0)
  165. }
  166. func (i *idx) Id() cp.ID {
  167. return i.arr.Id()
  168. }
  169. func (i *idx) String() string {
  170. return fmt.Sprint("@", i.Id(), "[", i.idx, "]")
  171. }
  172. func (i *idx) Set(v scope.Value) {
  173. //fmt.Println(i, len(i.arr.val))
  174. switch x := v.(type) {
  175. case *idx:
  176. i.arr.val[i.idx] = x.arr.val[x.idx]
  177. case *data:
  178. i.Set(x.val.(scope.Value))
  179. case CHAR:
  180. i.arr.val[i.idx] = x
  181. default:
  182. halt.As(100, reflect.TypeOf(x))
  183. }
  184. }
  185. func (a *dynarr) tryString() (ret string) {
  186. for i := 0; i < len(a.val) && a.val[i] != nil; i++ {
  187. switch x := a.val[i].(type) {
  188. case CHAR:
  189. if int(x) == 0 {
  190. break
  191. }
  192. ret = fmt.Sprint(ret, string([]rune{rune(x)}))
  193. case SHORTCHAR:
  194. if int(x) == 0 {
  195. break
  196. }
  197. ret = fmt.Sprint(ret, string([]rune{rune(x)}))
  198. default:
  199. halt.As(100, reflect.TypeOf(x))
  200. }
  201. }
  202. return ret
  203. }
  204. func (a *dynarr) String() (ret string) {
  205. ret = fmt.Sprint("dyn array")
  206. for i := 0; i < len(a.val) && a.val[i] != nil; i++ {
  207. switch x := a.val[i].(type) {
  208. case CHAR:
  209. ret = fmt.Sprint(ret, string([]rune{rune(x)}))
  210. case SHORTCHAR:
  211. ret = fmt.Sprint(ret, string([]rune{rune(x)}))
  212. default:
  213. halt.As(100, reflect.TypeOf(x))
  214. }
  215. }
  216. return ret
  217. }
  218. func (d *data) Set(v scope.Value) {
  219. utils.PrintScope("set data")
  220. switch x := v.(type) {
  221. case *data:
  222. if d.link.Type() == x.link.Type() {
  223. d.val = x.val
  224. } else {
  225. d.Set(x.val.(scope.Value))
  226. }
  227. case *proc:
  228. assert.For(d.link.Type() == object.COMPLEX, 20)
  229. t, ok := d.link.Complex().(object.BasicType)
  230. assert.For(ok, 21, reflect.TypeOf(d.link.Complex()))
  231. assert.For(t.Type() == object.PROCEDURE, 22)
  232. d.val = x
  233. case *idx:
  234. d.val = x.arr.val[x.idx]
  235. case INTEGER:
  236. switch d.link.Type() {
  237. case object.INTEGER:
  238. d.val = x
  239. case object.LONGINT:
  240. d.val = LONGINT(x)
  241. case object.REAL:
  242. d.val = REAL(x)
  243. default:
  244. halt.As(20, d.link.Type())
  245. }
  246. case BOOLEAN:
  247. assert.For(d.link.Type() == object.BOOLEAN, 20)
  248. d.val = x
  249. case SHORTCHAR:
  250. assert.For(d.link.Type() == object.SHORTCHAR, 20)
  251. d.val = x
  252. case CHAR:
  253. assert.For(d.link.Type() == object.CHAR, 20)
  254. d.val = x
  255. case SHORTINT:
  256. assert.For(d.link.Type() == object.SHORTINT, 20)
  257. d.val = x
  258. case LONGINT:
  259. assert.For(d.link.Type() == object.LONGINT, 20)
  260. d.val = x
  261. case BYTE:
  262. assert.For(d.link.Type() == object.BYTE, 20)
  263. d.val = x
  264. case SET:
  265. assert.For(d.link.Type() == object.SET, 20)
  266. d.val = x
  267. case REAL:
  268. assert.For(d.link.Type() == object.REAL, 20)
  269. d.val = x
  270. case SHORTREAL:
  271. assert.For(d.link.Type() == object.SHORTREAL, 20)
  272. d.val = x
  273. default:
  274. panic(fmt.Sprintln(reflect.TypeOf(x)))
  275. }
  276. }
  277. func (d *data) String() string {
  278. return fmt.Sprint(d.link.Name(), "=", d.val)
  279. }
  280. func (p *ptr) String() string {
  281. return fmt.Sprint("pointer ", p.link.Complex().(object.PointerType).Name(), "&", p.val)
  282. }
  283. func (p *ptr) Id() cp.ID { return p.link.Adr() }
  284. func (p *ptr) Set(v scope.Value) {
  285. switch x := v.(type) {
  286. case *ptr:
  287. p.Set(x.val)
  288. case *ptrValue:
  289. p.val = x
  290. case PTR:
  291. assert.For(x == NIL, 40)
  292. p.val = nil
  293. default:
  294. halt.As(100, reflect.TypeOf(x))
  295. }
  296. }
  297. func (p *ptr) Get() scope.Value {
  298. if p.val == nil {
  299. return NIL
  300. } else {
  301. return p.val.scope.Select(p.val.id)
  302. }
  303. }
  304. func newPtr(o object.Object) scope.Variable {
  305. _, ok := o.Complex().(object.PointerType)
  306. assert.For(ok, 20)
  307. return &ptr{link: o}
  308. }
  309. type ptrValue struct {
  310. scope *area
  311. id cp.ID
  312. link object.Object
  313. }
  314. func (p *ptrValue) String() string {
  315. return fmt.Sprint(p.id)
  316. }
  317. type PTR int
  318. func (p PTR) String() string {
  319. return "NIL"
  320. }
  321. const NIL PTR = 0
  322. type INTEGER int32
  323. type BOOLEAN bool
  324. type BYTE int8
  325. type SHORTINT int16
  326. type LONGINT int64
  327. type SET struct {
  328. bits *big.Int
  329. }
  330. type CHAR rune
  331. type REAL float64
  332. type SHORTREAL float32
  333. type SHORTCHAR rune
  334. type STRING string
  335. type SHORTSTRING string
  336. func (x SHORTSTRING) String() string { return string(x) }
  337. func (x STRING) String() string { return string(x) }
  338. func (x SHORTCHAR) String() string { return fmt.Sprint(rune(x)) }
  339. func (x SHORTREAL) String() string { return fmt.Sprint(float32(x)) }
  340. func (x REAL) String() string { return fmt.Sprint(float64(x)) }
  341. func (x CHAR) String() string { return fmt.Sprint(rune(x)) }
  342. func (x SET) String() string { return fmt.Sprint(x.bits) }
  343. func (x LONGINT) String() string { return fmt.Sprint(int64(x)) }
  344. func (x SHORTINT) String() string { return fmt.Sprint(int16(x)) }
  345. func (x BYTE) String() string { return fmt.Sprint(int8(x)) }
  346. func (x INTEGER) String() string { return fmt.Sprint(int32(x)) }
  347. func (x BOOLEAN) String() string { return fmt.Sprint(bool(x)) }
  348. func newData(o object.Object) (ret scope.Variable) {
  349. switch o.Type() {
  350. case object.INTEGER:
  351. ret = &data{link: o, val: INTEGER(0)}
  352. case object.BOOLEAN:
  353. ret = &data{link: o, val: BOOLEAN(false)}
  354. case object.BYTE:
  355. ret = &data{link: o, val: BYTE(0)}
  356. case object.CHAR:
  357. ret = &data{link: o, val: CHAR(0)}
  358. case object.LONGINT:
  359. ret = &data{link: o, val: LONGINT(0)}
  360. case object.SHORTINT:
  361. ret = &data{link: o, val: SHORTINT(0)}
  362. case object.SET:
  363. ret = &data{link: o, val: SET{bits: big.NewInt(0)}}
  364. case object.REAL:
  365. ret = &data{link: o, val: REAL(0)}
  366. case object.SHORTREAL:
  367. ret = &data{link: o, val: SHORTREAL(0)}
  368. case object.SHORTCHAR:
  369. ret = &data{link: o, val: SHORTCHAR(0)}
  370. case object.COMPLEX:
  371. switch t := o.Complex().(type) {
  372. case object.BasicType:
  373. switch t.Type() {
  374. case object.PROCEDURE:
  375. ret = &data{link: o, val: nil}
  376. default:
  377. halt.As(100, t.Type())
  378. }
  379. case object.ArrayType:
  380. ret = &arr{link: o, length: t.Len()}
  381. case object.DynArrayType:
  382. ret = &dynarr{link: o}
  383. default:
  384. halt.As(100, reflect.TypeOf(t))
  385. }
  386. default:
  387. panic(fmt.Sprintln("unsupported type", o.Type()))
  388. }
  389. return ret
  390. }
  391. func fromg(x interface{}) scope.Value {
  392. switch x := x.(type) {
  393. case int32:
  394. return INTEGER(x)
  395. case bool:
  396. return BOOLEAN(x)
  397. case *big.Int:
  398. return SET{bits: x}
  399. default:
  400. halt.As(100, reflect.TypeOf(x))
  401. }
  402. panic(100)
  403. }
  404. func newProc(o object.Object) scope.Value {
  405. p, ok := o.(object.ProcedureObject)
  406. assert.For(ok, 20, reflect.TypeOf(o))
  407. return &proc{link: p}
  408. }
  409. func newConst(n node.Node) scope.Value {
  410. switch x := n.(type) {
  411. case node.ConstantNode:
  412. switch x.Type() {
  413. case object.INTEGER:
  414. return INTEGER(x.Data().(int32))
  415. case object.REAL:
  416. return REAL(x.Data().(float64))
  417. case object.BOOLEAN:
  418. return BOOLEAN(x.Data().(bool))
  419. case object.SHORTCHAR:
  420. return SHORTCHAR(x.Data().(rune))
  421. case object.LONGINT:
  422. return LONGINT(x.Data().(int64))
  423. case object.SHORTINT:
  424. return SHORTINT(x.Data().(int16))
  425. case object.SHORTREAL:
  426. return SHORTREAL(x.Data().(float32))
  427. case object.BYTE:
  428. return BYTE(x.Data().(int8))
  429. case object.SET:
  430. return SET{bits: x.Data().(*big.Int)}
  431. case object.CHAR:
  432. return CHAR(x.Data().(rune))
  433. case object.STRING:
  434. return STRING(x.Data().(string))
  435. case object.SHORTSTRING:
  436. return SHORTSTRING(x.Data().(string))
  437. case object.NIL:
  438. return NIL
  439. case object.COMPLEX: //не может существовать в реальности, используется для передачи параметров от рантайма
  440. switch d := x.Data().(type) {
  441. case *ptrValue:
  442. return d
  443. default:
  444. halt.As(100, reflect.TypeOf(d))
  445. }
  446. default:
  447. panic(fmt.Sprintln(x.Type()))
  448. }
  449. }
  450. panic(0)
  451. }
  452. func vfrom(v scope.Value) scope.Value {
  453. switch n := v.(type) {
  454. case *data:
  455. switch n.link.Type() {
  456. case object.INTEGER:
  457. return n.val.(INTEGER)
  458. case object.BYTE:
  459. return n.val.(BYTE)
  460. case object.CHAR:
  461. return n.val.(CHAR)
  462. case object.SET:
  463. return n.val.(SET)
  464. case object.BOOLEAN:
  465. return n.val.(BOOLEAN)
  466. case object.REAL:
  467. return n.val.(REAL)
  468. case object.LONGINT:
  469. return n.val.(LONGINT)
  470. default:
  471. halt.As(100, n.link.Type())
  472. }
  473. case INTEGER:
  474. return n
  475. default:
  476. halt.As(100, reflect.TypeOf(n))
  477. }
  478. return nil
  479. }
  480. func gfrom(v scope.Value) interface{} {
  481. switch n := v.(type) {
  482. case *data:
  483. if n.val == nil {
  484. return nil
  485. } else {
  486. return gfrom(n.val.(scope.Value))
  487. }
  488. case *rec:
  489. return n
  490. case *proc:
  491. return n.link
  492. case *dynarr:
  493. switch n.link.Complex().(object.DynArrayType).Base() {
  494. case object.SHORTCHAR:
  495. if n.val != nil {
  496. return n.tryString()
  497. } else {
  498. return ""
  499. }
  500. case object.CHAR:
  501. if n.val != nil {
  502. return n.tryString()
  503. } else {
  504. return ""
  505. }
  506. default:
  507. halt.As(100, n.link.Complex().(object.DynArrayType).Base())
  508. }
  509. panic(0)
  510. case *arr:
  511. switch n.link.Complex().(object.ArrayType).Base() {
  512. case object.SHORTCHAR:
  513. if n.val != nil {
  514. return n.tryString()
  515. } else {
  516. return ""
  517. }
  518. default:
  519. halt.As(100, n.link.Complex().(object.ArrayType).Base())
  520. }
  521. panic(0)
  522. case PTR:
  523. assert.For(n == NIL, 40)
  524. return nil
  525. case INTEGER:
  526. return int32(n)
  527. case BOOLEAN:
  528. return bool(n)
  529. default:
  530. halt.As(100, reflect.TypeOf(n))
  531. }
  532. return nil
  533. }
  534. type ops struct{}
  535. func (o *ops) Sum(a, b scope.Value) scope.Value {
  536. switch a.(type) {
  537. case *data:
  538. return o.Sum(vfrom(a), b)
  539. default:
  540. switch b.(type) {
  541. case *data:
  542. return o.Sum(a, vfrom(b))
  543. default:
  544. switch x := a.(type) {
  545. case INTEGER:
  546. switch y := b.(type) {
  547. case INTEGER:
  548. return INTEGER(int32(x) + int32(y))
  549. default:
  550. panic(fmt.Sprintln(reflect.TypeOf(y)))
  551. }
  552. case SET:
  553. switch y := b.(type) {
  554. case SET:
  555. return SET{bits: x.bits.Add(x.bits, y.bits)}
  556. case INTEGER: // INCL(SET, INTEGER)
  557. return SET{bits: x.bits.SetBit(x.bits, int(y), 1)}
  558. default:
  559. panic(fmt.Sprintln(reflect.TypeOf(y)))
  560. }
  561. case *arr:
  562. switch y := b.(type) {
  563. case *arr:
  564. switch {
  565. case x.link.Type() == y.link.Type() && x.link.Complex().(object.ArrayType).Base() == object.CHAR:
  566. return STRING(x.tryString() + y.tryString())
  567. default:
  568. halt.As(100, x.link.Type(), y.link.Type())
  569. }
  570. case STRING:
  571. switch {
  572. case x.link.Complex().(object.ArrayType).Base() == object.CHAR:
  573. return STRING(x.tryString() + string(y))
  574. default:
  575. halt.As(100, x.link.Type())
  576. }
  577. default:
  578. panic(fmt.Sprintln(reflect.TypeOf(y)))
  579. }
  580. case *dynarr:
  581. switch y := b.(type) {
  582. case STRING:
  583. switch {
  584. case x.link.Complex().(object.DynArrayType).Base() == object.CHAR:
  585. return STRING(x.tryString() + string(y))
  586. default:
  587. halt.As(100, x.link.Type())
  588. }
  589. default:
  590. panic(fmt.Sprintln(reflect.TypeOf(y)))
  591. }
  592. case STRING:
  593. switch y := b.(type) {
  594. case STRING:
  595. return STRING(string(x) + string(y))
  596. default:
  597. halt.As(100, reflect.TypeOf(y))
  598. }
  599. case REAL:
  600. switch y := b.(type) {
  601. case REAL:
  602. return REAL(x + y)
  603. default:
  604. halt.As(100, reflect.TypeOf(y))
  605. }
  606. case LONGINT:
  607. switch y := b.(type) {
  608. case LONGINT:
  609. return LONGINT(x + y)
  610. default:
  611. halt.As(100, reflect.TypeOf(y))
  612. }
  613. default:
  614. panic(fmt.Sprintln(reflect.TypeOf(x)))
  615. }
  616. }
  617. }
  618. panic(0)
  619. }
  620. func (o *ops) Sub(a, b scope.Value) scope.Value {
  621. switch a.(type) {
  622. case *data:
  623. return o.Sub(vfrom(a), b)
  624. default:
  625. switch b.(type) {
  626. case *data:
  627. return o.Sub(a, vfrom(b))
  628. default:
  629. switch x := a.(type) {
  630. case INTEGER:
  631. switch y := b.(type) {
  632. case INTEGER:
  633. return INTEGER(int32(x) - int32(y))
  634. default:
  635. panic(fmt.Sprintln(reflect.TypeOf(y)))
  636. }
  637. case SET:
  638. switch y := b.(type) {
  639. case SET:
  640. return SET{bits: x.bits.Sub(x.bits, y.bits)}
  641. case INTEGER:
  642. return SET{bits: x.bits.SetBit(x.bits, int(y), 0)}
  643. default:
  644. panic(fmt.Sprintln(reflect.TypeOf(y)))
  645. }
  646. default:
  647. panic(fmt.Sprintln(reflect.TypeOf(x)))
  648. }
  649. }
  650. }
  651. panic(0)
  652. }
  653. func (o *ops) In(a, b scope.Value) scope.Value {
  654. switch a.(type) {
  655. case *data:
  656. return o.In(vfrom(a), b)
  657. default:
  658. switch b.(type) {
  659. case *data:
  660. return o.In(a, vfrom(b))
  661. default:
  662. switch x := a.(type) {
  663. case INTEGER:
  664. switch y := b.(type) {
  665. case SET:
  666. fmt.Println("IN врет")
  667. return BOOLEAN(false)
  668. default:
  669. panic(fmt.Sprintln(reflect.TypeOf(y)))
  670. }
  671. default:
  672. panic(fmt.Sprintln(reflect.TypeOf(x)))
  673. }
  674. }
  675. }
  676. panic(0)
  677. }
  678. func (o *ops) Min(a, b scope.Value) scope.Value {
  679. switch a.(type) {
  680. case *data:
  681. return o.Min(vfrom(a), b)
  682. default:
  683. switch b.(type) {
  684. case *data:
  685. return o.Min(a, vfrom(b))
  686. default:
  687. switch x := a.(type) {
  688. case INTEGER:
  689. switch y := b.(type) {
  690. case INTEGER:
  691. return INTEGER(int32(math.Min(float64(x), float64(y))))
  692. default:
  693. panic(fmt.Sprintln(reflect.TypeOf(y)))
  694. }
  695. default:
  696. panic(fmt.Sprintln(reflect.TypeOf(x)))
  697. }
  698. }
  699. }
  700. panic(0)
  701. }
  702. func (o *ops) Max(a, b scope.Value) scope.Value {
  703. switch a.(type) {
  704. case *data:
  705. return o.Max(vfrom(a), b)
  706. default:
  707. switch b.(type) {
  708. case *data:
  709. return o.Max(a, vfrom(b))
  710. default:
  711. switch x := a.(type) {
  712. case INTEGER:
  713. switch y := b.(type) {
  714. case INTEGER:
  715. return INTEGER(int32(math.Max(float64(x), float64(y))))
  716. default:
  717. panic(fmt.Sprintln(reflect.TypeOf(y)))
  718. }
  719. default:
  720. panic(fmt.Sprintln(reflect.TypeOf(x)))
  721. }
  722. }
  723. }
  724. panic(0)
  725. }
  726. func (o *ops) And(a, b scope.Value) scope.Value {
  727. switch a.(type) {
  728. case *data:
  729. return o.And(vfrom(a), b)
  730. default:
  731. switch b.(type) {
  732. case *data:
  733. return o.And(a, vfrom(b))
  734. default:
  735. switch x := a.(type) {
  736. case BOOLEAN:
  737. switch y := b.(type) {
  738. case BOOLEAN:
  739. return BOOLEAN(x && y)
  740. default:
  741. panic(fmt.Sprintln(reflect.TypeOf(y)))
  742. }
  743. default:
  744. panic(fmt.Sprintln(reflect.TypeOf(x)))
  745. }
  746. }
  747. }
  748. panic(0)
  749. }
  750. func (o *ops) Or(a, b scope.Value) scope.Value {
  751. switch a.(type) {
  752. case *data:
  753. return o.Or(vfrom(a), b)
  754. default:
  755. switch b.(type) {
  756. case *data:
  757. return o.Or(a, vfrom(b))
  758. default:
  759. switch x := a.(type) {
  760. case BOOLEAN:
  761. switch y := b.(type) {
  762. case BOOLEAN:
  763. return BOOLEAN(x || y)
  764. default:
  765. panic(fmt.Sprintln(reflect.TypeOf(y)))
  766. }
  767. default:
  768. panic(fmt.Sprintln(reflect.TypeOf(x)))
  769. }
  770. }
  771. }
  772. panic(0)
  773. }
  774. func (o *ops) Ash(a, b scope.Value) scope.Value {
  775. switch a.(type) {
  776. case *data:
  777. return o.Max(vfrom(a), b)
  778. default:
  779. switch b.(type) {
  780. case *data:
  781. return o.Max(a, vfrom(b))
  782. default:
  783. switch x := a.(type) {
  784. case INTEGER:
  785. switch y := b.(type) {
  786. case INTEGER:
  787. return INTEGER(x << uint(y))
  788. default:
  789. panic(fmt.Sprintln(reflect.TypeOf(y)))
  790. }
  791. default:
  792. panic(fmt.Sprintln(reflect.TypeOf(x)))
  793. }
  794. }
  795. }
  796. panic(0)
  797. }
  798. func (o *ops) Div(a, b scope.Value) scope.Value {
  799. switch a.(type) {
  800. case *data:
  801. return o.Div(vfrom(a), b)
  802. default:
  803. switch b.(type) {
  804. case *data:
  805. return o.Div(a, vfrom(b))
  806. default:
  807. switch x := a.(type) {
  808. case INTEGER:
  809. switch y := b.(type) {
  810. case INTEGER:
  811. return INTEGER(x / y)
  812. default:
  813. panic(fmt.Sprintln(reflect.TypeOf(y)))
  814. }
  815. case LONGINT:
  816. switch y := b.(type) {
  817. case LONGINT:
  818. return LONGINT(x / y)
  819. default:
  820. panic(fmt.Sprintln(reflect.TypeOf(y)))
  821. }
  822. default:
  823. panic(fmt.Sprintln(reflect.TypeOf(x)))
  824. }
  825. }
  826. }
  827. panic(0)
  828. }
  829. func (o *ops) Mod(a, b scope.Value) scope.Value {
  830. switch a.(type) {
  831. case *data:
  832. return o.Mod(vfrom(a), b)
  833. default:
  834. switch b.(type) {
  835. case *data:
  836. return o.Mod(a, vfrom(b))
  837. default:
  838. switch x := a.(type) {
  839. case INTEGER:
  840. switch y := b.(type) {
  841. case INTEGER:
  842. return INTEGER(x % y)
  843. default:
  844. panic(fmt.Sprintln(reflect.TypeOf(y)))
  845. }
  846. case LONGINT:
  847. switch y := b.(type) {
  848. case LONGINT:
  849. return LONGINT(x % y)
  850. default:
  851. panic(fmt.Sprintln(reflect.TypeOf(y)))
  852. }
  853. default:
  854. panic(fmt.Sprintln(reflect.TypeOf(x)))
  855. }
  856. }
  857. }
  858. panic(0)
  859. }
  860. func (o *ops) Mult(a, b scope.Value) scope.Value {
  861. switch a.(type) {
  862. case *data:
  863. return o.Mult(vfrom(a), b)
  864. default:
  865. switch b.(type) {
  866. case *data:
  867. return o.Mult(a, vfrom(b))
  868. default:
  869. switch x := a.(type) {
  870. case INTEGER:
  871. switch y := b.(type) {
  872. case INTEGER:
  873. return INTEGER(x * y)
  874. default:
  875. panic(fmt.Sprintln(reflect.TypeOf(y)))
  876. }
  877. default:
  878. panic(fmt.Sprintln(reflect.TypeOf(x)))
  879. }
  880. }
  881. }
  882. panic(0)
  883. }
  884. func (o *ops) Divide(a, b scope.Value) scope.Value {
  885. switch a.(type) {
  886. case *data:
  887. return o.Divide(vfrom(a), b)
  888. default:
  889. switch b.(type) {
  890. case *data:
  891. return o.Divide(a, vfrom(b))
  892. default:
  893. switch x := a.(type) {
  894. case INTEGER:
  895. switch y := b.(type) {
  896. case INTEGER:
  897. return REAL(float64(x) / float64(y))
  898. default:
  899. panic(fmt.Sprintln(reflect.TypeOf(y)))
  900. }
  901. case REAL:
  902. switch y := b.(type) {
  903. case REAL:
  904. return REAL(float64(x) / float64(y))
  905. default:
  906. panic(fmt.Sprintln(reflect.TypeOf(y)))
  907. }
  908. default:
  909. panic(fmt.Sprintln(reflect.TypeOf(x)))
  910. }
  911. }
  912. }
  913. panic(0)
  914. }
  915. func (o *ops) Len(a object.Object, _a, _b scope.Value) (ret scope.Value) {
  916. //assert.For(a != nil, 20)
  917. assert.For(_b != nil, 21)
  918. var b int32 = gfrom(_b).(int32)
  919. assert.For(b == 0, 22)
  920. if a != nil {
  921. assert.For(a.Type() == object.COMPLEX, 23)
  922. switch typ := a.Complex().(type) {
  923. case object.ArrayType:
  924. ret = INTEGER(int32(typ.Len()))
  925. case object.DynArrayType:
  926. switch t := _a.(type) {
  927. case *arr:
  928. ret = INTEGER(t.length)
  929. case *dynarr:
  930. ret = INTEGER(len(t.val))
  931. default:
  932. halt.As(100, "unsupported", reflect.TypeOf(t))
  933. }
  934. default:
  935. panic(fmt.Sprintln("unsupported", reflect.TypeOf(a.Complex())))
  936. }
  937. } else {
  938. switch a := _a.(type) {
  939. // case string:
  940. // ret = int64(utf8.RuneCountInString(_a.(string)))
  941. // case []interface{}:
  942. // ret = int64(len(_a.([]interface{})))
  943. case *arr:
  944. ret = INTEGER(int32(a.length))
  945. case *dynarr:
  946. ret = INTEGER(int32(len(a.val)))
  947. default:
  948. panic(fmt.Sprintln("unsupported", reflect.TypeOf(a)))
  949. }
  950. }
  951. return ret
  952. }
  953. func (o *ops) Is(a scope.Value, typ object.ComplexType) scope.Value {
  954. var compare func(x, a object.ComplexType) bool
  955. compare = func(_x, _a object.ComplexType) bool {
  956. switch x := _x.(type) {
  957. case object.RecordType:
  958. switch a := _a.(type) {
  959. case object.RecordType:
  960. switch {
  961. case x.Name() == a.Name():
  962. // fmt.Println("eq")
  963. return true //опасно сравнивать имена конеш
  964. case x.BaseType() != nil:
  965. // fmt.Println("go base")
  966. return compare(x.BaseType(), a)
  967. default:
  968. return false
  969. }
  970. default:
  971. halt.As(100, reflect.TypeOf(a))
  972. }
  973. case object.PointerType:
  974. switch a := _a.(type) {
  975. case object.PointerType:
  976. switch {
  977. case x.Name() == a.Name():
  978. // fmt.Println("eq")
  979. return true //опасно сравнивать имена конеш
  980. case x.Base() != nil:
  981. // fmt.Println("go base")
  982. return compare(x.Base(), a)
  983. default:
  984. return false
  985. }
  986. default:
  987. halt.As(100, reflect.TypeOf(a))
  988. }
  989. default:
  990. halt.As(100, reflect.TypeOf(a))
  991. }
  992. panic(0)
  993. }
  994. switch x := a.(type) {
  995. case *rec:
  996. z, a := x.link.Complex().(object.RecordType)
  997. y, b := typ.(object.RecordType)
  998. //fmt.Println("compare", x.link.Complex(), typ, a, b, a && b && compare(z, y))
  999. return BOOLEAN(a && b && compare(z, y))
  1000. case *ptr:
  1001. z, a := x.link.Complex().(object.PointerType)
  1002. y, b := typ.(object.PointerType)
  1003. //fmt.Println("compare", x.link.Complex(), typ, a, b, a && b && compare(z, y))
  1004. return BOOLEAN(a && b && compare(z, y))
  1005. default:
  1006. halt.As(100, reflect.TypeOf(x))
  1007. }
  1008. panic(0)
  1009. }
  1010. func (o *ops) Conv(a scope.Value, typ object.Type, comp ...object.ComplexType) scope.Value {
  1011. switch typ {
  1012. case object.INTEGER:
  1013. switch x := a.(type) {
  1014. case *data:
  1015. return o.Conv(vfrom(x), typ)
  1016. case BYTE:
  1017. return INTEGER(x)
  1018. case SET:
  1019. return INTEGER(x.bits.Int64())
  1020. case REAL:
  1021. return INTEGER(x)
  1022. default:
  1023. halt.As(100, reflect.TypeOf(x))
  1024. }
  1025. case object.SET:
  1026. switch x := a.(type) {
  1027. case *data:
  1028. return o.Conv(vfrom(x), typ)
  1029. case INTEGER:
  1030. return SET{bits: big.NewInt(int64(x))}
  1031. default:
  1032. halt.As(100, reflect.TypeOf(x))
  1033. }
  1034. case object.REAL:
  1035. switch x := a.(type) {
  1036. case *data:
  1037. return o.Conv(vfrom(x), typ)
  1038. case INTEGER:
  1039. return REAL(float64(x))
  1040. default:
  1041. halt.As(100, reflect.TypeOf(x))
  1042. }
  1043. case object.CHAR:
  1044. switch x := a.(type) {
  1045. case *data:
  1046. return o.Conv(vfrom(x), typ)
  1047. case LONGINT:
  1048. return CHAR(rune(x))
  1049. default:
  1050. halt.As(100, reflect.TypeOf(x))
  1051. }
  1052. case object.NOTYPE:
  1053. assert.For(len(comp) > 0, 20)
  1054. switch t := comp[0].(type) {
  1055. case object.BasicType:
  1056. switch t.Type() {
  1057. case object.SHORTSTRING:
  1058. switch x := a.(type) {
  1059. case *dynarr:
  1060. return SHORTSTRING(x.tryString())
  1061. case *arr:
  1062. return SHORTSTRING(x.tryString())
  1063. default:
  1064. halt.As(100, reflect.TypeOf(x))
  1065. }
  1066. default:
  1067. halt.As(100, t.Type())
  1068. }
  1069. default:
  1070. halt.As(100, reflect.TypeOf(t))
  1071. }
  1072. default:
  1073. halt.As(100, typ)
  1074. }
  1075. panic(100)
  1076. }
  1077. func (o *ops) Not(a scope.Value) scope.Value {
  1078. switch x := a.(type) {
  1079. case *data:
  1080. return o.Not(vfrom(x))
  1081. case BOOLEAN:
  1082. return BOOLEAN(!x)
  1083. default:
  1084. halt.As(100, reflect.TypeOf(x))
  1085. }
  1086. panic(100)
  1087. }
  1088. func (o *ops) Abs(a scope.Value) scope.Value {
  1089. switch x := a.(type) {
  1090. case *data:
  1091. return o.Abs(vfrom(x))
  1092. case INTEGER:
  1093. return INTEGER(int32(math.Abs(float64(x))))
  1094. default:
  1095. halt.As(100, reflect.TypeOf(x))
  1096. }
  1097. panic(100)
  1098. }
  1099. func (o *ops) Odd(a scope.Value) scope.Value {
  1100. switch x := a.(type) {
  1101. case *data:
  1102. return o.Odd(vfrom(x))
  1103. case INTEGER:
  1104. return BOOLEAN(int32(math.Abs(float64(x)))%2 == 1)
  1105. default:
  1106. halt.As(100, reflect.TypeOf(x))
  1107. }
  1108. panic(100)
  1109. }
  1110. func (o *ops) Cap(a scope.Value) scope.Value {
  1111. switch x := a.(type) {
  1112. case *data:
  1113. return o.Cap(vfrom(x))
  1114. case CHAR:
  1115. return CHAR([]rune(strings.ToUpper(string(x)))[0])
  1116. default:
  1117. halt.As(100, reflect.TypeOf(x))
  1118. }
  1119. panic(100)
  1120. }
  1121. func (o *ops) Bits(a scope.Value) scope.Value {
  1122. switch x := a.(type) {
  1123. case *data:
  1124. return o.Bits(vfrom(x))
  1125. case INTEGER:
  1126. return SET{bits: big.NewInt(int64(x))}
  1127. default:
  1128. halt.As(100, reflect.TypeOf(x))
  1129. }
  1130. panic(100)
  1131. }
  1132. func (o *ops) Eq(a, b scope.Value) scope.Value {
  1133. switch a.(type) {
  1134. case *data:
  1135. return o.Eq(vfrom(a), b)
  1136. default:
  1137. switch b.(type) {
  1138. case *data:
  1139. return o.Eq(a, vfrom(b))
  1140. default:
  1141. switch x := a.(type) {
  1142. case INTEGER:
  1143. switch y := b.(type) {
  1144. case INTEGER:
  1145. return BOOLEAN(x == y)
  1146. default:
  1147. panic(fmt.Sprintln(reflect.TypeOf(y)))
  1148. }
  1149. case LONGINT:
  1150. switch y := b.(type) {
  1151. case LONGINT:
  1152. return BOOLEAN(x == y)
  1153. default:
  1154. panic(fmt.Sprintln(reflect.TypeOf(y)))
  1155. }
  1156. default:
  1157. panic(fmt.Sprintln(reflect.TypeOf(x)))
  1158. }
  1159. }
  1160. }
  1161. panic(0)
  1162. }
  1163. func (o *ops) Neq(a, b scope.Value) scope.Value {
  1164. switch a.(type) {
  1165. case *data:
  1166. return o.Neq(vfrom(a), b)
  1167. default:
  1168. switch b.(type) {
  1169. case *data:
  1170. return o.Neq(a, vfrom(b))
  1171. default:
  1172. switch x := a.(type) {
  1173. case *ptr:
  1174. switch y := b.(type) {
  1175. case PTR:
  1176. assert.For(y == NIL, 40)
  1177. return BOOLEAN(x.val != nil && x.val.id != 0)
  1178. default:
  1179. panic(fmt.Sprintln(reflect.TypeOf(y)))
  1180. }
  1181. case INTEGER:
  1182. switch y := b.(type) {
  1183. case INTEGER:
  1184. return BOOLEAN(x != y)
  1185. default:
  1186. panic(fmt.Sprintln(reflect.TypeOf(y)))
  1187. }
  1188. case LONGINT:
  1189. switch y := b.(type) {
  1190. case LONGINT:
  1191. return BOOLEAN(x != y)
  1192. default:
  1193. panic(fmt.Sprintln(reflect.TypeOf(y)))
  1194. }
  1195. default:
  1196. panic(fmt.Sprintln(reflect.TypeOf(x)))
  1197. }
  1198. }
  1199. }
  1200. panic(0)
  1201. }
  1202. func (o *ops) Lss(a, b scope.Value) scope.Value {
  1203. switch a.(type) {
  1204. case *data:
  1205. return o.Lss(vfrom(a), b)
  1206. default:
  1207. switch b.(type) {
  1208. case *data:
  1209. return o.Lss(a, vfrom(b))
  1210. default:
  1211. switch x := a.(type) {
  1212. case INTEGER:
  1213. switch y := b.(type) {
  1214. case INTEGER:
  1215. return BOOLEAN(x < y)
  1216. default:
  1217. panic(fmt.Sprintln(reflect.TypeOf(y)))
  1218. }
  1219. case LONGINT:
  1220. switch y := b.(type) {
  1221. case LONGINT:
  1222. return BOOLEAN(x < y)
  1223. default:
  1224. panic(fmt.Sprintln(reflect.TypeOf(y)))
  1225. }
  1226. default:
  1227. panic(fmt.Sprintln(reflect.TypeOf(x)))
  1228. }
  1229. }
  1230. }
  1231. panic(0)
  1232. }
  1233. func (o *ops) Gtr(a, b scope.Value) scope.Value {
  1234. switch a.(type) {
  1235. case *data:
  1236. return o.Gtr(vfrom(a), b)
  1237. default:
  1238. switch b.(type) {
  1239. case *data:
  1240. return o.Gtr(a, vfrom(b))
  1241. default:
  1242. switch x := a.(type) {
  1243. case INTEGER:
  1244. switch y := b.(type) {
  1245. case INTEGER:
  1246. return BOOLEAN(x > y)
  1247. default:
  1248. panic(fmt.Sprintln(reflect.TypeOf(y)))
  1249. }
  1250. default:
  1251. panic(fmt.Sprintln(reflect.TypeOf(x)))
  1252. }
  1253. }
  1254. }
  1255. panic(0)
  1256. }
  1257. func (o *ops) Leq(a, b scope.Value) scope.Value {
  1258. switch a.(type) {
  1259. case *data:
  1260. return o.Leq(vfrom(a), b)
  1261. default:
  1262. switch b.(type) {
  1263. case *data:
  1264. return o.Leq(a, vfrom(b))
  1265. default:
  1266. switch x := a.(type) {
  1267. case INTEGER:
  1268. switch y := b.(type) {
  1269. case INTEGER:
  1270. return BOOLEAN(x <= y)
  1271. default:
  1272. panic(fmt.Sprintln(reflect.TypeOf(y)))
  1273. }
  1274. default:
  1275. panic(fmt.Sprintln(reflect.TypeOf(x)))
  1276. }
  1277. }
  1278. }
  1279. panic(0)
  1280. }
  1281. func (o *ops) Geq(a, b scope.Value) scope.Value {
  1282. switch a.(type) {
  1283. case *data:
  1284. return o.Geq(vfrom(a), b)
  1285. default:
  1286. switch b.(type) {
  1287. case *data:
  1288. return o.Geq(a, vfrom(b))
  1289. default:
  1290. switch x := a.(type) {
  1291. case INTEGER:
  1292. switch y := b.(type) {
  1293. case INTEGER:
  1294. return BOOLEAN(x >= y)
  1295. default:
  1296. panic(fmt.Sprintln(reflect.TypeOf(y)))
  1297. }
  1298. default:
  1299. panic(fmt.Sprintln(reflect.TypeOf(x)))
  1300. }
  1301. }
  1302. }
  1303. panic(0)
  1304. }
  1305. func (o *ops) TypeOf(x scope.Value) (object.Type, object.ComplexType) {
  1306. switch v := x.(type) {
  1307. case *ptr:
  1308. if v.val != nil {
  1309. return v.val.link.Type(), v.val.link.Complex()
  1310. }
  1311. case *rec:
  1312. return v.link.Type(), v.link.Complex()
  1313. default:
  1314. halt.As(100, reflect.TypeOf(v))
  1315. }
  1316. return object.NOTYPE, nil
  1317. }
  1318. func init() {
  1319. scope.ValueFrom = vfrom
  1320. scope.GoTypeFrom = gfrom
  1321. scope.TypeFromGo = fromg
  1322. scope.Ops = &ops{}
  1323. }