Announcements
Project Overview
IMP: a simple imperative language
(assignment)
(if-then-else)
(sequential composition)
(loop)
The Formal Semantics of Programming Languages by Glynn Winskel
Recursive Interpreter
class Binop : public Expr {
enum BINOP { PLUS, SUB, MUL, DIV};
BINOP op;
Expr *left, *right;
};
int eval_expr(Frame* f, Expr *e) { ... }
int eval_binop(Frame *f, Binop *e) {
switch(e->op) {
case PLUS: return eval_plus(e);
case SUB : return eval_sub(e);
case MUL : return eval_mul(e);
case DIV : return eval_div(e);
}
}
int eval_plus(Frame *f, Binop *e) {
int n_1 = eval_expr(f, e->left);
int n_2 = eval_expr(f, e->right);
return n_1 + n_2;
}
...
Semantic Notation – Evaluation Relations
Variables and Frames
x = 1;
y = 2;
z = 3;
Evaluation Relations (Formal)
Evaluation Relations (Formal)
Expressions: Inference Rules
✓
𝘹
✓
𝘹
✓
𝘹
Expressions: Inference Rules
Errant Evaluations
Recursive Interpreter
class Binop : public Expr {
enum BINOP { PLUS, SUB, MUL, DIV};
BINOP op;
Expr *left, *right;
};
int eval_expr(Frame* f, Expr *e) { ... }
int eval_binop(Frame *f, Binop *e) {
switch(e->op) {
case PLUS: return eval_plus(e);
case SUB : return eval_sub(e);
case MUL : return eval_mul(e);
case DIV : return eval_div(e);
}
}
int eval_plus(Frame *f, Binop *e) {
int n_1 = eval_expr(f, e->left);
int n_2 = eval_expr(f, e->right);
return n_1 + n_2;
}
Recursive Interpreter
class Binop : public Expr {
enum BINOP { PLUS, SUB, MUL, DIV};
BINOP op;
Expr *left, *right;
};
int eval_expr(Frame* f, Expr *e) { ... }
int eval_binop(Frame *f, Binop *e) {
switch(e->op) {
case PLUS: return eval_plus(e);
case SUB : return eval_sub(e);
case MUL : return eval_mul(e);
case DIV : return eval_div(e);
}
}
int eval_plus(Frame *f, Binop *e) {
int n_1 = eval_expr(f, e->left);
int n_2 = eval_expr(f, e->right);
return n_1 + n_2;
}
Boolean Expressions: Inference Rules
Statements: Inference Rules
Statements: Inference Rules (cont.)
Example
if (x == 1)
{
y = 2;
}
Next Time