val.go 35 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659166016611662166316641665166616671668166916701671167216731674167516761677167816791680168116821683168416851686168716881689169016911692169316941695169616971698169917001701170217031704170517061707170817091710171117121713171417151716171717181719172017211722172317241725172617271728172917301731
  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. some scope.Array
  44. idx int
  45. }
  46. func (i *idx) link() object.Object {
  47. switch a := i.some.(type) {
  48. case *arr:
  49. return a.link
  50. case *dynarr:
  51. return a.link
  52. default:
  53. panic(0)
  54. }
  55. }
  56. func (i *idx) val() []interface{} {
  57. switch a := i.some.(type) {
  58. case *arr:
  59. return a.val
  60. case *dynarr:
  61. return a.val
  62. default:
  63. panic(0)
  64. }
  65. }
  66. func (r *rec) String() string {
  67. return r.link.Name()
  68. }
  69. func (r *rec) Id() cp.ID {
  70. return r.link.Adr()
  71. }
  72. func (r *rec) Set(v scope.Value) {
  73. panic(0)
  74. }
  75. func (r *rec) Get(id cp.ID) scope.Value {
  76. k := r.l.k[id]
  77. if r.l.v[k] == nil { //ref
  78. return r.l.r[k]
  79. } else {
  80. return r.l.v[k]
  81. }
  82. }
  83. func newRec(o object.Object) *rec {
  84. _, ok := o.Complex().(object.RecordType)
  85. assert.For(ok, 20)
  86. return &rec{link: o}
  87. }
  88. func (p *proc) String() string {
  89. return fmt.Sprint(p.link.Adr(), p.link.Name())
  90. }
  91. func (x *data) Id() cp.ID { return x.link.Adr() }
  92. func (x *arr) Id() cp.ID { return x.link.Adr() }
  93. func (x *dynarr) Id() cp.ID { return x.link.Adr() }
  94. func (a *arr) Set(v scope.Value) {
  95. switch x := v.(type) {
  96. case *arr:
  97. a.Set(STRING(x.tryString()))
  98. case STRING:
  99. v := make([]interface{}, int(a.length))
  100. for i := 0; i < int(a.length) && i < len(x); i++ {
  101. v[i] = CHAR(x[i])
  102. }
  103. a.val = v
  104. case SHORTSTRING:
  105. v := make([]interface{}, int(a.length))
  106. for i := 0; i < int(a.length) && i < len(x); i++ {
  107. v[i] = SHORTCHAR(x[i])
  108. }
  109. a.val = v
  110. default:
  111. halt.As(100, reflect.TypeOf(x))
  112. }
  113. }
  114. func (a *dynarr) Set(v scope.Value) {
  115. switch x := v.(type) {
  116. case *data:
  117. a.Set(vfrom(x))
  118. case *arr:
  119. a.val = x.val
  120. case *dynarr:
  121. a.val = x.val
  122. case *idx:
  123. a.Set(x.Get())
  124. case STRING:
  125. z := []rune(string(x))
  126. v := make([]interface{}, len(z))
  127. for i := 0; i < len(z); i++ {
  128. v[i] = CHAR(z[i])
  129. }
  130. a.val = v
  131. case SHORTSTRING:
  132. z := []rune(string(x))
  133. v := make([]interface{}, len(z))
  134. for i := 0; i < len(z); i++ {
  135. v[i] = SHORTCHAR(z[i])
  136. }
  137. a.val = v
  138. case INTEGER:
  139. a.val = make([]interface{}, int(x))
  140. default:
  141. halt.As(100, reflect.TypeOf(x))
  142. }
  143. }
  144. func (a *arr) tryString() (ret string) {
  145. stop := false
  146. for i := 0; !stop && i < len(a.val) && a.val[i] != nil; i++ {
  147. switch x := a.val[i].(type) {
  148. case CHAR:
  149. stop = int(x) == 0
  150. if !stop {
  151. ret = fmt.Sprint(ret, string([]rune{rune(x)}))
  152. }
  153. case SHORTCHAR:
  154. stop = int(x) == 0
  155. if !stop {
  156. ret = fmt.Sprint(ret, string([]rune{rune(x)}))
  157. }
  158. default:
  159. halt.As(100, reflect.TypeOf(x))
  160. }
  161. }
  162. return ret
  163. }
  164. func (a *arr) String() (ret string) {
  165. ret = fmt.Sprint("array", "[", a.length, "]")
  166. for i := 0; i < len(a.val) && a.val[i] != nil; i++ {
  167. switch x := a.val[i].(type) {
  168. case CHAR:
  169. ret = fmt.Sprint(ret, string([]rune{rune(x)}))
  170. case SHORTCHAR:
  171. ret = fmt.Sprint(ret, string([]rune{rune(x)}))
  172. case REAL:
  173. ret = fmt.Sprint(ret, ", ", a.val[i])
  174. default:
  175. halt.As(100, reflect.TypeOf(x))
  176. }
  177. }
  178. return ret
  179. }
  180. //возвращает *idx
  181. func (a *arr) Get(id scope.Value) scope.Value {
  182. switch i := id.(type) {
  183. case *data:
  184. return a.Get(i.val.(scope.Value))
  185. case INTEGER:
  186. assert.For(int64(i) < a.length, 20)
  187. if len(a.val) == 0 {
  188. a.val = make([]interface{}, int(a.length))
  189. }
  190. return &idx{some: a, idx: int(i)}
  191. default:
  192. halt.As(100, reflect.TypeOf(i))
  193. }
  194. panic(0)
  195. }
  196. //возвращает *idx
  197. func (a *dynarr) Get(id scope.Value) scope.Value {
  198. switch i := id.(type) {
  199. case *data:
  200. return a.Get(i.val.(scope.Value))
  201. case INTEGER:
  202. assert.For(int(i) < len(a.val), 20)
  203. if len(a.val) == 0 {
  204. panic(0)
  205. }
  206. return &idx{some: a, idx: int(i)}
  207. default:
  208. halt.As(100, reflect.TypeOf(i))
  209. }
  210. panic(0)
  211. }
  212. func (i *idx) Id() cp.ID {
  213. return i.some.Id()
  214. }
  215. func (i *idx) String() string {
  216. return fmt.Sprint("@", i.Id(), "[", i.idx, "]")
  217. }
  218. func (i *idx) Set(v scope.Value) {
  219. t := i.link().Complex()
  220. switch x := v.(type) {
  221. case *idx:
  222. var comp object.Type = object.NOTYPE
  223. switch xt := x.link().Complex().(type) {
  224. case object.ArrayType:
  225. comp = xt.Base()
  226. case object.DynArrayType:
  227. comp = xt.Base()
  228. default:
  229. halt.As(100, xt)
  230. }
  231. if comp != object.COMPLEX {
  232. i.val()[i.idx] = x.val()[x.idx]
  233. } else {
  234. switch z := x.val()[x.idx].(type) {
  235. case *arr:
  236. t := z.link.Complex().(object.ArrayType).Base()
  237. switch t {
  238. case object.CHAR:
  239. i.val()[i.idx].(*arr).Set(STRING(z.tryString()))
  240. default:
  241. halt.As(100, t)
  242. }
  243. default:
  244. halt.As(100, reflect.TypeOf(z))
  245. }
  246. }
  247. case *data:
  248. i.Set(x.val.(scope.Value))
  249. case CHAR:
  250. i.val()[i.idx] = x
  251. case STRING:
  252. _ = t.(object.ArrayType)
  253. i.val()[i.idx].(*arr).Set(x)
  254. case REAL:
  255. i.val()[i.idx] = x
  256. default:
  257. halt.As(100, reflect.TypeOf(x), x, t)
  258. }
  259. }
  260. func (i *idx) Get() scope.Value {
  261. x := i.val()[i.idx]
  262. switch z := x.(type) {
  263. case *arr:
  264. return z
  265. case CHAR:
  266. return z
  267. case nil:
  268. b := i.link().Complex().(object.ArrayType).Base()
  269. switch b {
  270. case object.CHAR:
  271. return CHAR(rune(0))
  272. default:
  273. halt.As(101, reflect.TypeOf(b))
  274. }
  275. default:
  276. halt.As(100, i.idx, reflect.TypeOf(z))
  277. }
  278. panic(0)
  279. }
  280. func (a *dynarr) tryString() (ret string) {
  281. stop := false
  282. for i := 0; !stop && i < len(a.val) && a.val[i] != nil; i++ {
  283. switch x := a.val[i].(type) {
  284. case CHAR:
  285. stop = int(x) == 0
  286. if !stop {
  287. ret = fmt.Sprint(ret, string([]rune{rune(x)}))
  288. }
  289. case SHORTCHAR:
  290. stop = int(x) == 0
  291. if !stop {
  292. ret = fmt.Sprint(ret, string([]rune{rune(x)}))
  293. }
  294. default:
  295. halt.As(100, reflect.TypeOf(x))
  296. }
  297. }
  298. return ret
  299. }
  300. func (a *dynarr) String() (ret string) {
  301. ret = fmt.Sprint("dyn array")
  302. for i := 0; i < len(a.val) && a.val[i] != nil; i++ {
  303. switch x := a.val[i].(type) {
  304. case CHAR:
  305. ret = fmt.Sprint(ret, string([]rune{rune(x)}))
  306. case SHORTCHAR:
  307. ret = fmt.Sprint(ret, string([]rune{rune(x)}))
  308. default:
  309. halt.As(100, reflect.TypeOf(x))
  310. }
  311. }
  312. return ret
  313. }
  314. func (d *data) Set(v scope.Value) {
  315. utils.PrintScope("set data")
  316. switch x := v.(type) {
  317. case *data:
  318. if d.link.Type() == x.link.Type() {
  319. d.val = x.val
  320. } else {
  321. d.Set(x.val.(scope.Value))
  322. }
  323. case *proc:
  324. assert.For(d.link.Type() == object.COMPLEX, 20)
  325. t, ok := d.link.Complex().(object.BasicType)
  326. assert.For(ok, 21, reflect.TypeOf(d.link.Complex()))
  327. assert.For(t.Type() == object.PROCEDURE, 22)
  328. d.val = x
  329. case *idx:
  330. d.val = x.val()[x.idx]
  331. case INTEGER:
  332. switch d.link.Type() {
  333. case object.INTEGER:
  334. d.val = x
  335. case object.LONGINT:
  336. d.val = LONGINT(x)
  337. case object.REAL:
  338. d.val = REAL(x)
  339. default:
  340. halt.As(20, d.link.Type())
  341. }
  342. case BOOLEAN:
  343. assert.For(d.link.Type() == object.BOOLEAN, 20)
  344. d.val = x
  345. case SHORTCHAR:
  346. assert.For(d.link.Type() == object.SHORTCHAR, 20)
  347. d.val = x
  348. case CHAR:
  349. assert.For(d.link.Type() == object.CHAR, 20)
  350. d.val = x
  351. case SHORTINT:
  352. assert.For(d.link.Type() == object.SHORTINT, 20)
  353. d.val = x
  354. case LONGINT:
  355. assert.For(d.link.Type() == object.LONGINT, 20)
  356. d.val = x
  357. case BYTE:
  358. assert.For(d.link.Type() == object.BYTE, 20)
  359. d.val = x
  360. case SET:
  361. assert.For(d.link.Type() == object.SET, 20)
  362. d.val = x
  363. case REAL:
  364. assert.For(d.link.Type() == object.REAL, 20)
  365. d.val = x
  366. case SHORTREAL:
  367. assert.For(d.link.Type() == object.SHORTREAL, 20)
  368. d.val = x
  369. default:
  370. panic(fmt.Sprintln(reflect.TypeOf(x)))
  371. }
  372. }
  373. func (d *data) String() string {
  374. return fmt.Sprint(d.link.Name(), "=", d.val)
  375. }
  376. func (p *ptr) String() string {
  377. return fmt.Sprint("pointer ", p.link.Complex().(object.PointerType).Name(), "&", p.val)
  378. }
  379. func (p *ptr) Id() cp.ID { return p.link.Adr() }
  380. func (p *ptr) Set(v scope.Value) {
  381. switch x := v.(type) {
  382. case *ptr:
  383. p.Set(x.val)
  384. case *ptrValue:
  385. p.val = x
  386. case PTR:
  387. assert.For(x == NIL, 40)
  388. p.val = nil
  389. default:
  390. halt.As(100, reflect.TypeOf(x))
  391. }
  392. }
  393. func (p *ptr) Get() scope.Value {
  394. if p.val == nil {
  395. return NIL
  396. } else {
  397. return p.val.scope.Select(p.val.id)
  398. }
  399. }
  400. func newPtr(o object.Object) scope.Variable {
  401. _, ok := o.Complex().(object.PointerType)
  402. assert.For(ok, 20)
  403. return &ptr{link: o}
  404. }
  405. type ptrValue struct {
  406. scope *area
  407. id cp.ID
  408. link object.Object
  409. }
  410. func (p *ptrValue) String() string {
  411. return fmt.Sprint(p.id)
  412. }
  413. type PTR int
  414. func (p PTR) String() string {
  415. return "NIL"
  416. }
  417. const NIL PTR = 0
  418. type INTEGER int32
  419. type BOOLEAN bool
  420. type BYTE int8
  421. type SHORTINT int16
  422. type LONGINT int64
  423. type SET struct {
  424. bits *big.Int
  425. }
  426. type CHAR rune
  427. type REAL float64
  428. type SHORTREAL float32
  429. type SHORTCHAR rune
  430. type STRING string
  431. type SHORTSTRING string
  432. func (x SHORTSTRING) String() string { return string(x) }
  433. func (x STRING) String() string { return string(x) }
  434. func (x SHORTCHAR) String() string { return fmt.Sprint(rune(x)) }
  435. func (x SHORTREAL) String() string { return fmt.Sprint(float32(x)) }
  436. func (x REAL) String() string { return fmt.Sprint(float64(x)) }
  437. func (x CHAR) String() string { return fmt.Sprint(rune(x)) }
  438. func (x SET) String() string { return fmt.Sprint(x.bits) }
  439. func (x LONGINT) String() string { return fmt.Sprint(int64(x)) }
  440. func (x SHORTINT) String() string { return fmt.Sprint(int16(x)) }
  441. func (x BYTE) String() string { return fmt.Sprint(int8(x)) }
  442. func (x INTEGER) String() string { return fmt.Sprint(int32(x)) }
  443. func (x BOOLEAN) String() string { return fmt.Sprint(bool(x)) }
  444. func newData(o object.Object) (ret scope.Variable) {
  445. switch o.Type() {
  446. case object.INTEGER:
  447. ret = &data{link: o, val: INTEGER(0)}
  448. case object.BOOLEAN:
  449. ret = &data{link: o, val: BOOLEAN(false)}
  450. case object.BYTE:
  451. ret = &data{link: o, val: BYTE(0)}
  452. case object.CHAR:
  453. ret = &data{link: o, val: CHAR(0)}
  454. case object.LONGINT:
  455. ret = &data{link: o, val: LONGINT(0)}
  456. case object.SHORTINT:
  457. ret = &data{link: o, val: SHORTINT(0)}
  458. case object.SET:
  459. ret = &data{link: o, val: SET{bits: big.NewInt(0)}}
  460. case object.REAL:
  461. ret = &data{link: o, val: REAL(0)}
  462. case object.SHORTREAL:
  463. ret = &data{link: o, val: SHORTREAL(0)}
  464. case object.SHORTCHAR:
  465. ret = &data{link: o, val: SHORTCHAR(0)}
  466. case object.COMPLEX:
  467. switch t := o.Complex().(type) {
  468. case object.BasicType:
  469. switch t.Type() {
  470. case object.PROCEDURE:
  471. ret = &data{link: o, val: nil}
  472. default:
  473. halt.As(100, t.Type())
  474. }
  475. case object.ArrayType:
  476. ret = &arr{link: o, length: t.Len()}
  477. if a := ret.(*arr); t.Base() == object.COMPLEX {
  478. a.val = make([]interface{}, int(t.Len()))
  479. for i := 0; i < int(t.Len()); i++ {
  480. fake := object.New(object.VARIABLE, cp.Some())
  481. fake.SetName("[?]")
  482. fake.SetType(object.COMPLEX)
  483. fake.SetComplex(t.Complex())
  484. a.val[i] = newData(fake)
  485. }
  486. }
  487. case object.DynArrayType:
  488. ret = &dynarr{link: o}
  489. default:
  490. halt.As(100, reflect.TypeOf(t))
  491. }
  492. case object.NOTYPE:
  493. switch t := o.Complex().(type) {
  494. case nil:
  495. ret = &ptr{link: o}
  496. default:
  497. halt.As(100, reflect.TypeOf(t))
  498. }
  499. default:
  500. panic(fmt.Sprintln("unsupported type", o, o.Type(), o.Complex()))
  501. }
  502. return ret
  503. }
  504. func fromg(x interface{}) scope.Value {
  505. switch x := x.(type) {
  506. case int32:
  507. return INTEGER(x)
  508. case bool:
  509. return BOOLEAN(x)
  510. case *big.Int:
  511. return SET{bits: x}
  512. case string:
  513. return STRING(x)
  514. case float64:
  515. return REAL(x)
  516. default:
  517. halt.As(100, reflect.TypeOf(x))
  518. }
  519. panic(100)
  520. }
  521. func newProc(o object.Object) scope.Value {
  522. p, ok := o.(object.ProcedureObject)
  523. assert.For(ok, 20, reflect.TypeOf(o))
  524. return &proc{link: p}
  525. }
  526. func newConst(n node.Node) scope.Value {
  527. switch x := n.(type) {
  528. case node.ConstantNode:
  529. switch x.Type() {
  530. case object.INTEGER:
  531. return INTEGER(x.Data().(int32))
  532. case object.REAL:
  533. return REAL(x.Data().(float64))
  534. case object.BOOLEAN:
  535. return BOOLEAN(x.Data().(bool))
  536. case object.SHORTCHAR:
  537. return SHORTCHAR(x.Data().(rune))
  538. case object.LONGINT:
  539. return LONGINT(x.Data().(int64))
  540. case object.SHORTINT:
  541. return SHORTINT(x.Data().(int16))
  542. case object.SHORTREAL:
  543. return SHORTREAL(x.Data().(float32))
  544. case object.BYTE:
  545. return BYTE(x.Data().(int8))
  546. case object.SET:
  547. return SET{bits: x.Data().(*big.Int)}
  548. case object.CHAR:
  549. return CHAR(x.Data().(rune))
  550. case object.STRING:
  551. return STRING(x.Data().(string))
  552. case object.SHORTSTRING:
  553. return SHORTSTRING(x.Data().(string))
  554. case object.NIL:
  555. return NIL
  556. case object.COMPLEX: //не может существовать в реальности, используется для передачи параметров от рантайма
  557. switch d := x.Data().(type) {
  558. case *ptrValue:
  559. return d
  560. default:
  561. halt.As(100, reflect.TypeOf(d))
  562. }
  563. default:
  564. panic(fmt.Sprintln(x.Type()))
  565. }
  566. }
  567. panic(0)
  568. }
  569. func vfrom(v scope.Value) scope.Value {
  570. switch n := v.(type) {
  571. case *data:
  572. switch n.link.Type() {
  573. case object.INTEGER:
  574. return n.val.(INTEGER)
  575. case object.BYTE:
  576. return n.val.(BYTE)
  577. case object.CHAR:
  578. return n.val.(CHAR)
  579. case object.SET:
  580. return n.val.(SET)
  581. case object.BOOLEAN:
  582. return n.val.(BOOLEAN)
  583. case object.REAL:
  584. return n.val.(REAL)
  585. case object.LONGINT:
  586. return n.val.(LONGINT)
  587. default:
  588. halt.As(100, n.link.Type())
  589. }
  590. case INTEGER, CHAR:
  591. return n
  592. default:
  593. halt.As(100, reflect.TypeOf(n))
  594. }
  595. return nil
  596. }
  597. func gfrom(v scope.Value) interface{} {
  598. switch n := v.(type) {
  599. case *data:
  600. if n.val == nil {
  601. return nil
  602. } else {
  603. return gfrom(n.val.(scope.Value))
  604. }
  605. case *rec:
  606. return n
  607. case *proc:
  608. return n.link
  609. case *dynarr:
  610. switch n.link.Complex().(object.DynArrayType).Base() {
  611. case object.SHORTCHAR:
  612. if n.val != nil {
  613. return n.tryString()
  614. } else {
  615. return ""
  616. }
  617. case object.CHAR:
  618. if n.val != nil {
  619. return n.tryString()
  620. } else {
  621. return ""
  622. }
  623. default:
  624. halt.As(100, n.link.Complex().(object.DynArrayType).Base())
  625. }
  626. panic(0)
  627. case *arr:
  628. switch n.link.Complex().(object.ArrayType).Base() {
  629. case object.SHORTCHAR:
  630. if n.val != nil {
  631. return n.tryString()
  632. } else {
  633. return ""
  634. }
  635. case object.CHAR:
  636. if n.val != nil {
  637. return n.tryString()
  638. } else {
  639. return ""
  640. }
  641. case object.REAL:
  642. ret := make([]float64, 0)
  643. for i := 0; i < len(n.val) && n.val[i] != nil; i++ {
  644. ret = append(ret, float64(n.val[i].(REAL)))
  645. }
  646. return ret
  647. default:
  648. halt.As(100, n.link.Complex().(object.ArrayType).Base())
  649. }
  650. panic(0)
  651. case *idx:
  652. switch n.link().Complex().(object.ArrayType).Base() {
  653. case object.CHAR:
  654. return rune(n.Get().(CHAR))
  655. default:
  656. halt.As(100, n.link().Complex().(object.ArrayType).Base())
  657. }
  658. panic(0)
  659. case PTR:
  660. assert.For(n == NIL, 40)
  661. return nil
  662. case INTEGER:
  663. return int32(n)
  664. case BOOLEAN:
  665. return bool(n)
  666. case STRING:
  667. return string(n)
  668. default:
  669. halt.As(100, reflect.TypeOf(n))
  670. }
  671. return nil
  672. }
  673. type ops struct{}
  674. func (o *ops) Sum(a, b scope.Value) scope.Value {
  675. switch a.(type) {
  676. case *data:
  677. return o.Sum(vfrom(a), b)
  678. default:
  679. switch b.(type) {
  680. case *data:
  681. return o.Sum(a, vfrom(b))
  682. default:
  683. switch x := a.(type) {
  684. case INTEGER:
  685. switch y := b.(type) {
  686. case INTEGER:
  687. return INTEGER(int32(x) + int32(y))
  688. default:
  689. panic(fmt.Sprintln(reflect.TypeOf(y)))
  690. }
  691. case SET:
  692. switch y := b.(type) {
  693. case SET:
  694. res := big.NewInt(0)
  695. for i := 0; i < 64; i++ {
  696. if x.bits.Bit(i) == 1 {
  697. res.SetBit(res, i, 1)
  698. }
  699. if y.bits.Bit(i) == 1 {
  700. res.SetBit(res, i, 1)
  701. }
  702. }
  703. return SET{bits: res}
  704. case INTEGER: // INCL(SET, INTEGER)
  705. return SET{bits: x.bits.SetBit(x.bits, int(y), 1)}
  706. default:
  707. panic(fmt.Sprintln(reflect.TypeOf(y)))
  708. }
  709. case *arr:
  710. switch y := b.(type) {
  711. case *arr:
  712. switch {
  713. case x.link.Type() == y.link.Type() && x.link.Complex().(object.ArrayType).Base() == object.CHAR:
  714. return STRING(x.tryString() + y.tryString())
  715. default:
  716. halt.As(100, x.link.Type(), y.link.Type())
  717. }
  718. case STRING:
  719. switch {
  720. case x.link.Complex().(object.ArrayType).Base() == object.CHAR:
  721. return STRING(x.tryString() + string(y))
  722. default:
  723. halt.As(100, x.link.Type())
  724. }
  725. default:
  726. panic(fmt.Sprintln(reflect.TypeOf(y)))
  727. }
  728. case *dynarr:
  729. switch y := b.(type) {
  730. case STRING:
  731. switch {
  732. case x.link.Complex().(object.DynArrayType).Base() == object.CHAR:
  733. return STRING(x.tryString() + string(y))
  734. default:
  735. halt.As(100, x.link.Type())
  736. }
  737. default:
  738. panic(fmt.Sprintln(reflect.TypeOf(y)))
  739. }
  740. case STRING:
  741. switch y := b.(type) {
  742. case STRING:
  743. return STRING(string(x) + string(y))
  744. default:
  745. halt.As(100, reflect.TypeOf(y))
  746. }
  747. case REAL:
  748. switch y := b.(type) {
  749. case REAL:
  750. return REAL(x + y)
  751. default:
  752. halt.As(100, reflect.TypeOf(y))
  753. }
  754. case LONGINT:
  755. switch y := b.(type) {
  756. case LONGINT:
  757. return LONGINT(x + y)
  758. default:
  759. halt.As(100, reflect.TypeOf(y))
  760. }
  761. default:
  762. panic(fmt.Sprintln(reflect.TypeOf(x)))
  763. }
  764. }
  765. }
  766. panic(0)
  767. }
  768. func (o *ops) Sub(a, b scope.Value) scope.Value {
  769. switch a.(type) {
  770. case *data:
  771. return o.Sub(vfrom(a), b)
  772. default:
  773. switch b.(type) {
  774. case *data:
  775. return o.Sub(a, vfrom(b))
  776. default:
  777. switch x := a.(type) {
  778. case INTEGER:
  779. switch y := b.(type) {
  780. case INTEGER:
  781. return INTEGER(int32(x) - int32(y))
  782. default:
  783. panic(fmt.Sprintln(reflect.TypeOf(y)))
  784. }
  785. case REAL:
  786. switch y := b.(type) {
  787. case REAL:
  788. return REAL(x - y)
  789. default:
  790. panic(fmt.Sprintln(reflect.TypeOf(y)))
  791. }
  792. case LONGINT:
  793. switch y := b.(type) {
  794. case LONGINT:
  795. return INTEGER(int64(x) - int64(y))
  796. default:
  797. panic(fmt.Sprintln(reflect.TypeOf(y)))
  798. }
  799. case SET:
  800. switch y := b.(type) {
  801. case SET:
  802. res := big.NewInt(0).Set(x.bits)
  803. for i := 0; i < 64; i++ {
  804. if y.bits.Bit(i) == 1 {
  805. res.SetBit(res, i, 0)
  806. }
  807. }
  808. return SET{bits: res}
  809. case INTEGER:
  810. null := big.NewInt(0)
  811. res := null.SetBit(x.bits, int(y), 0)
  812. return SET{bits: res}
  813. default:
  814. panic(fmt.Sprintln(reflect.TypeOf(y)))
  815. }
  816. default:
  817. panic(fmt.Sprintln(reflect.TypeOf(x)))
  818. }
  819. }
  820. }
  821. panic(0)
  822. }
  823. func (o *ops) In(a, b scope.Value) scope.Value {
  824. switch a.(type) {
  825. case *data:
  826. return o.In(vfrom(a), b)
  827. default:
  828. switch b.(type) {
  829. case *data:
  830. return o.In(a, vfrom(b))
  831. default:
  832. switch x := a.(type) {
  833. case INTEGER:
  834. switch y := b.(type) {
  835. case SET:
  836. assert.For(int(x) < 64, 20)
  837. return BOOLEAN(y.bits.Bit(int(x)) == 1)
  838. default:
  839. panic(fmt.Sprintln(reflect.TypeOf(y)))
  840. }
  841. default:
  842. panic(fmt.Sprintln(reflect.TypeOf(x)))
  843. }
  844. }
  845. }
  846. panic(0)
  847. }
  848. func (o *ops) Min(a, b scope.Value) scope.Value {
  849. switch a.(type) {
  850. case *data:
  851. return o.Min(vfrom(a), b)
  852. default:
  853. switch b.(type) {
  854. case *data:
  855. return o.Min(a, vfrom(b))
  856. default:
  857. switch x := a.(type) {
  858. case INTEGER:
  859. switch y := b.(type) {
  860. case INTEGER:
  861. return INTEGER(int32(math.Min(float64(x), float64(y))))
  862. default:
  863. panic(fmt.Sprintln(reflect.TypeOf(y)))
  864. }
  865. default:
  866. panic(fmt.Sprintln(reflect.TypeOf(x)))
  867. }
  868. }
  869. }
  870. panic(0)
  871. }
  872. func (o *ops) Max(a, b scope.Value) scope.Value {
  873. switch a.(type) {
  874. case *data:
  875. return o.Max(vfrom(a), b)
  876. default:
  877. switch b.(type) {
  878. case *data:
  879. return o.Max(a, vfrom(b))
  880. default:
  881. switch x := a.(type) {
  882. case INTEGER:
  883. switch y := b.(type) {
  884. case INTEGER:
  885. return INTEGER(int32(math.Max(float64(x), float64(y))))
  886. default:
  887. panic(fmt.Sprintln(reflect.TypeOf(y)))
  888. }
  889. default:
  890. panic(fmt.Sprintln(reflect.TypeOf(x)))
  891. }
  892. }
  893. }
  894. panic(0)
  895. }
  896. func (o *ops) And(a, b scope.Value) scope.Value {
  897. switch a.(type) {
  898. case *data:
  899. return o.And(vfrom(a), b)
  900. default:
  901. switch b.(type) {
  902. case *data:
  903. return o.And(a, vfrom(b))
  904. default:
  905. switch x := a.(type) {
  906. case BOOLEAN:
  907. switch y := b.(type) {
  908. case BOOLEAN:
  909. return BOOLEAN(x && y)
  910. default:
  911. panic(fmt.Sprintln(reflect.TypeOf(y)))
  912. }
  913. default:
  914. panic(fmt.Sprintln(reflect.TypeOf(x)))
  915. }
  916. }
  917. }
  918. panic(0)
  919. }
  920. func (o *ops) Or(a, b scope.Value) scope.Value {
  921. switch a.(type) {
  922. case *data:
  923. return o.Or(vfrom(a), b)
  924. default:
  925. switch b.(type) {
  926. case *data:
  927. return o.Or(a, vfrom(b))
  928. default:
  929. switch x := a.(type) {
  930. case BOOLEAN:
  931. switch y := b.(type) {
  932. case BOOLEAN:
  933. return BOOLEAN(x || y)
  934. default:
  935. panic(fmt.Sprintln(reflect.TypeOf(y)))
  936. }
  937. default:
  938. panic(fmt.Sprintln(reflect.TypeOf(x)))
  939. }
  940. }
  941. }
  942. panic(0)
  943. }
  944. func (o *ops) Ash(a, b scope.Value) scope.Value {
  945. switch a.(type) {
  946. case *data:
  947. return o.Ash(vfrom(a), b)
  948. default:
  949. switch b.(type) {
  950. case *data:
  951. return o.Ash(a, vfrom(b))
  952. default:
  953. switch x := a.(type) {
  954. case INTEGER:
  955. switch y := b.(type) {
  956. case INTEGER:
  957. return INTEGER(x << uint(y))
  958. default:
  959. panic(fmt.Sprintln(reflect.TypeOf(y)))
  960. }
  961. default:
  962. panic(fmt.Sprintln(reflect.TypeOf(x)))
  963. }
  964. }
  965. }
  966. panic(0)
  967. }
  968. func (o *ops) Div(a, b scope.Value) scope.Value {
  969. switch a.(type) {
  970. case *data:
  971. return o.Div(vfrom(a), b)
  972. default:
  973. switch b.(type) {
  974. case *data:
  975. return o.Div(a, vfrom(b))
  976. default:
  977. switch x := a.(type) {
  978. case INTEGER:
  979. switch y := b.(type) {
  980. case INTEGER:
  981. return INTEGER(math.Floor(float64(x) / float64(y)))
  982. default:
  983. panic(fmt.Sprintln(reflect.TypeOf(y)))
  984. }
  985. case LONGINT:
  986. switch y := b.(type) {
  987. case LONGINT:
  988. return LONGINT(x / y)
  989. default:
  990. panic(fmt.Sprintln(reflect.TypeOf(y)))
  991. }
  992. default:
  993. panic(fmt.Sprintln(reflect.TypeOf(x)))
  994. }
  995. }
  996. }
  997. panic(0)
  998. }
  999. func (o *ops) Mod(a, b scope.Value) scope.Value {
  1000. switch a.(type) {
  1001. case *data:
  1002. return o.Mod(vfrom(a), b)
  1003. default:
  1004. switch b.(type) {
  1005. case *data:
  1006. return o.Mod(a, vfrom(b))
  1007. default:
  1008. switch x := a.(type) {
  1009. case INTEGER:
  1010. switch y := b.(type) {
  1011. case INTEGER:
  1012. z := x % y
  1013. switch {
  1014. case (x < 0) != (y < 0):
  1015. z = z + y
  1016. }
  1017. return INTEGER(z)
  1018. default:
  1019. panic(fmt.Sprintln(reflect.TypeOf(y)))
  1020. }
  1021. case LONGINT:
  1022. switch y := b.(type) {
  1023. case LONGINT:
  1024. return LONGINT(x % y)
  1025. default:
  1026. panic(fmt.Sprintln(reflect.TypeOf(y)))
  1027. }
  1028. default:
  1029. panic(fmt.Sprintln(reflect.TypeOf(x)))
  1030. }
  1031. }
  1032. }
  1033. panic(0)
  1034. }
  1035. func (o *ops) Mult(a, b scope.Value) scope.Value {
  1036. switch a.(type) {
  1037. case *data:
  1038. return o.Mult(vfrom(a), b)
  1039. default:
  1040. switch b.(type) {
  1041. case *data:
  1042. return o.Mult(a, vfrom(b))
  1043. default:
  1044. switch x := a.(type) {
  1045. case INTEGER:
  1046. switch y := b.(type) {
  1047. case INTEGER:
  1048. return INTEGER(x * y)
  1049. default:
  1050. panic(fmt.Sprintln(reflect.TypeOf(y)))
  1051. }
  1052. case REAL:
  1053. switch y := b.(type) {
  1054. case REAL:
  1055. return REAL(x * y)
  1056. default:
  1057. panic(fmt.Sprintln(reflect.TypeOf(y)))
  1058. }
  1059. case SET:
  1060. switch y := b.(type) {
  1061. case SET:
  1062. res := big.NewInt(0)
  1063. for i := 0; i < 64; i++ {
  1064. if x.bits.Bit(i) == 1 && y.bits.Bit(i) == 1 {
  1065. res.SetBit(res, i, 1)
  1066. }
  1067. }
  1068. return SET{bits: res}
  1069. default:
  1070. panic(fmt.Sprintln(reflect.TypeOf(y)))
  1071. }
  1072. default:
  1073. panic(fmt.Sprintln(reflect.TypeOf(x)))
  1074. }
  1075. }
  1076. }
  1077. panic(0)
  1078. }
  1079. func (o *ops) Divide(a, b scope.Value) scope.Value {
  1080. switch a.(type) {
  1081. case *data:
  1082. return o.Divide(vfrom(a), b)
  1083. default:
  1084. switch b.(type) {
  1085. case *data:
  1086. return o.Divide(a, vfrom(b))
  1087. default:
  1088. switch x := a.(type) {
  1089. case INTEGER:
  1090. switch y := b.(type) {
  1091. case INTEGER:
  1092. return REAL(float64(x) / float64(y))
  1093. default:
  1094. panic(fmt.Sprintln(reflect.TypeOf(y)))
  1095. }
  1096. case REAL:
  1097. switch y := b.(type) {
  1098. case REAL:
  1099. return REAL(float64(x) / float64(y))
  1100. default:
  1101. panic(fmt.Sprintln(reflect.TypeOf(y)))
  1102. }
  1103. case SET:
  1104. switch y := b.(type) {
  1105. case SET:
  1106. res := big.NewInt(0)
  1107. for i := 0; i < 64; i++ {
  1108. if x.bits.Bit(i) != y.bits.Bit(i) {
  1109. res.SetBit(res, i, 1)
  1110. }
  1111. }
  1112. return SET{bits: res}
  1113. default:
  1114. panic(fmt.Sprintln(reflect.TypeOf(y)))
  1115. }
  1116. default:
  1117. panic(fmt.Sprintln(reflect.TypeOf(x)))
  1118. }
  1119. }
  1120. }
  1121. panic(0)
  1122. }
  1123. func (o *ops) Len(a object.Object, _a, _b scope.Value) (ret scope.Value) {
  1124. //assert.For(a != nil, 20)
  1125. assert.For(_b != nil, 21)
  1126. var b int32 = gfrom(_b).(int32)
  1127. assert.For(b == 0, 22)
  1128. if a != nil {
  1129. assert.For(a.Type() == object.COMPLEX, 23)
  1130. switch typ := a.Complex().(type) {
  1131. case object.ArrayType:
  1132. ret = INTEGER(int32(typ.Len()))
  1133. case object.DynArrayType:
  1134. switch t := _a.(type) {
  1135. case *arr:
  1136. ret = INTEGER(t.length)
  1137. case *dynarr:
  1138. ret = INTEGER(len(t.val))
  1139. default:
  1140. halt.As(100, "unsupported", reflect.TypeOf(t))
  1141. }
  1142. default:
  1143. panic(fmt.Sprintln("unsupported", reflect.TypeOf(a.Complex())))
  1144. }
  1145. } else {
  1146. switch a := _a.(type) {
  1147. case *arr:
  1148. ret = INTEGER(int32(a.length))
  1149. case *dynarr:
  1150. ret = INTEGER(int32(len(a.val)))
  1151. case STRING:
  1152. rs := []rune(string(a))
  1153. ln := len(rs)
  1154. ret = INTEGER(0)
  1155. for l := 0; l < ln && rs[l] != 0; l++ {
  1156. ret = INTEGER(l + 1)
  1157. }
  1158. default:
  1159. panic(fmt.Sprintln("unsupported", reflect.TypeOf(a)))
  1160. }
  1161. }
  1162. return ret
  1163. }
  1164. func (o *ops) Is(a scope.Value, typ object.ComplexType) scope.Value {
  1165. var compare func(x, a object.ComplexType) bool
  1166. compare = func(_x, _a object.ComplexType) bool {
  1167. switch x := _x.(type) {
  1168. case object.RecordType:
  1169. switch a := _a.(type) {
  1170. case object.RecordType:
  1171. switch {
  1172. case x.Name() == a.Name():
  1173. // fmt.Println("eq")
  1174. //fmt.Println("qid ", _x.Qualident(), _a.Qualident(), "names ", x.Name(), a.Name())
  1175. return true //опасно сравнивать имена конеш
  1176. case x.Base() != nil:
  1177. // fmt.Println("go base")
  1178. return compare(x.Base(), a)
  1179. default:
  1180. return false
  1181. }
  1182. case object.PointerType:
  1183. return false
  1184. default:
  1185. halt.As(100, reflect.TypeOf(a))
  1186. }
  1187. case object.PointerType:
  1188. switch a := _a.(type) {
  1189. case object.PointerType:
  1190. switch {
  1191. case x.Name() == a.Name():
  1192. // fmt.Println("eq")
  1193. return true //опасно сравнивать имена конеш
  1194. case x.Base() != nil:
  1195. // fmt.Println("go base")
  1196. return compare(x.Base(), a)
  1197. default:
  1198. return false
  1199. }
  1200. default:
  1201. halt.As(100, reflect.TypeOf(a))
  1202. }
  1203. default:
  1204. halt.As(100, reflect.TypeOf(a))
  1205. }
  1206. panic(0)
  1207. }
  1208. switch x := a.(type) {
  1209. case *rec:
  1210. z, a := x.link.Complex().(object.RecordType)
  1211. y, b := typ.(object.RecordType)
  1212. //fmt.Println("compare", x.link.Complex(), typ, a, b, a && b && compare(z, y))
  1213. return BOOLEAN(a && b && compare(z, y))
  1214. case *ptr:
  1215. z, a := x.link.Complex().(object.PointerType)
  1216. y, b := typ.(object.PointerType)
  1217. //fmt.Println("compare", x.link.Complex(), typ, a, b, a && b && compare(z, y))
  1218. return BOOLEAN(a && b && compare(z, y))
  1219. default:
  1220. halt.As(100, reflect.TypeOf(x))
  1221. }
  1222. panic(0)
  1223. }
  1224. func (o *ops) Conv(a scope.Value, typ object.Type, comp ...object.ComplexType) scope.Value {
  1225. switch typ {
  1226. case object.INTEGER:
  1227. switch x := a.(type) {
  1228. case *data:
  1229. return o.Conv(vfrom(x), typ)
  1230. case BYTE:
  1231. return INTEGER(x)
  1232. case SET:
  1233. return INTEGER(x.bits.Int64())
  1234. case REAL:
  1235. return INTEGER(x)
  1236. case LONGINT:
  1237. return INTEGER(x)
  1238. default:
  1239. halt.As(100, reflect.TypeOf(x))
  1240. }
  1241. case object.LONGINT:
  1242. switch x := a.(type) {
  1243. case *data:
  1244. return o.Conv(vfrom(x), typ)
  1245. case INTEGER:
  1246. return LONGINT(x)
  1247. case REAL:
  1248. return LONGINT(math.Floor(float64(x)))
  1249. default:
  1250. halt.As(100, reflect.TypeOf(x))
  1251. }
  1252. case object.SET:
  1253. switch x := a.(type) {
  1254. case *data:
  1255. return o.Conv(vfrom(x), typ)
  1256. case INTEGER:
  1257. return SET{bits: big.NewInt(int64(x))}
  1258. default:
  1259. halt.As(100, reflect.TypeOf(x))
  1260. }
  1261. case object.REAL:
  1262. switch x := a.(type) {
  1263. case *data:
  1264. return o.Conv(vfrom(x), typ)
  1265. case INTEGER:
  1266. return REAL(float64(x))
  1267. default:
  1268. halt.As(100, reflect.TypeOf(x))
  1269. }
  1270. case object.CHAR:
  1271. switch x := a.(type) {
  1272. case *data:
  1273. return o.Conv(vfrom(x), typ)
  1274. case LONGINT:
  1275. return CHAR(rune(x))
  1276. case INTEGER:
  1277. return CHAR(rune(x))
  1278. default:
  1279. halt.As(100, reflect.TypeOf(x))
  1280. }
  1281. case object.NOTYPE:
  1282. assert.For(len(comp) > 0, 20)
  1283. switch t := comp[0].(type) {
  1284. case object.BasicType:
  1285. switch t.Type() {
  1286. case object.SHORTSTRING:
  1287. switch x := a.(type) {
  1288. case *dynarr:
  1289. return SHORTSTRING(x.tryString())
  1290. case *arr:
  1291. return SHORTSTRING(x.tryString())
  1292. case STRING:
  1293. return SHORTSTRING(x)
  1294. default:
  1295. halt.As(100, reflect.TypeOf(x))
  1296. }
  1297. default:
  1298. halt.As(100, t.Type())
  1299. }
  1300. default:
  1301. halt.As(100, reflect.TypeOf(t))
  1302. }
  1303. default:
  1304. halt.As(100, typ)
  1305. }
  1306. panic(100)
  1307. }
  1308. func (o *ops) Not(a scope.Value) scope.Value {
  1309. switch x := a.(type) {
  1310. case *data:
  1311. return o.Not(vfrom(x))
  1312. case BOOLEAN:
  1313. return BOOLEAN(!x)
  1314. default:
  1315. halt.As(100, reflect.TypeOf(x))
  1316. }
  1317. panic(100)
  1318. }
  1319. func (o *ops) Abs(a scope.Value) scope.Value {
  1320. switch x := a.(type) {
  1321. case *data:
  1322. return o.Abs(vfrom(x))
  1323. case INTEGER:
  1324. return INTEGER(int32(math.Abs(float64(x))))
  1325. default:
  1326. halt.As(100, reflect.TypeOf(x))
  1327. }
  1328. panic(100)
  1329. }
  1330. func (o *ops) Minus(a scope.Value) scope.Value {
  1331. switch x := a.(type) {
  1332. case *data:
  1333. return o.Minus(vfrom(x))
  1334. case INTEGER:
  1335. return INTEGER(-x)
  1336. case LONGINT:
  1337. return LONGINT(-x)
  1338. case REAL:
  1339. return REAL(-x)
  1340. default:
  1341. halt.As(100, reflect.TypeOf(x))
  1342. }
  1343. panic(100)
  1344. }
  1345. func (o *ops) Odd(a scope.Value) scope.Value {
  1346. switch x := a.(type) {
  1347. case *data:
  1348. return o.Odd(vfrom(x))
  1349. case INTEGER:
  1350. return BOOLEAN(int64(math.Abs(float64(x)))%2 == 1)
  1351. case LONGINT:
  1352. return BOOLEAN(int64(math.Abs(float64(x)))%2 == 1)
  1353. default:
  1354. halt.As(100, reflect.TypeOf(x))
  1355. }
  1356. panic(100)
  1357. }
  1358. func (o *ops) Cap(a scope.Value) scope.Value {
  1359. switch x := a.(type) {
  1360. case *data:
  1361. return o.Cap(vfrom(x))
  1362. case CHAR:
  1363. return CHAR([]rune(strings.ToUpper(string(x)))[0])
  1364. default:
  1365. halt.As(100, reflect.TypeOf(x))
  1366. }
  1367. panic(100)
  1368. }
  1369. func (o *ops) Bits(a scope.Value) scope.Value {
  1370. switch x := a.(type) {
  1371. case *data:
  1372. return o.Bits(vfrom(x))
  1373. case INTEGER:
  1374. return SET{bits: big.NewInt(0).SetBit(big.NewInt(0), int(x), 1)}
  1375. default:
  1376. halt.As(100, reflect.TypeOf(x))
  1377. }
  1378. panic(100)
  1379. }
  1380. func (o *ops) Eq(a, b scope.Value) scope.Value {
  1381. switch a.(type) {
  1382. case *data:
  1383. return o.Eq(vfrom(a), b)
  1384. default:
  1385. switch b.(type) {
  1386. case *data:
  1387. return o.Eq(a, vfrom(b))
  1388. default:
  1389. switch x := a.(type) {
  1390. case *ptr:
  1391. switch y := b.(type) {
  1392. case PTR:
  1393. assert.For(y == NIL, 40)
  1394. return BOOLEAN(x.val == nil || x.val.id == 0)
  1395. default:
  1396. panic(fmt.Sprintln(reflect.TypeOf(y)))
  1397. }
  1398. case INTEGER:
  1399. switch y := b.(type) {
  1400. case INTEGER:
  1401. return BOOLEAN(x == y)
  1402. default:
  1403. panic(fmt.Sprintln(reflect.TypeOf(y)))
  1404. }
  1405. case LONGINT:
  1406. switch y := b.(type) {
  1407. case LONGINT:
  1408. return BOOLEAN(x == y)
  1409. default:
  1410. panic(fmt.Sprintln(reflect.TypeOf(y)))
  1411. }
  1412. default:
  1413. panic(fmt.Sprintln(reflect.TypeOf(x)))
  1414. }
  1415. }
  1416. }
  1417. panic(0)
  1418. }
  1419. func (o *ops) Neq(a, b scope.Value) scope.Value {
  1420. switch i := a.(type) {
  1421. case *data:
  1422. return o.Neq(vfrom(a), b)
  1423. case *idx:
  1424. return o.Neq(vfrom(i.Get()), b)
  1425. default:
  1426. switch b.(type) {
  1427. case *data:
  1428. return o.Neq(a, vfrom(b))
  1429. default:
  1430. switch x := a.(type) {
  1431. case *ptr:
  1432. switch y := b.(type) {
  1433. case PTR:
  1434. assert.For(y == NIL, 40)
  1435. return BOOLEAN(x.val != nil && x.val.id != 0)
  1436. default:
  1437. panic(fmt.Sprintln(reflect.TypeOf(y)))
  1438. }
  1439. case INTEGER:
  1440. switch y := b.(type) {
  1441. case INTEGER:
  1442. return BOOLEAN(x != y)
  1443. default:
  1444. panic(fmt.Sprintln(reflect.TypeOf(y)))
  1445. }
  1446. case REAL:
  1447. switch y := b.(type) {
  1448. case REAL:
  1449. return BOOLEAN(x != y)
  1450. default:
  1451. panic(fmt.Sprintln(reflect.TypeOf(y)))
  1452. }
  1453. case LONGINT:
  1454. switch y := b.(type) {
  1455. case LONGINT:
  1456. return BOOLEAN(x != y)
  1457. default:
  1458. panic(fmt.Sprintln(reflect.TypeOf(y)))
  1459. }
  1460. case SET:
  1461. switch y := b.(type) {
  1462. case SET:
  1463. return BOOLEAN(x.bits.Cmp(y.bits) != 0)
  1464. default:
  1465. panic(fmt.Sprintln(reflect.TypeOf(y)))
  1466. }
  1467. case BOOLEAN:
  1468. switch y := b.(type) {
  1469. case BOOLEAN:
  1470. return BOOLEAN(x != y)
  1471. default:
  1472. panic(fmt.Sprintln(reflect.TypeOf(y)))
  1473. }
  1474. case CHAR:
  1475. switch y := b.(type) {
  1476. case CHAR:
  1477. return BOOLEAN(x != y)
  1478. default:
  1479. panic(fmt.Sprintln(reflect.TypeOf(y)))
  1480. }
  1481. default:
  1482. panic(fmt.Sprintln(reflect.TypeOf(x)))
  1483. }
  1484. }
  1485. }
  1486. panic(0)
  1487. }
  1488. func (o *ops) Lss(a, b scope.Value) scope.Value {
  1489. switch a.(type) {
  1490. case *data:
  1491. return o.Lss(vfrom(a), b)
  1492. default:
  1493. switch b.(type) {
  1494. case *data:
  1495. return o.Lss(a, vfrom(b))
  1496. default:
  1497. switch x := a.(type) {
  1498. case INTEGER:
  1499. switch y := b.(type) {
  1500. case INTEGER:
  1501. return BOOLEAN(x < y)
  1502. default:
  1503. panic(fmt.Sprintln(reflect.TypeOf(y)))
  1504. }
  1505. case REAL:
  1506. switch y := b.(type) {
  1507. case REAL:
  1508. return BOOLEAN(x < y)
  1509. default:
  1510. panic(fmt.Sprintln(reflect.TypeOf(y)))
  1511. }
  1512. case LONGINT:
  1513. switch y := b.(type) {
  1514. case LONGINT:
  1515. return BOOLEAN(x < y)
  1516. default:
  1517. panic(fmt.Sprintln(reflect.TypeOf(y)))
  1518. }
  1519. default:
  1520. panic(fmt.Sprintln(reflect.TypeOf(x)))
  1521. }
  1522. }
  1523. }
  1524. panic(0)
  1525. }
  1526. func (o *ops) Gtr(a, b scope.Value) scope.Value {
  1527. switch a.(type) {
  1528. case *data:
  1529. return o.Gtr(vfrom(a), b)
  1530. default:
  1531. switch b.(type) {
  1532. case *data:
  1533. return o.Gtr(a, vfrom(b))
  1534. default:
  1535. switch x := a.(type) {
  1536. case INTEGER:
  1537. switch y := b.(type) {
  1538. case INTEGER:
  1539. return BOOLEAN(x > y)
  1540. default:
  1541. panic(fmt.Sprintln(reflect.TypeOf(y)))
  1542. }
  1543. case STRING:
  1544. switch y := b.(type) {
  1545. case STRING:
  1546. //fmt.Println(x, y, x > y)
  1547. return BOOLEAN(x > y)
  1548. default:
  1549. panic(fmt.Sprintln(reflect.TypeOf(y)))
  1550. }
  1551. case REAL:
  1552. switch y := b.(type) {
  1553. case REAL:
  1554. return BOOLEAN(x > y)
  1555. default:
  1556. panic(fmt.Sprintln(reflect.TypeOf(y)))
  1557. }
  1558. case LONGINT:
  1559. switch y := b.(type) {
  1560. case LONGINT:
  1561. return BOOLEAN(x > y)
  1562. default:
  1563. panic(fmt.Sprintln(reflect.TypeOf(y)))
  1564. }
  1565. default:
  1566. panic(fmt.Sprintln(reflect.TypeOf(x)))
  1567. }
  1568. }
  1569. }
  1570. panic(0)
  1571. }
  1572. func (o *ops) Leq(a, b scope.Value) scope.Value {
  1573. switch a.(type) {
  1574. case *data:
  1575. return o.Leq(vfrom(a), b)
  1576. default:
  1577. switch b.(type) {
  1578. case *data:
  1579. return o.Leq(a, vfrom(b))
  1580. default:
  1581. switch x := a.(type) {
  1582. case INTEGER:
  1583. switch y := b.(type) {
  1584. case INTEGER:
  1585. return BOOLEAN(x <= y)
  1586. default:
  1587. panic(fmt.Sprintln(reflect.TypeOf(y)))
  1588. }
  1589. default:
  1590. panic(fmt.Sprintln(reflect.TypeOf(x)))
  1591. }
  1592. }
  1593. }
  1594. panic(0)
  1595. }
  1596. func (o *ops) Geq(a, b scope.Value) scope.Value {
  1597. switch a.(type) {
  1598. case *data:
  1599. return o.Geq(vfrom(a), b)
  1600. default:
  1601. switch b.(type) {
  1602. case *data:
  1603. return o.Geq(a, vfrom(b))
  1604. default:
  1605. switch x := a.(type) {
  1606. case INTEGER:
  1607. switch y := b.(type) {
  1608. case INTEGER:
  1609. return BOOLEAN(x >= y)
  1610. default:
  1611. panic(fmt.Sprintln(reflect.TypeOf(y)))
  1612. }
  1613. case REAL:
  1614. switch y := b.(type) {
  1615. case REAL:
  1616. return BOOLEAN(x >= y)
  1617. default:
  1618. panic(fmt.Sprintln(reflect.TypeOf(y)))
  1619. }
  1620. default:
  1621. panic(fmt.Sprintln(reflect.TypeOf(x)))
  1622. }
  1623. }
  1624. }
  1625. panic(0)
  1626. }
  1627. func (o *ops) TypeOf(x scope.Value) (object.Type, object.ComplexType) {
  1628. switch v := x.(type) {
  1629. case *ptr:
  1630. if v.val != nil {
  1631. return v.val.link.Type(), v.val.link.Complex()
  1632. }
  1633. case *rec:
  1634. return v.link.Type(), v.link.Complex()
  1635. case *dynarr:
  1636. return v.link.Type(), v.link.Complex()
  1637. case *arr:
  1638. return v.link.Type(), v.link.Complex()
  1639. case *data:
  1640. return v.link.Type(), v.link.Complex()
  1641. default:
  1642. halt.As(100, reflect.TypeOf(v))
  1643. }
  1644. return object.NOTYPE, nil
  1645. }
  1646. func init() {
  1647. scope.ValueFrom = vfrom
  1648. scope.GoTypeFrom = gfrom
  1649. scope.TypeFromGo = fromg
  1650. scope.Ops = &ops{}
  1651. }