Skip to content

Commit d6fc1f5

Browse files
committed
Start implementing types
1 parent 44ea149 commit d6fc1f5

File tree

6 files changed

+920
-37
lines changed

6 files changed

+920
-37
lines changed

doc/razbor.makam

Lines changed: 182 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,182 @@
1+
path: type.
2+
mkpath: (Modules: list string) (Data: list string) -> path.
3+
4+
endinanness: type.
5+
big_endian: endinanness.
6+
little_endian: endinanness.
7+
8+
rel_expr: type.
9+
rel_hole: rel_expr.
10+
rel_sizeof: rel_expr.
11+
rel_int: int -> rel_expr.
12+
rel_ref: path -> rel_expr.
13+
14+
rel: type.
15+
rel_lt: rel_expr -> rel_expr -> rel.
16+
rel_le: rel_expr -> rel_expr -> rel.
17+
rel_eq: rel_expr -> rel_expr -> rel.
18+
rel_ge: rel_expr -> rel_expr -> rel.
19+
rel_gt: rel_expr -> rel_expr -> rel.
20+
21+
value: type.
22+
value_bool: bool -> value.
23+
value_int: int -> value.
24+
25+
ty: type.
26+
top: ty.
27+
bottom: ty.
28+
29+
boolean: ty.
30+
integer: ty.
31+
32+
u: int -> endinanness -> ty.
33+
s: int -> endinanness -> ty.
34+
35+
arr: ty -> list rel -> ty.
36+
str: list rel -> ty.
37+
38+
meet: list ty -> ty.
39+
join: list ty -> ty.
40+
41+
ref: path -> ty.
42+
43+
liq: ty -> list rel -> ty.
44+
size: list rel -> ty.
45+
val: value -> ty -> ty.
46+
47+
prod: list path -> ty.
48+
49+
reduced: ty -> ty.
50+
51+
typeof: (Path: path) (Type: ty) -> prop.
52+
ctypeof: (Path: path) (Type: ty) -> prop.
53+
54+
simpl: (Complex: ty) (Simple: ty) -> prop.
55+
subst: ty -> ty -> prop.
56+
reduce_meet: ty -> ty -> ty -> prop.
57+
58+
ctypeof P T :-
59+
typeof P Tx,
60+
subst Tx Ty,
61+
simpl Ty T.
62+
63+
is_simple: ty -> prop.
64+
is_simple (join X::Xs) :-
65+
failure.
66+
is_simple (prod X::Xs) :-
67+
failure.
68+
is_simple _ :-
69+
success.
70+
71+
subst (arr Tx Nx) (arr Ty Ny) :-
72+
subst Tx Ty,
73+
subst Nx Ny.
74+
subst (str X) (str Y) :-
75+
subst X Y.
76+
subst (meet X::Xs) (meet Y::Ys) :-
77+
subst X Y,
78+
subst (meet Xs) (meet Ys).
79+
subst (liq Tx P) (liq Ty P) :-
80+
subst Tx Ty.
81+
subst (size X) (size Y) :-
82+
subst X Y.
83+
subst (val V Tx) (val V Ty) :-
84+
subst Tx Ty.
85+
subst (ref P) T :-
86+
ctypeof P Tx,
87+
if is_simple Tx
88+
then eq T Tx
89+
else eq T (ref P).
90+
subst T T.
91+
92+
simpl (arr Tx Nx) (arr Ty Ny) :-
93+
simpl Tx Ty,
94+
simpl Nx Ny.
95+
simpl (str Tx) (str Ty) :-
96+
simpl Tx Ty.
97+
simpl (liq Tx P) (liq Ty P) :-
98+
simpl Tx Ty.
99+
simpl (size Tx) (size Ty) :-
100+
simpl Tx Ty.
101+
simpl (val V Tx) (val V Ty) :-
102+
simpl Tx Ty.
103+
simpl (meet []) top.
104+
simpl (join []) bottom.
105+
simpl (meet X::Xs) T :-
106+
reduce_meet X (meet Xs) T.
107+
simpl (join X::[]) Y :-
108+
simpl X Y.
109+
simpl (join X::Xs) (join Z) :-
110+
simpl X Y,
111+
simpl (join Xs) (join Ys),
112+
reduce_join Y::Ys Z.
113+
simpl T T.
114+
115+
reduce_join (join X)::Xs Y :-
116+
append X Xs Z,
117+
reduce_join Z Y.
118+
reduce_join X::Ys X::Zs :-
119+
reduce_join Ys Zs.
120+
reduce_join [] [].
121+
122+
reduce_meet X X X.
123+
reduce_meet top X X.
124+
reduce_meet X top X.
125+
reduce_meet bottom X bottom.
126+
reduce_meet X bottom bottom.
127+
reduce_meet integer (u S E) (u S E).
128+
reduce_meet integer (s S E) (s S E).
129+
reduce_meet (arr Tx Sx) (arr Ty Sy) (arr T S) :-
130+
reduce_meet Tx Ty T,
131+
reduce_meet Sx Sy S.
132+
reduce_meet (str Sx) (str Sy) (str S) :-
133+
reduce_meet Sx Sy S.
134+
135+
reduce_meet (liq Tx Px) (liq Ty Py) (liq T P) :-
136+
reduce_meet Tx Ty T,
137+
append Px Py P.
138+
reduce_meet (liq Tx P) (val V Ty) (val V (liq T P)) :-
139+
reduce_meet Tx Ty T.
140+
reduce_meet (val V Tx) (liq Ty P) (val V (liq T P)) :-
141+
reduce_meet Tx Ty T.
142+
reduce_meet (val Vx Tx) (val Vy Ty) (val V T) :-
143+
reduce_meet Vx Vy V,
144+
reduce_meet Tx Ty T.
145+
reduce_meet (val V Tx) Ty (val V T) :-
146+
reduce_meet Tx Ty T.
147+
reduce_meet Tx (val V Ty) (val V T) :-
148+
reduce_meet Tx Ty T.
149+
150+
(* TODO: support non-reducible terms *)
151+
reduce_meet (meet X::Xs) (meet Y) Z :-
152+
append Xs Y Ts,
153+
reduce_meet X (meet Ts) Z.
154+
reduce_meet (meet []) Y Y.
155+
reduce_meet (meet X::Xs) Y Z :-
156+
append Xs [Y] Ts,
157+
reduce_meet X (meet Ts) Z.
158+
reduce_meet X (meet []) X.
159+
reduce_meet X (meet Y::Ys) Z :-
160+
reduce_meet X Y T,
161+
reduce_meet T (meet Ys) Z.
162+
163+
reduce_meet X (join [Y]) Z :-
164+
reduce_meet X Y Z.
165+
reduce_meet X (join Y::Ys) (join Z::Zs) :-
166+
reduce_meet X Y Z,
167+
reduce_meet X (join Ys) (join Zs).
168+
169+
reduce_meet (join [X]) Y Z :-
170+
reduce_meet X Y Z.
171+
reduce_meet (join X::Xs) Y (join Z::Zs) :-
172+
reduce_meet X Y Z,
173+
reduce_meet (join Xs) Y (join Zs).
174+
175+
reduce_meet (ref X) Y (reduced (meet [X, Y])).
176+
reduce_meet X (ref Y) Z (reduced (meet [X, Y])).
177+
178+
reduce_meet (prod X) Y Z :- failure.
179+
reduce_meet X (prod Y) Z :- failure.
180+
181+
(* TODO: everything else *)
182+
reduce_meet _ _ bottom.

src/lib.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ use pest_derive::Parser;
44

55
pub mod path;
66
pub mod expr;
7+
pub mod types;
78
pub mod report;
89

910
#[derive(Parser)]

src/main.rs

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,14 +7,17 @@ type Error = Box<dyn std::error::Error>;
77

88
fn main() -> Result<(), Error> {
99
let loader = razbor::expr::ExprLoader::new();
10-
let (file_table, tox) = loader.load("../tox/tox-ksy/razbor/tox.mexpr");
10+
let (file_table, tox) = loader.load("../tox/tox-razbor/src/tox.mexpr");
1111
let mods = tox.unwrap();
1212

1313
let converter = razbor::path::ExprConverter::new();
1414
let mut table = converter.convert(&mods).unwrap();
1515

1616
let namer = razbor::path::NameResolver::new();
17-
let errors = namer.resolve(&mut table).unwrap_err();
17+
namer.resolve(&mut table).unwrap();
18+
19+
let ty_conv = razbor::types::ExprToType::new();
20+
let errors = ty_conv.into_types(table).unwrap_err();
1821

1922
let mut sourcer = razbor::report::Sourcer::default();
2023
for err in &errors {

src/path.rs

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,15 @@ pub enum PathSegment {
1313
Name(SmolStr),
1414
}
1515

16+
impl std::fmt::Display for PathSegment {
17+
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
18+
match self {
19+
PathSegment::Pos(n) => write!(f, "{}", n),
20+
PathSegment::Name(name) => write!(f, "{}", name)
21+
}
22+
}
23+
}
24+
1625
#[derive(Debug, Clone, PartialEq, PartialOrd, Eq, Ord, Default)]
1726
pub struct RzPath {
1827
pub modules: Vec<SmolStr>,

0 commit comments

Comments
 (0)