|
1 | 1 | // i'm studying compilers using "modern compiler implementation in ML" by Andrew Appel
|
2 | 2 | // translating to Kind as I go. i'm not too worried about following the book too closely.
|
3 |
| -// for example i'll likely use `Parser` to parse programs instead of Lex and Yacc |
| 3 | +// for example i'll likely use kind's `Parser` to parse programs instead of Lex and Yacc. |
| 4 | +// but i'm using ML's naming conventions. it looks ugly but makes lookups easier. |
4 | 5 |
|
5 |
| -// straight-line programs |
| 6 | +// position on source code, to produce error messages |
| 7 | +User.rigille.Tiger.pos: Type |
| 8 | + Pair<Nat, Nat> |
6 | 9 |
|
7 |
| -// statement |
8 |
| -type Stm { |
9 |
| - CompoundStm(fst: Stm, snd: Stm) |
10 |
| - AssignStm(id: String, exp: Exp) |
11 |
| - PrintStm(exp_list: List<Exp>) |
12 |
| -} |
| 10 | +User.rigille.Tiger.symbol: Type |
| 11 | + String |
13 | 12 |
|
14 |
| -// expression |
15 |
| -type Exp { |
16 |
| - IdExp(id: String) |
17 |
| - NumExp(num: Int) // #TODO include other numbers? |
18 |
| - OpExp(op: Binop, fst: Exp, snd: Exp) |
19 |
| - EseqExp(stm: Stm, exp: Exp) |
| 13 | +type User.rigille.Tiger.var { |
| 14 | + SimpleVar(name: User.rigille.Tiger.symbol, pos: User.rigille.Tiger.pos) |
| 15 | + FieldVar(var: User.rigille.Tiger.var, name: User.rigille.Tiger.symbol, pos: User.rigille.Tiger.pos) |
| 16 | + SubscriptVar(var: User.rigille.Tiger.var, exp: User.rigille.Tiger.exp, pos: User.rigille.Tiger.pos) |
20 | 17 | }
|
21 | 18 |
|
22 |
| -type ExpList { |
23 |
| - PairExpList(head: Exp, tail: ExpList) |
24 |
| - LastExpList(head: Exp) |
| 19 | +type User.rigille.Tiger.record_fields { |
| 20 | + new( |
| 21 | + name: User.rigille.Tiger.symbol |
| 22 | + args: List<User.rigille.Tiger.exp> |
| 23 | + pos: User.rigille.Tiger.pos |
| 24 | + ) |
25 | 25 | }
|
26 |
| - |
27 |
| -type Binop { |
28 |
| - plus |
29 |
| - minus |
30 |
| - times |
31 |
| - div |
| 26 | +type User.rigille.Tiger.exp { |
| 27 | + NilExp |
| 28 | + VarExp(var: User.rigille.Tiger.var) |
| 29 | + IntExp(val: Int) |
| 30 | + StringExp(val: String, pos: User.rigille.Tiger.pos) |
| 31 | + CallExp( |
| 32 | + func: User.rigille.Tiger.symbol |
| 33 | + args: List<User.rigille.Tiger.exp> |
| 34 | + pos: User.rigille.Tiger.pos |
| 35 | + ) |
| 36 | + OpExp( |
| 37 | + left: User.rigille.Tiger.exp |
| 38 | + oper: User.rigille.Tiger.oper |
| 39 | + right: User.rigille.Tiger.exp |
| 40 | + pos: User.rigille.Tiger.pos |
| 41 | + ) |
| 42 | + RecordExp( |
| 43 | + fields: List<User.rigille.Tiger.record_fields> |
| 44 | + typ: User.rigille.Tiger.symbol |
| 45 | + pos: User.rigille.Tiger.pos |
| 46 | + ) |
| 47 | + SeqExp( |
| 48 | + val: List<User.rigille.Tiger.exp> |
| 49 | + ) |
| 50 | + AssignExp( |
| 51 | + var: User.rigille.Tiger.var |
| 52 | + exp: User.rigille.Tiger.exp |
| 53 | + pos: User.rigille.Tiger.pos |
| 54 | + ) |
| 55 | + IfExp( |
| 56 | + test: User.rigille.Tiger.exp |
| 57 | + then: User.rigille.Tiger.exp |
| 58 | + else: Maybe<User.rigille.Tiger.exp> |
| 59 | + ) |
| 60 | + WhileExp( |
| 61 | + test: User.rigille.Tiger.exp |
| 62 | + body: User.rigille.Tiger.exp |
| 63 | + pos: User.rigille.Tiger.pos |
| 64 | + ) |
| 65 | + ForExp( |
| 66 | + var: User.rigille.Tiger.symbol |
| 67 | + escape: Bool |
| 68 | + lo: User.rigille.Tiger.exp |
| 69 | + hi: User.rigille.Tiger.exp |
| 70 | + body: User.rigille.Tiger.exp |
| 71 | + pos: User.rigille.Tiger.pos |
| 72 | + ) |
| 73 | + BreakExp( |
| 74 | + pos: User.rigille.Tiger.pos |
| 75 | + ) |
| 76 | + LetExp( |
| 77 | + decs: List<User.rigille.Tiger.dec> |
| 78 | + body: User.rigille.Tiger.exp |
| 79 | + pos: User.rigille.Tiger.pos |
| 80 | + ) |
| 81 | + ArrayExp( |
| 82 | + typ: User.rigille.Tiger.symbol |
| 83 | + size: User.rigille.Tiger.exp |
| 84 | + pos: User.rigille.Tiger.pos |
| 85 | + ) |
32 | 86 | }
|
33 | 87 |
|
34 |
| -maxargs(stm: Stm): Nat |
35 |
| - case stm { |
36 |
| - CompoundStm: Nat.max(maxargs(stm.fst), maxargs(stm.snd)) |
37 |
| - AssignStm: 0 |
38 |
| - PrintStm: List.length!(stm.exp_list) |
39 |
| - } |
40 |
| - |
41 |
| -interpStm(stm: Stm, table: List<Pair<String, Int>>): List<Pair<String, Int>> |
42 |
| - case stm { |
43 |
| - CompoundStm: |
44 |
| - let new_table = interpStm(stm.fst, table) |
45 |
| - interpStm(stm.snd, new_table) |
46 |
| - AssignStm: |
47 |
| - let {i, new_table} = interpExp(stm.exp, table) |
48 |
| - {stm.id, i} & new_table |
49 |
| - PrintStm: |
50 |
| - for exp in stm.exp_list with table: |
51 |
| - let {i, new_table} = interpExp(exp, table) |
52 |
| - log(Int.show(i)) |
53 |
| - new_table |
54 |
| - table |
55 |
| - } |
56 |
| - |
57 |
| -lookup(id: String, table: List<Pair<String, Int>>): Int |
58 |
| - case table { |
59 |
| - nil: |
60 |
| - 0 :: Int |
61 |
| - cons: |
62 |
| - let {table_id, val} = table.head |
63 |
| - if id =? table_id then |
64 |
| - val |
65 |
| - else |
66 |
| - lookup(id, table.tail) |
67 |
| - } |
| 88 | +type User.rigille.Tiger.oper { |
| 89 | +} |
68 | 90 |
|
69 |
| -interpExp(exp: Exp, table: List<Pair<String, Int>>): Pair<Int, List<Pair<String, Int>>> |
70 |
| - case exp { |
71 |
| - IdExp: |
72 |
| - {lookup(exp.id, table), table} |
73 |
| - NumExp: |
74 |
| - {exp.num, table} |
75 |
| - OpExp: |
76 |
| - let {fst_val, table} = interpExp(exp.fst, table) |
77 |
| - let {snd_val, table} = interpExp(exp.snd, table) |
78 |
| - case exp.op { |
79 |
| - plus: |
80 |
| - {fst_val + snd_val, table} |
81 |
| - minus: |
82 |
| - {fst_val - snd_val, table} |
83 |
| - times: |
84 |
| - {fst_val * snd_val, table} |
85 |
| - div: |
86 |
| - {fst_val / snd_val, table} |
87 |
| - } |
88 |
| - EseqExp: |
89 |
| - let table = interpStm(exp.stm, table) |
90 |
| - interpExp(exp.exp, table) |
91 |
| - } |
| 91 | +type User.rigille.Tiger.dec { |
| 92 | +} |
0 commit comments