Skip to content

Commit 53d6b80

Browse files
committed
Merge branch 'master' of github.com:uwu-tech/kind
2 parents c9ba1b4 + 80e7323 commit 53d6b80

File tree

4 files changed

+252
-141
lines changed

4 files changed

+252
-141
lines changed

base/User/rigille/Tiger.kind

+81-80
Original file line numberDiff line numberDiff line change
@@ -1,91 +1,92 @@
11
// i'm studying compilers using "modern compiler implementation in ML" by Andrew Appel
22
// 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.
45

5-
// straight-line programs
6+
// position on source code, to produce error messages
7+
User.rigille.Tiger.pos: Type
8+
Pair<Nat, Nat>
69

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
1312

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)
2017
}
2118

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+
)
2525
}
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+
)
3286
}
3387

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+
}
6890

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+
}

base/User/rigille/Tiger/SL.kind

+87
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,87 @@
1+
// straight-line programs Type and (very inefficient) interpreter
2+
// statement
3+
type User.rigille.Tiger.SL.Stm {
4+
CompoundStm(fst: User.rigille.Tiger.SL.Stm, snd: User.rigille.Tiger.SL.Stm)
5+
AssignStm(id: String, exp: User.rigille.Tiger.SL.Exp)
6+
PrintStm(exp_list: List<User.rigille.Tiger.SL.Exp>)
7+
}
8+
9+
// expression
10+
type User.rigille.Tiger.SL.Exp {
11+
IdExp(id: String)
12+
NumExp(num: Int) // #TODO include other numbers?
13+
OpExp(op: User.rigille.Tiger.SL.Binop, fst: User.rigille.Tiger.SL.Exp, snd: User.rigille.Tiger.SL.Exp)
14+
EseqExp(stm: User.rigille.Tiger.SL.Stm, exp: User.rigille.Tiger.SL.Exp)
15+
}
16+
17+
type User.rigille.Tiger.SL.ExpList {
18+
PairExpList(head: User.rigille.Tiger.SL.Exp, tail: User.rigille.Tiger.SL.ExpList)
19+
LastExpList(head: User.rigille.Tiger.SL.Exp)
20+
}
21+
22+
type User.rigille.Tiger.SL.Binop {
23+
plus
24+
minus
25+
times
26+
div
27+
}
28+
29+
maxargs(stm: User.rigille.Tiger.SL.Stm): Nat
30+
case stm {
31+
CompoundStm: Nat.max(maxargs(stm.fst), maxargs(stm.snd))
32+
AssignStm: 0
33+
PrintStm: List.length!(stm.exp_list)
34+
}
35+
36+
User.rigille.Tiger.SL.interpStm(stm: User.rigille.Tiger.SL.Stm, table: List<Pair<String, Int>>): List<Pair<String, Int>>
37+
case stm {
38+
CompoundStm:
39+
let new_table = User.rigille.Tiger.SL.interpStm(stm.fst, table)
40+
User.rigille.Tiger.SL.interpStm(stm.snd, new_table)
41+
AssignStm:
42+
let {i, new_table} = User.rigille.Tiger.SL.interpExp(stm.exp, table)
43+
{stm.id, i} & new_table
44+
PrintStm:
45+
for exp in stm.exp_list with table:
46+
let {i, table} = User.rigille.Tiger.SL.interpExp(exp, table)
47+
log(Int.show(i))
48+
table
49+
table
50+
}
51+
52+
User.rigille.Tiger.SL.lookup(id: String, table: List<Pair<String, Int>>): Int
53+
case table {
54+
nil:
55+
0 :: Int
56+
cons:
57+
let {table_id, val} = table.head
58+
if id =? table_id then
59+
val
60+
else
61+
User.rigille.Tiger.SL.lookup(id, table.tail)
62+
}
63+
64+
User.rigille.Tiger.SL.interpExp(exp: User.rigille.Tiger.SL.Exp, table: List<Pair<String, Int>>): Pair<Int, List<Pair<String, Int>>>
65+
case exp {
66+
IdExp:
67+
{User.rigille.Tiger.SL.lookup(exp.id, table), table}
68+
NumExp:
69+
{exp.num, table}
70+
OpExp:
71+
let {fst_val, table} = User.rigille.Tiger.SL.interpExp(exp.fst, table)
72+
let {snd_val, table} = User.rigille.Tiger.SL.interpExp(exp.snd, table)
73+
case exp.op {
74+
plus:
75+
{fst_val + snd_val, table}
76+
minus:
77+
{fst_val - snd_val, table}
78+
times:
79+
{fst_val * snd_val, table}
80+
div:
81+
{fst_val / snd_val, table}
82+
}
83+
EseqExp:
84+
let table = User.rigille.Tiger.SL.interpStm(exp.stm, table)
85+
User.rigille.Tiger.SL.interpExp(exp.exp, table)
86+
}
87+

0 commit comments

Comments
 (0)