val.go 35 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659166016611662166316641665166616671668166916701671167216731674167516761677167816791680168116821683168416851686168716881689169016911692169316941695169616971698169917001701170217031704170517061707170817091710171117121713171417151716171717181719172017211722172317241725172617271728
  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. return true //опасно сравнивать имена конеш
  1175. case x.BaseType() != nil:
  1176. // fmt.Println("go base")
  1177. return compare(x.BaseType(), a)
  1178. default:
  1179. return false
  1180. }
  1181. default:
  1182. halt.As(100, reflect.TypeOf(a))
  1183. }
  1184. case object.PointerType:
  1185. switch a := _a.(type) {
  1186. case object.PointerType:
  1187. switch {
  1188. case x.Name() == a.Name():
  1189. // fmt.Println("eq")
  1190. return true //опасно сравнивать имена конеш
  1191. case x.Base() != nil:
  1192. // fmt.Println("go base")
  1193. return compare(x.Base(), a)
  1194. default:
  1195. return false
  1196. }
  1197. default:
  1198. halt.As(100, reflect.TypeOf(a))
  1199. }
  1200. default:
  1201. halt.As(100, reflect.TypeOf(a))
  1202. }
  1203. panic(0)
  1204. }
  1205. switch x := a.(type) {
  1206. case *rec:
  1207. z, a := x.link.Complex().(object.RecordType)
  1208. y, b := typ.(object.RecordType)
  1209. //fmt.Println("compare", x.link.Complex(), typ, a, b, a && b && compare(z, y))
  1210. return BOOLEAN(a && b && compare(z, y))
  1211. case *ptr:
  1212. z, a := x.link.Complex().(object.PointerType)
  1213. y, b := typ.(object.PointerType)
  1214. //fmt.Println("compare", x.link.Complex(), typ, a, b, a && b && compare(z, y))
  1215. return BOOLEAN(a && b && compare(z, y))
  1216. default:
  1217. halt.As(100, reflect.TypeOf(x))
  1218. }
  1219. panic(0)
  1220. }
  1221. func (o *ops) Conv(a scope.Value, typ object.Type, comp ...object.ComplexType) scope.Value {
  1222. switch typ {
  1223. case object.INTEGER:
  1224. switch x := a.(type) {
  1225. case *data:
  1226. return o.Conv(vfrom(x), typ)
  1227. case BYTE:
  1228. return INTEGER(x)
  1229. case SET:
  1230. return INTEGER(x.bits.Int64())
  1231. case REAL:
  1232. return INTEGER(x)
  1233. case LONGINT:
  1234. return INTEGER(x)
  1235. default:
  1236. halt.As(100, reflect.TypeOf(x))
  1237. }
  1238. case object.LONGINT:
  1239. switch x := a.(type) {
  1240. case *data:
  1241. return o.Conv(vfrom(x), typ)
  1242. case INTEGER:
  1243. return LONGINT(x)
  1244. case REAL:
  1245. return LONGINT(math.Floor(float64(x)))
  1246. default:
  1247. halt.As(100, reflect.TypeOf(x))
  1248. }
  1249. case object.SET:
  1250. switch x := a.(type) {
  1251. case *data:
  1252. return o.Conv(vfrom(x), typ)
  1253. case INTEGER:
  1254. return SET{bits: big.NewInt(int64(x))}
  1255. default:
  1256. halt.As(100, reflect.TypeOf(x))
  1257. }
  1258. case object.REAL:
  1259. switch x := a.(type) {
  1260. case *data:
  1261. return o.Conv(vfrom(x), typ)
  1262. case INTEGER:
  1263. return REAL(float64(x))
  1264. default:
  1265. halt.As(100, reflect.TypeOf(x))
  1266. }
  1267. case object.CHAR:
  1268. switch x := a.(type) {
  1269. case *data:
  1270. return o.Conv(vfrom(x), typ)
  1271. case LONGINT:
  1272. return CHAR(rune(x))
  1273. case INTEGER:
  1274. return CHAR(rune(x))
  1275. default:
  1276. halt.As(100, reflect.TypeOf(x))
  1277. }
  1278. case object.NOTYPE:
  1279. assert.For(len(comp) > 0, 20)
  1280. switch t := comp[0].(type) {
  1281. case object.BasicType:
  1282. switch t.Type() {
  1283. case object.SHORTSTRING:
  1284. switch x := a.(type) {
  1285. case *dynarr:
  1286. return SHORTSTRING(x.tryString())
  1287. case *arr:
  1288. return SHORTSTRING(x.tryString())
  1289. case STRING:
  1290. return SHORTSTRING(x)
  1291. default:
  1292. halt.As(100, reflect.TypeOf(x))
  1293. }
  1294. default:
  1295. halt.As(100, t.Type())
  1296. }
  1297. default:
  1298. halt.As(100, reflect.TypeOf(t))
  1299. }
  1300. default:
  1301. halt.As(100, typ)
  1302. }
  1303. panic(100)
  1304. }
  1305. func (o *ops) Not(a scope.Value) scope.Value {
  1306. switch x := a.(type) {
  1307. case *data:
  1308. return o.Not(vfrom(x))
  1309. case BOOLEAN:
  1310. return BOOLEAN(!x)
  1311. default:
  1312. halt.As(100, reflect.TypeOf(x))
  1313. }
  1314. panic(100)
  1315. }
  1316. func (o *ops) Abs(a scope.Value) scope.Value {
  1317. switch x := a.(type) {
  1318. case *data:
  1319. return o.Abs(vfrom(x))
  1320. case INTEGER:
  1321. return INTEGER(int32(math.Abs(float64(x))))
  1322. default:
  1323. halt.As(100, reflect.TypeOf(x))
  1324. }
  1325. panic(100)
  1326. }
  1327. func (o *ops) Minus(a scope.Value) scope.Value {
  1328. switch x := a.(type) {
  1329. case *data:
  1330. return o.Minus(vfrom(x))
  1331. case INTEGER:
  1332. return INTEGER(-x)
  1333. case LONGINT:
  1334. return LONGINT(-x)
  1335. case REAL:
  1336. return REAL(-x)
  1337. default:
  1338. halt.As(100, reflect.TypeOf(x))
  1339. }
  1340. panic(100)
  1341. }
  1342. func (o *ops) Odd(a scope.Value) scope.Value {
  1343. switch x := a.(type) {
  1344. case *data:
  1345. return o.Odd(vfrom(x))
  1346. case INTEGER:
  1347. return BOOLEAN(int64(math.Abs(float64(x)))%2 == 1)
  1348. case LONGINT:
  1349. return BOOLEAN(int64(math.Abs(float64(x)))%2 == 1)
  1350. default:
  1351. halt.As(100, reflect.TypeOf(x))
  1352. }
  1353. panic(100)
  1354. }
  1355. func (o *ops) Cap(a scope.Value) scope.Value {
  1356. switch x := a.(type) {
  1357. case *data:
  1358. return o.Cap(vfrom(x))
  1359. case CHAR:
  1360. return CHAR([]rune(strings.ToUpper(string(x)))[0])
  1361. default:
  1362. halt.As(100, reflect.TypeOf(x))
  1363. }
  1364. panic(100)
  1365. }
  1366. func (o *ops) Bits(a scope.Value) scope.Value {
  1367. switch x := a.(type) {
  1368. case *data:
  1369. return o.Bits(vfrom(x))
  1370. case INTEGER:
  1371. return SET{bits: big.NewInt(0).SetBit(big.NewInt(0), int(x), 1)}
  1372. default:
  1373. halt.As(100, reflect.TypeOf(x))
  1374. }
  1375. panic(100)
  1376. }
  1377. func (o *ops) Eq(a, b scope.Value) scope.Value {
  1378. switch a.(type) {
  1379. case *data:
  1380. return o.Eq(vfrom(a), b)
  1381. default:
  1382. switch b.(type) {
  1383. case *data:
  1384. return o.Eq(a, vfrom(b))
  1385. default:
  1386. switch x := a.(type) {
  1387. case *ptr:
  1388. switch y := b.(type) {
  1389. case PTR:
  1390. assert.For(y == NIL, 40)
  1391. return BOOLEAN(x.val == nil || x.val.id == 0)
  1392. default:
  1393. panic(fmt.Sprintln(reflect.TypeOf(y)))
  1394. }
  1395. case INTEGER:
  1396. switch y := b.(type) {
  1397. case INTEGER:
  1398. return BOOLEAN(x == y)
  1399. default:
  1400. panic(fmt.Sprintln(reflect.TypeOf(y)))
  1401. }
  1402. case LONGINT:
  1403. switch y := b.(type) {
  1404. case LONGINT:
  1405. return BOOLEAN(x == y)
  1406. default:
  1407. panic(fmt.Sprintln(reflect.TypeOf(y)))
  1408. }
  1409. default:
  1410. panic(fmt.Sprintln(reflect.TypeOf(x)))
  1411. }
  1412. }
  1413. }
  1414. panic(0)
  1415. }
  1416. func (o *ops) Neq(a, b scope.Value) scope.Value {
  1417. switch i := a.(type) {
  1418. case *data:
  1419. return o.Neq(vfrom(a), b)
  1420. case *idx:
  1421. return o.Neq(vfrom(i.Get()), b)
  1422. default:
  1423. switch b.(type) {
  1424. case *data:
  1425. return o.Neq(a, vfrom(b))
  1426. default:
  1427. switch x := a.(type) {
  1428. case *ptr:
  1429. switch y := b.(type) {
  1430. case PTR:
  1431. assert.For(y == NIL, 40)
  1432. return BOOLEAN(x.val != nil && x.val.id != 0)
  1433. default:
  1434. panic(fmt.Sprintln(reflect.TypeOf(y)))
  1435. }
  1436. case INTEGER:
  1437. switch y := b.(type) {
  1438. case INTEGER:
  1439. return BOOLEAN(x != y)
  1440. default:
  1441. panic(fmt.Sprintln(reflect.TypeOf(y)))
  1442. }
  1443. case REAL:
  1444. switch y := b.(type) {
  1445. case REAL:
  1446. return BOOLEAN(x != y)
  1447. default:
  1448. panic(fmt.Sprintln(reflect.TypeOf(y)))
  1449. }
  1450. case LONGINT:
  1451. switch y := b.(type) {
  1452. case LONGINT:
  1453. return BOOLEAN(x != y)
  1454. default:
  1455. panic(fmt.Sprintln(reflect.TypeOf(y)))
  1456. }
  1457. case SET:
  1458. switch y := b.(type) {
  1459. case SET:
  1460. return BOOLEAN(x.bits.Cmp(y.bits) != 0)
  1461. default:
  1462. panic(fmt.Sprintln(reflect.TypeOf(y)))
  1463. }
  1464. case BOOLEAN:
  1465. switch y := b.(type) {
  1466. case BOOLEAN:
  1467. return BOOLEAN(x != y)
  1468. default:
  1469. panic(fmt.Sprintln(reflect.TypeOf(y)))
  1470. }
  1471. case CHAR:
  1472. switch y := b.(type) {
  1473. case CHAR:
  1474. return BOOLEAN(x != y)
  1475. default:
  1476. panic(fmt.Sprintln(reflect.TypeOf(y)))
  1477. }
  1478. default:
  1479. panic(fmt.Sprintln(reflect.TypeOf(x)))
  1480. }
  1481. }
  1482. }
  1483. panic(0)
  1484. }
  1485. func (o *ops) Lss(a, b scope.Value) scope.Value {
  1486. switch a.(type) {
  1487. case *data:
  1488. return o.Lss(vfrom(a), b)
  1489. default:
  1490. switch b.(type) {
  1491. case *data:
  1492. return o.Lss(a, vfrom(b))
  1493. default:
  1494. switch x := a.(type) {
  1495. case INTEGER:
  1496. switch y := b.(type) {
  1497. case INTEGER:
  1498. return BOOLEAN(x < y)
  1499. default:
  1500. panic(fmt.Sprintln(reflect.TypeOf(y)))
  1501. }
  1502. case REAL:
  1503. switch y := b.(type) {
  1504. case REAL:
  1505. return BOOLEAN(x < y)
  1506. default:
  1507. panic(fmt.Sprintln(reflect.TypeOf(y)))
  1508. }
  1509. case LONGINT:
  1510. switch y := b.(type) {
  1511. case LONGINT:
  1512. return BOOLEAN(x < y)
  1513. default:
  1514. panic(fmt.Sprintln(reflect.TypeOf(y)))
  1515. }
  1516. default:
  1517. panic(fmt.Sprintln(reflect.TypeOf(x)))
  1518. }
  1519. }
  1520. }
  1521. panic(0)
  1522. }
  1523. func (o *ops) Gtr(a, b scope.Value) scope.Value {
  1524. switch a.(type) {
  1525. case *data:
  1526. return o.Gtr(vfrom(a), b)
  1527. default:
  1528. switch b.(type) {
  1529. case *data:
  1530. return o.Gtr(a, vfrom(b))
  1531. default:
  1532. switch x := a.(type) {
  1533. case INTEGER:
  1534. switch y := b.(type) {
  1535. case INTEGER:
  1536. return BOOLEAN(x > y)
  1537. default:
  1538. panic(fmt.Sprintln(reflect.TypeOf(y)))
  1539. }
  1540. case STRING:
  1541. switch y := b.(type) {
  1542. case STRING:
  1543. //fmt.Println(x, y, x > y)
  1544. return BOOLEAN(x > y)
  1545. default:
  1546. panic(fmt.Sprintln(reflect.TypeOf(y)))
  1547. }
  1548. case REAL:
  1549. switch y := b.(type) {
  1550. case REAL:
  1551. return BOOLEAN(x > y)
  1552. default:
  1553. panic(fmt.Sprintln(reflect.TypeOf(y)))
  1554. }
  1555. case LONGINT:
  1556. switch y := b.(type) {
  1557. case LONGINT:
  1558. return BOOLEAN(x > y)
  1559. default:
  1560. panic(fmt.Sprintln(reflect.TypeOf(y)))
  1561. }
  1562. default:
  1563. panic(fmt.Sprintln(reflect.TypeOf(x)))
  1564. }
  1565. }
  1566. }
  1567. panic(0)
  1568. }
  1569. func (o *ops) Leq(a, b scope.Value) scope.Value {
  1570. switch a.(type) {
  1571. case *data:
  1572. return o.Leq(vfrom(a), b)
  1573. default:
  1574. switch b.(type) {
  1575. case *data:
  1576. return o.Leq(a, vfrom(b))
  1577. default:
  1578. switch x := a.(type) {
  1579. case INTEGER:
  1580. switch y := b.(type) {
  1581. case INTEGER:
  1582. return BOOLEAN(x <= y)
  1583. default:
  1584. panic(fmt.Sprintln(reflect.TypeOf(y)))
  1585. }
  1586. default:
  1587. panic(fmt.Sprintln(reflect.TypeOf(x)))
  1588. }
  1589. }
  1590. }
  1591. panic(0)
  1592. }
  1593. func (o *ops) Geq(a, b scope.Value) scope.Value {
  1594. switch a.(type) {
  1595. case *data:
  1596. return o.Geq(vfrom(a), b)
  1597. default:
  1598. switch b.(type) {
  1599. case *data:
  1600. return o.Geq(a, vfrom(b))
  1601. default:
  1602. switch x := a.(type) {
  1603. case INTEGER:
  1604. switch y := b.(type) {
  1605. case INTEGER:
  1606. return BOOLEAN(x >= y)
  1607. default:
  1608. panic(fmt.Sprintln(reflect.TypeOf(y)))
  1609. }
  1610. case REAL:
  1611. switch y := b.(type) {
  1612. case REAL:
  1613. return BOOLEAN(x >= y)
  1614. default:
  1615. panic(fmt.Sprintln(reflect.TypeOf(y)))
  1616. }
  1617. default:
  1618. panic(fmt.Sprintln(reflect.TypeOf(x)))
  1619. }
  1620. }
  1621. }
  1622. panic(0)
  1623. }
  1624. func (o *ops) TypeOf(x scope.Value) (object.Type, object.ComplexType) {
  1625. switch v := x.(type) {
  1626. case *ptr:
  1627. if v.val != nil {
  1628. return v.val.link.Type(), v.val.link.Complex()
  1629. }
  1630. case *rec:
  1631. return v.link.Type(), v.link.Complex()
  1632. case *dynarr:
  1633. return v.link.Type(), v.link.Complex()
  1634. case *arr:
  1635. return v.link.Type(), v.link.Complex()
  1636. case *data:
  1637. return v.link.Type(), v.link.Complex()
  1638. default:
  1639. halt.As(100, reflect.TypeOf(v))
  1640. }
  1641. return object.NOTYPE, nil
  1642. }
  1643. func init() {
  1644. scope.ValueFrom = vfrom
  1645. scope.GoTypeFrom = gfrom
  1646. scope.TypeFromGo = fromg
  1647. scope.Ops = &ops{}
  1648. }