-
-
Notifications
You must be signed in to change notification settings - Fork 60
/
Copy pathpreprocess.rs
77 lines (74 loc) · 2.18 KB
/
preprocess.rs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
use aw_datastore::Datastore;
use crate::ast::*;
use crate::QueryError;
use crate::VarEnv;
pub fn preprocess_prog(p: &Program, env: &mut VarEnv, ds: &Datastore) -> Result<(), QueryError> {
for expr in &p.stmts {
preprocess_expr(env, ds, expr)?;
}
Ok(())
}
fn preprocess_expr(env: &mut VarEnv, ds: &Datastore, expr: &Expr) -> Result<(), QueryError> {
use crate::ast::Expr_::*;
match &expr.node {
Var(ref var) => env.add_ref(var)?,
Add(ref a, ref b) => {
preprocess_expr(env, ds, a)?;
preprocess_expr(env, ds, b)?;
}
Sub(ref a, ref b) => {
preprocess_expr(env, ds, a)?;
preprocess_expr(env, ds, b)?;
}
Mul(ref a, ref b) => {
preprocess_expr(env, ds, a)?;
preprocess_expr(env, ds, b)?;
}
Div(ref a, ref b) => {
preprocess_expr(env, ds, a)?;
preprocess_expr(env, ds, b)?;
}
Mod(ref a, ref b) => {
preprocess_expr(env, ds, a)?;
preprocess_expr(env, ds, b)?;
}
Equal(ref a, ref b) => {
preprocess_expr(env, ds, a)?;
preprocess_expr(env, ds, b)?;
}
Assign(ref var, ref b) => {
preprocess_expr(env, ds, b)?;
env.declare(var.to_string());
}
Function(ref fname, ref args) => {
env.add_ref(fname)?;
preprocess_expr(env, ds, args)?;
}
If(ref ifs) => {
for (cond, block) in ifs {
// TODO: could be optimized?
preprocess_expr(env, ds, cond)?;
for expr in block {
preprocess_expr(env, ds, expr)?;
}
}
}
List(list) => {
for entry in list {
preprocess_expr(env, ds, entry)?;
}
}
Dict(d) => {
for (_key, val_uninterpreted) in d {
preprocess_expr(env, ds, val_uninterpreted)?;
}
}
Return(e) => {
preprocess_expr(env, ds, e)?;
}
Bool(_lit) => (),
Number(_lit) => (),
String(_lit) => (),
};
Ok(())
}