codecin 5.4.2__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (54) hide show
  1. codecin/__init__.py +27 -0
  2. codecin/aot.py +229 -0
  3. codecin/assembler.py +548 -0
  4. codecin/cache.py +71 -0
  5. codecin/cin.py +2558 -0
  6. codecin/cli.py +282 -0
  7. codecin/config.py +58 -0
  8. codecin/console.py +183 -0
  9. codecin/cpu.py +1654 -0
  10. codecin/crom.py +222 -0
  11. codecin/debugger.py +659 -0
  12. codecin/disasm.py +86 -0
  13. codecin/errors.py +58 -0
  14. codecin/isa.py +457 -0
  15. codecin/jit.py +270 -0
  16. codecin/libcodecin_native.so +0 -0
  17. codecin/logger.py +145 -0
  18. codecin/memory.py +348 -0
  19. codecin/native/aot/aot.go +70 -0
  20. codecin/native/aot/build.go +219 -0
  21. codecin/native/aot/stub_main.go.txt +22 -0
  22. codecin/native/build.ps1 +33 -0
  23. codecin/native/build.sh +48 -0
  24. codecin/native/cmd/codecin/main.go +287 -0
  25. codecin/native/compiler/codegen.go +1938 -0
  26. codecin/native/compiler/compile_test.go +164 -0
  27. codecin/native/compiler/parser.go +1071 -0
  28. codecin/native/compiler/syscalls.go +86 -0
  29. codecin/native/compiler/tokenizer.go +336 -0
  30. codecin/native/compiler/types.go +213 -0
  31. codecin/native/engine/audio.go +152 -0
  32. codecin/native/engine/audio_other.go +46 -0
  33. codecin/native/engine/audio_windows.go +43 -0
  34. codecin/native/engine/canvas.go +271 -0
  35. codecin/native/engine/crom.go +86 -0
  36. codecin/native/engine/encode.go +93 -0
  37. codecin/native/engine/engine_test.go +198 -0
  38. codecin/native/engine/isa_gen.go +445 -0
  39. codecin/native/engine/system.go +190 -0
  40. codecin/native/engine/termux.go +113 -0
  41. codecin/native/engine/version_gen.go +7 -0
  42. codecin/native/engine/vm.go +1157 -0
  43. codecin/native/go.mod +3 -0
  44. codecin/native/ir/ir.go +48 -0
  45. codecin/native/main.go +225 -0
  46. codecin/native.py +336 -0
  47. codecin/registers.py +130 -0
  48. codecin/stats.py +235 -0
  49. codecin-5.4.2.dist-info/METADATA +985 -0
  50. codecin-5.4.2.dist-info/RECORD +54 -0
  51. codecin-5.4.2.dist-info/WHEEL +5 -0
  52. codecin-5.4.2.dist-info/entry_points.txt +2 -0
  53. codecin-5.4.2.dist-info/licenses/LICENSE +7 -0
  54. codecin-5.4.2.dist-info/top_level.txt +1 -0
@@ -0,0 +1,1071 @@
1
+ package compiler
2
+
3
+ import (
4
+ "fmt"
5
+ "strconv"
6
+ )
7
+
8
+ // ---------------- 语法分析 ----------------
9
+
10
+ type parser struct {
11
+ toks []Token
12
+ pos int
13
+ filename string
14
+ }
15
+
16
+ func (p *parser) peek() Token {
17
+ return p.toks[p.pos]
18
+ }
19
+
20
+ func (p *parser) peekN(k int) Token {
21
+ idx := p.pos + k
22
+ if idx >= len(p.toks) {
23
+ idx = len(p.toks) - 1
24
+ }
25
+ return p.toks[idx]
26
+ }
27
+
28
+ func (p *parser) next() Token {
29
+ t := p.toks[p.pos]
30
+ p.pos++
31
+ return t
32
+ }
33
+
34
+ func (p *parser) accept(kind string) bool {
35
+ if p.peek().kind == kind {
36
+ p.next()
37
+ return true
38
+ }
39
+ return false
40
+ }
41
+
42
+ func (p *parser) expect(kind string) (Token, error) {
43
+ t := p.peek()
44
+ if t.kind != kind {
45
+ return t, fmt.Errorf("Expected %s but got %s (%q) at %s", kind, t.kind, t.sval, p.loc())
46
+ }
47
+ return p.next(), nil
48
+ }
49
+
50
+ func (p *parser) skipNL() {
51
+ for p.accept("NL") {
52
+ }
53
+ }
54
+
55
+ func (p *parser) loc() string {
56
+ t := p.peek()
57
+ if t.filename != "" {
58
+ return fmt.Sprintf("%s:%d", t.filename, t.line)
59
+ }
60
+ if p.filename != "" {
61
+ return fmt.Sprintf("%s:%d", p.filename, t.line)
62
+ }
63
+ return fmt.Sprintf("<cin>:%d", t.line)
64
+ }
65
+
66
+ // ---------------- 类型 ----------------
67
+
68
+ func typeKindFromName(name string) TypeKind {
69
+ switch name {
70
+ case "float":
71
+ return kFloat
72
+ case "bool":
73
+ return kBool
74
+ case "string":
75
+ return kString
76
+ case "void":
77
+ return kVoid
78
+ default:
79
+ return kInt
80
+ }
81
+ }
82
+
83
+ func (p *parser) parseType() (*Type, error) {
84
+ t, err := p.expect("IDENT")
85
+ if err != nil {
86
+ return nil, err
87
+ }
88
+ base := t.sval
89
+ var ty *Type
90
+ switch {
91
+ case base == "unsigned":
92
+ if p.peek().kind == "IDENT" {
93
+ nv := p.peek().sval
94
+ if nv == "char" || nv == "short" || nv == "int" || nv == "long" {
95
+ p.next()
96
+ }
97
+ }
98
+ ty = scalarT(kInt)
99
+ case base == "int" || base == "float" || base == "bool" || base == "string" || base == "void":
100
+ ty = scalarT(typeKindFromName(base))
101
+ case base == "char" || base == "short" || base == "long":
102
+ ty = scalarT(kInt)
103
+ default:
104
+ ty = &Type{Kind: kStruct, Name: base}
105
+ }
106
+ for p.peek().kind == "LBRACKET" && p.peekN(1).kind == "RBRACKET" {
107
+ p.next()
108
+ p.next()
109
+ ty = &Type{Kind: kPtrArray, Elem: ty}
110
+ }
111
+ return ty, nil
112
+ }
113
+
114
+ func (p *parser) isDeclStart() bool {
115
+ t := p.peek()
116
+ if t.kind != "IDENT" {
117
+ return false
118
+ }
119
+ v := t.sval
120
+ if baseTypeWords[v] {
121
+ return true
122
+ }
123
+ return !keywords[v] && p.peekN(1).kind == "IDENT"
124
+ }
125
+
126
+ func (p *parser) parseDims() ([]int, error) {
127
+ var dims []int
128
+ for p.peek().kind == "LBRACKET" {
129
+ p.next()
130
+ num := 0
131
+ if p.peek().kind == "NUMBER" {
132
+ num = int(p.next().ival)
133
+ }
134
+ if _, err := p.expect("RBRACKET"); err != nil {
135
+ return nil, err
136
+ }
137
+ dims = append(dims, num)
138
+ }
139
+ return dims, nil
140
+ }
141
+
142
+ // ---------------- 程序 ----------------
143
+
144
+ func (p *parser) parseProgram() (map[string]*StructDef, []*GlobalVar, map[string]*FuncDef, []string, error) {
145
+ structs := map[string]*StructDef{}
146
+ var globals []*GlobalVar
147
+ functions := map[string]*FuncDef{}
148
+ var funcOrder []string
149
+
150
+ p.skipNL()
151
+ for p.peek().kind != "EOF" {
152
+ if p.peek().kind == "IDENT" && p.peek().sval == "struct" {
153
+ if err := p.parseStruct(structs); err != nil {
154
+ return nil, nil, nil, nil, err
155
+ }
156
+ } else if p.peek().kind == "IDENT" && p.peek().sval == "function" {
157
+ f, err := p.parseFunction()
158
+ if err != nil {
159
+ return nil, nil, nil, nil, err
160
+ }
161
+ functions[f.name] = f
162
+ funcOrder = append(funcOrder, f.name)
163
+ } else {
164
+ gs, err := p.parseGlobal()
165
+ if err != nil {
166
+ return nil, nil, nil, nil, err
167
+ }
168
+ globals = append(globals, gs...)
169
+ }
170
+ p.skipNL()
171
+ }
172
+ return structs, globals, functions, funcOrder, nil
173
+ }
174
+
175
+ func (p *parser) parseStruct(structs map[string]*StructDef) error {
176
+ p.next() // struct
177
+ nameT, err := p.expect("IDENT")
178
+ if err != nil {
179
+ return err
180
+ }
181
+ if _, err := p.expect("LBRACE"); err != nil {
182
+ return err
183
+ }
184
+ p.skipNL()
185
+ sd := &StructDef{name: nameT.sval, offsets: map[string]int{}}
186
+ off := 0
187
+ for p.peek().kind != "RBRACE" {
188
+ ftype, err := p.parseType()
189
+ if err != nil {
190
+ return err
191
+ }
192
+ fname, err := p.expect("IDENT")
193
+ if err != nil {
194
+ return err
195
+ }
196
+ dims, err := p.parseDims()
197
+ if err != nil {
198
+ return err
199
+ }
200
+ t := ftype
201
+ for i := len(dims) - 1; i >= 0; i-- {
202
+ d := dims[i]
203
+ if d != 0 {
204
+ t = &Type{Kind: kArray, Elem: t, Size: d}
205
+ } else {
206
+ t = &Type{Kind: kPtrArray, Elem: t}
207
+ }
208
+ }
209
+ sd.fields = append(sd.fields, fieldDef{name: fname.sval, t: t})
210
+ sd.offsets[fname.sval] = off
211
+ off += typeSlots(t)
212
+ p.accept("SEMI")
213
+ p.skipNL()
214
+ }
215
+ if _, err := p.expect("RBRACE"); err != nil {
216
+ return err
217
+ }
218
+ sd.sizeSlots = off
219
+ structs[nameT.sval] = sd
220
+ p.accept("SEMI")
221
+ return nil
222
+ }
223
+
224
+ func (p *parser) parseFunction() (*FuncDef, error) {
225
+ line := p.next().line // function
226
+ nameT, err := p.expect("IDENT")
227
+ if err != nil {
228
+ return nil, err
229
+ }
230
+ if _, err := p.expect("LPAREN"); err != nil {
231
+ return nil, err
232
+ }
233
+ var params []paramDef
234
+ for p.peek().kind != "RPAREN" {
235
+ ptype, err := p.parseType()
236
+ if err != nil {
237
+ return nil, err
238
+ }
239
+ pname, err := p.expect("IDENT")
240
+ if err != nil {
241
+ return nil, err
242
+ }
243
+ dims, err := p.parseDims()
244
+ if err != nil {
245
+ return nil, err
246
+ }
247
+ for i := len(dims) - 1; i >= 0; i-- {
248
+ d := dims[i]
249
+ if d != 0 {
250
+ ptype = &Type{Kind: kArray, Elem: ptype, Size: d}
251
+ } else {
252
+ ptype = &Type{Kind: kPtrArray, Elem: ptype}
253
+ }
254
+ }
255
+ params = append(params, paramDef{name: pname.sval, t: ptype})
256
+ if !p.accept("COMMA") {
257
+ break
258
+ }
259
+ }
260
+ if _, err := p.expect("RPAREN"); err != nil {
261
+ return nil, err
262
+ }
263
+ retType := scalarT(kVoid)
264
+ if p.accept("ARROW") {
265
+ retType, err = p.parseType()
266
+ if err != nil {
267
+ return nil, err
268
+ }
269
+ }
270
+ if _, err := p.expect("LBRACE"); err != nil {
271
+ return nil, err
272
+ }
273
+ body, err := p.parseBlockBody()
274
+ if err != nil {
275
+ return nil, err
276
+ }
277
+ if _, err := p.expect("RBRACE"); err != nil {
278
+ return nil, err
279
+ }
280
+ return &FuncDef{name: nameT.sval, params: params, retType: retType, body: body, line: line}, nil
281
+ }
282
+
283
+ func (p *parser) parseGlobal() ([]*GlobalVar, error) {
284
+ vtype, err := p.parseType()
285
+ if err != nil {
286
+ return nil, err
287
+ }
288
+ var gs []*GlobalVar
289
+ for {
290
+ name, err := p.expect("IDENT")
291
+ if err != nil {
292
+ return nil, err
293
+ }
294
+ dims, err := p.parseDims()
295
+ if err != nil {
296
+ return nil, err
297
+ }
298
+ t := vtype
299
+ for i := len(dims) - 1; i >= 0; i-- {
300
+ d := dims[i]
301
+ if d != 0 {
302
+ t = &Type{Kind: kArray, Elem: t, Size: d}
303
+ } else {
304
+ t = &Type{Kind: kPtrArray, Elem: t}
305
+ }
306
+ }
307
+ gv := &GlobalVar{name: name.sval, t: t}
308
+ if p.accept("ASSIGN") {
309
+ if p.peek().kind == "LBRACE" {
310
+ gv.arrayLit, err = p.parseArrayLiteral()
311
+ if err != nil {
312
+ return nil, err
313
+ }
314
+ } else {
315
+ gv.init, err = p.parseExpr()
316
+ if err != nil {
317
+ return nil, err
318
+ }
319
+ }
320
+ }
321
+ gs = append(gs, gv)
322
+ if !p.accept("COMMA") {
323
+ break
324
+ }
325
+ }
326
+ p.accept("SEMI")
327
+ return gs, nil
328
+ }
329
+
330
+ func (p *parser) parseArrayLiteral() (*Node, error) {
331
+ if _, err := p.expect("LBRACE"); err != nil {
332
+ return nil, err
333
+ }
334
+ var rows [][]*Node
335
+ var current []*Node
336
+ for p.peek().kind != "RBRACE" {
337
+ if p.peek().kind == "LBRACE" {
338
+ p.next()
339
+ var inner []*Node
340
+ for p.peek().kind != "RBRACE" {
341
+ e, err := p.parseExpr()
342
+ if err != nil {
343
+ return nil, err
344
+ }
345
+ inner = append(inner, e)
346
+ if !p.accept("COMMA") {
347
+ break
348
+ }
349
+ }
350
+ if _, err := p.expect("RBRACE"); err != nil {
351
+ return nil, err
352
+ }
353
+ rows = append(rows, inner)
354
+ } else {
355
+ e, err := p.parseExpr()
356
+ if err != nil {
357
+ return nil, err
358
+ }
359
+ current = append(current, e)
360
+ }
361
+ if !p.accept("COMMA") {
362
+ break
363
+ }
364
+ }
365
+ if _, err := p.expect("RBRACE"); err != nil {
366
+ return nil, err
367
+ }
368
+ if len(rows) > 0 {
369
+ return &Node{Kind: "arraylit", ArrayLit: rows, Is2D: true}, nil
370
+ }
371
+ return &Node{Kind: "arraylit", ArrayLit: [][]*Node{current}, Is2D: false}, nil
372
+ }
373
+
374
+ // ---------------- 语句 ----------------
375
+
376
+ func (p *parser) parseBlockBody() ([]*Node, error) {
377
+ var stmts []*Node
378
+ p.skipNL()
379
+ for p.peek().kind != "RBRACE" && p.peek().kind != "EOF" {
380
+ s, err := p.parseStmt()
381
+ if err != nil {
382
+ return nil, err
383
+ }
384
+ stmts = append(stmts, s)
385
+ p.skipNL()
386
+ }
387
+ return stmts, nil
388
+ }
389
+
390
+ var cpuStmtWords = map[string]bool{
391
+ "set": true, "add": true, "subtract": true, "multiply": true,
392
+ "divide": true, "increment": true, "decrement": true,
393
+ }
394
+
395
+ func (p *parser) parseStmt() (*Node, error) {
396
+ t := p.peek()
397
+ switch {
398
+ case t.kind == "LBRACE":
399
+ p.next()
400
+ body, err := p.parseBlockBody()
401
+ if err != nil {
402
+ return nil, err
403
+ }
404
+ if _, err := p.expect("RBRACE"); err != nil {
405
+ return nil, err
406
+ }
407
+ return &Node{Kind: "block", List: body}, nil
408
+ case t.kind == "IDENT" && t.sval == "assert":
409
+ return p.parseAssert()
410
+ case t.kind == "IDENT" && t.sval == "return":
411
+ p.next()
412
+ var expr *Node
413
+ var err error
414
+ if p.peek().kind != "NL" && p.peek().kind != "SEMI" && p.peek().kind != "RBRACE" {
415
+ expr, err = p.parseExpr()
416
+ if err != nil {
417
+ return nil, err
418
+ }
419
+ }
420
+ p.accept("SEMI")
421
+ return &Node{Kind: "return", A: expr}, nil
422
+ case t.kind == "IDENT" && t.sval == "if":
423
+ return p.parseIf()
424
+ case t.kind == "IDENT" && t.sval == "while":
425
+ p.next()
426
+ cond, err := p.parseParenExpr()
427
+ if err != nil {
428
+ return nil, err
429
+ }
430
+ body, err := p.parseStmt()
431
+ if err != nil {
432
+ return nil, err
433
+ }
434
+ return &Node{Kind: "while", A: cond, B: body}, nil
435
+ case t.kind == "IDENT" && t.sval == "for":
436
+ return p.parseFor()
437
+ case t.kind == "IDENT" && t.sval == "do":
438
+ return p.parseDo()
439
+ case t.kind == "IDENT" && t.sval == "switch":
440
+ return p.parseSwitch()
441
+ case t.kind == "IDENT" && t.sval == "break":
442
+ p.next()
443
+ p.accept("SEMI")
444
+ return &Node{Kind: "break"}, nil
445
+ case t.kind == "IDENT" && t.sval == "continue":
446
+ p.next()
447
+ p.accept("SEMI")
448
+ return &Node{Kind: "continue"}, nil
449
+ case p.isDeclStart():
450
+ return p.parseDecl(false)
451
+ case t.kind == "IDENT" && cpuStmtWords[t.sval]:
452
+ return p.parseCpuStmt()
453
+ default:
454
+ expr, err := p.parseAssign()
455
+ if err != nil {
456
+ return nil, err
457
+ }
458
+ p.accept("SEMI")
459
+ return &Node{Kind: "expr", A: expr}, nil
460
+ }
461
+ }
462
+
463
+ func (p *parser) parseAssign() (*Node, error) {
464
+ target, err := p.parseExpr()
465
+ if err != nil {
466
+ return nil, err
467
+ }
468
+ t := p.peek()
469
+ if t.kind == "ASSIGN" {
470
+ p.next()
471
+ value, err := p.parseAssign()
472
+ if err != nil {
473
+ return nil, err
474
+ }
475
+ return &Node{Kind: "binop", Op: "=", A: target, B: value}, nil
476
+ }
477
+ if op, ok := compoundAssign[t.kind]; ok {
478
+ p.next()
479
+ value, err := p.parseAssign()
480
+ if err != nil {
481
+ return nil, err
482
+ }
483
+ return &Node{Kind: "binop", Op: op, A: target, B: value}, nil
484
+ }
485
+ return target, nil
486
+ }
487
+
488
+ func (p *parser) parseDo() (*Node, error) {
489
+ p.next() // do
490
+ body, err := p.parseStmt()
491
+ if err != nil {
492
+ return nil, err
493
+ }
494
+ p.skipNL()
495
+ if !(p.peek().kind == "IDENT" && p.peek().sval == "while") {
496
+ return nil, fmt.Errorf("Expected 'while' after do body at %s", p.loc())
497
+ }
498
+ p.next()
499
+ cond, err := p.parseParenExpr()
500
+ if err != nil {
501
+ return nil, err
502
+ }
503
+ p.accept("SEMI")
504
+ return &Node{Kind: "dowhile", A: body, B: cond}, nil
505
+ }
506
+
507
+ func (p *parser) parseSwitch() (*Node, error) {
508
+ p.next() // switch
509
+ cond, err := p.parseParenExpr()
510
+ if err != nil {
511
+ return nil, err
512
+ }
513
+ if _, err := p.expect("LBRACE"); err != nil {
514
+ return nil, err
515
+ }
516
+ p.skipNL()
517
+ var branches []*Node
518
+ var cur *Node
519
+ for p.peek().kind != "RBRACE" && p.peek().kind != "EOF" {
520
+ p.skipNL()
521
+ t := p.peek()
522
+ if t.kind == "IDENT" && t.sval == "case" {
523
+ if cur != nil {
524
+ branches = append(branches, cur)
525
+ }
526
+ p.next()
527
+ constExpr, err := p.parseExpr()
528
+ if err != nil {
529
+ return nil, err
530
+ }
531
+ if _, err := p.expect("COLON"); err != nil {
532
+ return nil, err
533
+ }
534
+ cur = &Node{Kind: "case", A: constExpr}
535
+ } else if t.kind == "IDENT" && t.sval == "default" {
536
+ if cur != nil {
537
+ branches = append(branches, cur)
538
+ }
539
+ p.next()
540
+ if _, err := p.expect("COLON"); err != nil {
541
+ return nil, err
542
+ }
543
+ cur = &Node{Kind: "case"}
544
+ } else {
545
+ if cur == nil {
546
+ return nil, fmt.Errorf("Statement before first case in switch at %s", p.loc())
547
+ }
548
+ s, err := p.parseStmt()
549
+ if err != nil {
550
+ return nil, err
551
+ }
552
+ cur.List = append(cur.List, s)
553
+ }
554
+ p.skipNL()
555
+ }
556
+ if cur != nil {
557
+ branches = append(branches, cur)
558
+ }
559
+ if _, err := p.expect("RBRACE"); err != nil {
560
+ return nil, err
561
+ }
562
+ if len(branches) == 0 {
563
+ return nil, fmt.Errorf("Empty switch at %s", p.loc())
564
+ }
565
+ return &Node{Kind: "switch", A: cond, List: branches}, nil
566
+ }
567
+
568
+ func (p *parser) parseAssert() (*Node, error) {
569
+ tok := p.peek()
570
+ p.next() // assert
571
+ if _, err := p.expect("LPAREN"); err != nil {
572
+ return nil, err
573
+ }
574
+ cond, err := p.parseExpr()
575
+ if err != nil {
576
+ return nil, err
577
+ }
578
+ var msg *Node
579
+ if p.accept("COMMA") {
580
+ msg, err = p.parseExpr()
581
+ if err != nil {
582
+ return nil, err
583
+ }
584
+ }
585
+ if _, err := p.expect("RPAREN"); err != nil {
586
+ return nil, err
587
+ }
588
+ p.accept("SEMI")
589
+ return &Node{Kind: "assert", A: cond, B: msg, Int: tok.line, Filename: tok.filename}, nil
590
+ }
591
+
592
+ func (p *parser) parseIf() (*Node, error) {
593
+ p.next() // if
594
+ cond, err := p.parseParenExpr()
595
+ if err != nil {
596
+ return nil, err
597
+ }
598
+ thenBody, err := p.parseStmt()
599
+ if err != nil {
600
+ return nil, err
601
+ }
602
+ var elseBody *Node
603
+ p.skipNL()
604
+ if p.peek().kind == "IDENT" && p.peek().sval == "else" {
605
+ p.next()
606
+ p.skipNL()
607
+ elseBody, err = p.parseStmt()
608
+ if err != nil {
609
+ return nil, err
610
+ }
611
+ }
612
+ return &Node{Kind: "if", A: cond, B: thenBody, C: elseBody}, nil
613
+ }
614
+
615
+ func (p *parser) parseFor() (*Node, error) {
616
+ p.next() // for
617
+ if _, err := p.expect("LPAREN"); err != nil {
618
+ return nil, err
619
+ }
620
+ var init *Node
621
+ if p.peek().kind != "SEMI" {
622
+ if p.isDeclStart() {
623
+ init, _ = p.parseDecl(true)
624
+ } else {
625
+ e, err := p.parseExpr()
626
+ if err != nil {
627
+ return nil, err
628
+ }
629
+ init = &Node{Kind: "expr", A: e}
630
+ }
631
+ }
632
+ if _, err := p.expect("SEMI"); err != nil {
633
+ return nil, err
634
+ }
635
+ var cond *Node
636
+ if p.peek().kind != "SEMI" {
637
+ var err error
638
+ cond, err = p.parseExpr()
639
+ if err != nil {
640
+ return nil, err
641
+ }
642
+ }
643
+ if _, err := p.expect("SEMI"); err != nil {
644
+ return nil, err
645
+ }
646
+ var update *Node
647
+ if p.peek().kind != "RPAREN" {
648
+ e, err := p.parseAssign()
649
+ if err != nil {
650
+ return nil, err
651
+ }
652
+ update = &Node{Kind: "expr", A: e}
653
+ }
654
+ if _, err := p.expect("RPAREN"); err != nil {
655
+ return nil, err
656
+ }
657
+ body, err := p.parseStmt()
658
+ if err != nil {
659
+ return nil, err
660
+ }
661
+ return &Node{Kind: "for", A: init, B: cond, C: update, D: body}, nil
662
+ }
663
+
664
+ func (p *parser) parseDecl(noSemi bool) (*Node, error) {
665
+ vtype, err := p.parseType()
666
+ if err != nil {
667
+ return nil, err
668
+ }
669
+ var items []*Node
670
+ for {
671
+ name, err := p.expect("IDENT")
672
+ if err != nil {
673
+ return nil, err
674
+ }
675
+ dims, err := p.parseDims()
676
+ if err != nil {
677
+ return nil, err
678
+ }
679
+ t := vtype
680
+ for i := len(dims) - 1; i >= 0; i-- {
681
+ d := dims[i]
682
+ if d != 0 {
683
+ t = &Type{Kind: kArray, Elem: t, Size: d}
684
+ } else {
685
+ t = &Type{Kind: kPtrArray, Elem: t}
686
+ }
687
+ }
688
+ var init, arrayLit *Node
689
+ if p.accept("ASSIGN") {
690
+ if p.peek().kind == "LBRACE" {
691
+ arrayLit, err = p.parseArrayLiteral()
692
+ if err != nil {
693
+ return nil, err
694
+ }
695
+ } else {
696
+ init, err = p.parseExpr()
697
+ if err != nil {
698
+ return nil, err
699
+ }
700
+ }
701
+ }
702
+ items = append(items, &Node{Kind: "declitem", Name: name.sval, Type: t, A: init, B: arrayLit})
703
+ if !p.accept("COMMA") {
704
+ break
705
+ }
706
+ }
707
+ if !noSemi {
708
+ p.accept("SEMI")
709
+ }
710
+ return &Node{Kind: "decl", List: items}, nil
711
+ }
712
+
713
+ func (p *parser) parseCpuStmt() (*Node, error) {
714
+ op := p.next().sval
715
+ var operands [][2]string
716
+ for p.peek().kind != "NL" && p.peek().kind != "SEMI" && p.peek().kind != "EOF" {
717
+ tok := p.next()
718
+ val := tok.sval
719
+ if tok.kind == "NUMBER" {
720
+ val = strconv.FormatInt(tok.ival, 10)
721
+ } else if tok.kind == "FLOAT" {
722
+ val = strconv.FormatFloat(tok.fval, 'g', -1, 64)
723
+ }
724
+ operands = append(operands, [2]string{tok.kind, val})
725
+ }
726
+ p.accept("SEMI")
727
+ return &Node{Kind: "cpu", Name: op, Operands: operands}, nil
728
+ }
729
+
730
+ func (p *parser) parseParenExpr() (*Node, error) {
731
+ if _, err := p.expect("LPAREN"); err != nil {
732
+ return nil, err
733
+ }
734
+ e, err := p.parseExpr()
735
+ if err != nil {
736
+ return nil, err
737
+ }
738
+ if _, err := p.expect("RPAREN"); err != nil {
739
+ return nil, err
740
+ }
741
+ return e, nil
742
+ }
743
+
744
+ // ---------------- 表达式 ----------------
745
+
746
+ func (p *parser) parseExpr() (*Node, error) {
747
+ e, err := p.parseOr()
748
+ if err != nil {
749
+ return nil, err
750
+ }
751
+ if p.accept("QUESTION") {
752
+ a, err := p.parseAssign()
753
+ if err != nil {
754
+ return nil, err
755
+ }
756
+ if _, err := p.expect("COLON"); err != nil {
757
+ return nil, err
758
+ }
759
+ b, err := p.parseAssign()
760
+ if err != nil {
761
+ return nil, err
762
+ }
763
+ return &Node{Kind: "cond", A: e, B: a, C: b}, nil
764
+ }
765
+ return e, nil
766
+ }
767
+
768
+ func (p *parser) parseOr() (*Node, error) {
769
+ left, err := p.parseAnd()
770
+ if err != nil {
771
+ return nil, err
772
+ }
773
+ for p.peek().kind == "OR" {
774
+ p.next()
775
+ right, err := p.parseAnd()
776
+ if err != nil {
777
+ return nil, err
778
+ }
779
+ left = &Node{Kind: "binop", Op: "||", A: left, B: right}
780
+ }
781
+ return left, nil
782
+ }
783
+
784
+ func (p *parser) parseAnd() (*Node, error) {
785
+ left, err := p.parseBitOr()
786
+ if err != nil {
787
+ return nil, err
788
+ }
789
+ for p.peek().kind == "AND" {
790
+ p.next()
791
+ right, err := p.parseBitOr()
792
+ if err != nil {
793
+ return nil, err
794
+ }
795
+ left = &Node{Kind: "binop", Op: "&&", A: left, B: right}
796
+ }
797
+ return left, nil
798
+ }
799
+
800
+ func (p *parser) parseBitOr() (*Node, error) {
801
+ left, err := p.parseBitXor()
802
+ if err != nil {
803
+ return nil, err
804
+ }
805
+ for p.peek().kind == "PIPE" {
806
+ p.next()
807
+ right, err := p.parseBitXor()
808
+ if err != nil {
809
+ return nil, err
810
+ }
811
+ left = &Node{Kind: "binop", Op: "|", A: left, B: right}
812
+ }
813
+ return left, nil
814
+ }
815
+
816
+ func (p *parser) parseBitXor() (*Node, error) {
817
+ left, err := p.parseBitAnd()
818
+ if err != nil {
819
+ return nil, err
820
+ }
821
+ for p.peek().kind == "CARET" {
822
+ p.next()
823
+ right, err := p.parseBitAnd()
824
+ if err != nil {
825
+ return nil, err
826
+ }
827
+ left = &Node{Kind: "binop", Op: "^", A: left, B: right}
828
+ }
829
+ return left, nil
830
+ }
831
+
832
+ func (p *parser) parseBitAnd() (*Node, error) {
833
+ left, err := p.parseEquality()
834
+ if err != nil {
835
+ return nil, err
836
+ }
837
+ for p.peek().kind == "AMP" {
838
+ p.next()
839
+ right, err := p.parseEquality()
840
+ if err != nil {
841
+ return nil, err
842
+ }
843
+ left = &Node{Kind: "binop", Op: "&", A: left, B: right}
844
+ }
845
+ return left, nil
846
+ }
847
+
848
+ func (p *parser) parseEquality() (*Node, error) {
849
+ left, err := p.parseRelational()
850
+ if err != nil {
851
+ return nil, err
852
+ }
853
+ for p.peek().kind == "EQ" || p.peek().kind == "NEQ" {
854
+ op := "=="
855
+ if p.next().kind == "NEQ" {
856
+ op = "!="
857
+ }
858
+ right, err := p.parseRelational()
859
+ if err != nil {
860
+ return nil, err
861
+ }
862
+ left = &Node{Kind: "binop", Op: op, A: left, B: right}
863
+ }
864
+ return left, nil
865
+ }
866
+
867
+ func (p *parser) parseRelational() (*Node, error) {
868
+ left, err := p.parseShift()
869
+ if err != nil {
870
+ return nil, err
871
+ }
872
+ opMap := map[string]string{"LT": "<", "GT": ">", "LE": "<=", "GE": ">="}
873
+ for {
874
+ op, ok := opMap[p.peek().kind]
875
+ if !ok {
876
+ break
877
+ }
878
+ p.next()
879
+ right, err := p.parseShift()
880
+ if err != nil {
881
+ return nil, err
882
+ }
883
+ left = &Node{Kind: "binop", Op: op, A: left, B: right}
884
+ }
885
+ return left, nil
886
+ }
887
+
888
+ func (p *parser) parseShift() (*Node, error) {
889
+ left, err := p.parseAdditive()
890
+ if err != nil {
891
+ return nil, err
892
+ }
893
+ for p.peek().kind == "SHL" || p.peek().kind == "SHR" {
894
+ op := "<<"
895
+ if p.next().kind == "SHR" {
896
+ op = ">>"
897
+ }
898
+ right, err := p.parseAdditive()
899
+ if err != nil {
900
+ return nil, err
901
+ }
902
+ left = &Node{Kind: "binop", Op: op, A: left, B: right}
903
+ }
904
+ return left, nil
905
+ }
906
+
907
+ func (p *parser) parseAdditive() (*Node, error) {
908
+ left, err := p.parseMultiplicative()
909
+ if err != nil {
910
+ return nil, err
911
+ }
912
+ for p.peek().kind == "PLUS" || p.peek().kind == "MINUS" {
913
+ op := "+"
914
+ if p.next().kind == "MINUS" {
915
+ op = "-"
916
+ }
917
+ right, err := p.parseMultiplicative()
918
+ if err != nil {
919
+ return nil, err
920
+ }
921
+ left = &Node{Kind: "binop", Op: op, A: left, B: right}
922
+ }
923
+ return left, nil
924
+ }
925
+
926
+ func (p *parser) parseMultiplicative() (*Node, error) {
927
+ left, err := p.parseUnary()
928
+ if err != nil {
929
+ return nil, err
930
+ }
931
+ opMap := map[string]string{"STAR": "*", "SLASH": "/", "PERCENT": "%"}
932
+ for {
933
+ op, ok := opMap[p.peek().kind]
934
+ if !ok {
935
+ break
936
+ }
937
+ p.next()
938
+ right, err := p.parseUnary()
939
+ if err != nil {
940
+ return nil, err
941
+ }
942
+ left = &Node{Kind: "binop", Op: op, A: left, B: right}
943
+ }
944
+ return left, nil
945
+ }
946
+
947
+ func (p *parser) parseUnary() (*Node, error) {
948
+ switch p.peek().kind {
949
+ case "BANG":
950
+ p.next()
951
+ x, err := p.parseUnary()
952
+ if err != nil {
953
+ return nil, err
954
+ }
955
+ return &Node{Kind: "not", A: x}, nil
956
+ case "TILDE":
957
+ p.next()
958
+ x, err := p.parseUnary()
959
+ if err != nil {
960
+ return nil, err
961
+ }
962
+ return &Node{Kind: "bitnot", A: x}, nil
963
+ case "MINUS":
964
+ p.next()
965
+ x, err := p.parseUnary()
966
+ if err != nil {
967
+ return nil, err
968
+ }
969
+ return &Node{Kind: "neg", A: x}, nil
970
+ case "INC":
971
+ p.next()
972
+ x, err := p.parseUnary()
973
+ if err != nil {
974
+ return nil, err
975
+ }
976
+ return &Node{Kind: "preinc", A: x}, nil
977
+ case "DEC":
978
+ p.next()
979
+ x, err := p.parseUnary()
980
+ if err != nil {
981
+ return nil, err
982
+ }
983
+ return &Node{Kind: "predec", A: x}, nil
984
+ }
985
+ return p.parsePostfix()
986
+ }
987
+
988
+ func (p *parser) parsePostfix() (*Node, error) {
989
+ e, err := p.parsePrimary()
990
+ if err != nil {
991
+ return nil, err
992
+ }
993
+ for {
994
+ switch p.peek().kind {
995
+ case "LBRACKET":
996
+ p.next()
997
+ idx, err := p.parseExpr()
998
+ if err != nil {
999
+ return nil, err
1000
+ }
1001
+ if _, err := p.expect("RBRACKET"); err != nil {
1002
+ return nil, err
1003
+ }
1004
+ e = &Node{Kind: "index", A: e, B: idx}
1005
+ case "DOT":
1006
+ p.next()
1007
+ name, err := p.expect("IDENT")
1008
+ if err != nil {
1009
+ return nil, err
1010
+ }
1011
+ e = &Node{Kind: "member", A: e, Name: name.sval}
1012
+ case "INC":
1013
+ p.next()
1014
+ e = &Node{Kind: "postinc", A: e}
1015
+ case "DEC":
1016
+ p.next()
1017
+ e = &Node{Kind: "postdec", A: e}
1018
+ default:
1019
+ return e, nil
1020
+ }
1021
+ }
1022
+ }
1023
+
1024
+ func (p *parser) parsePrimary() (*Node, error) {
1025
+ t := p.peek()
1026
+ switch t.kind {
1027
+ case "NUMBER":
1028
+ p.next()
1029
+ return &Node{Kind: "num", Ival: t.ival}, nil
1030
+ case "FLOAT":
1031
+ p.next()
1032
+ return &Node{Kind: "num", Num: t.fval, IsFloat: true}, nil
1033
+ case "STRING":
1034
+ p.next()
1035
+ return &Node{Kind: "str", Str: t.sval}, nil
1036
+ case "IDENT":
1037
+ if t.sval == "true" {
1038
+ p.next()
1039
+ return &Node{Kind: "bool", Bool: true}, nil
1040
+ }
1041
+ if t.sval == "false" {
1042
+ p.next()
1043
+ return &Node{Kind: "bool", Bool: false}, nil
1044
+ }
1045
+ case "LPAREN":
1046
+ return p.parseParenExpr()
1047
+ }
1048
+ if t.kind == "IDENT" {
1049
+ name := p.next().sval
1050
+ if p.peek().kind == "LPAREN" {
1051
+ p.next()
1052
+ var args []*Node
1053
+ for p.peek().kind != "RPAREN" {
1054
+ a, err := p.parseExpr()
1055
+ if err != nil {
1056
+ return nil, err
1057
+ }
1058
+ args = append(args, a)
1059
+ if !p.accept("COMMA") {
1060
+ break
1061
+ }
1062
+ }
1063
+ if _, err := p.expect("RPAREN"); err != nil {
1064
+ return nil, err
1065
+ }
1066
+ return &Node{Kind: "call", Name: name, List: args}, nil
1067
+ }
1068
+ return &Node{Kind: "var", Name: name}, nil
1069
+ }
1070
+ return nil, fmt.Errorf("Unexpected token %s (%q) at %s", t.kind, t.sval, p.loc())
1071
+ }