Interp-LET

advertisement
Semantics of PLs via
Interpreters: Getting Started
CS784: Programming Languages
Prabhaker Mateti
Study …
• EOPL3 Chapter 3: 3.1, 3.2
• source code: chapter3/let-lang/*
•
•
•
•
•
•
•
1722 data-structures.scm
4415 drscheme-init.scm
1450 environments.scm
2057 interp.scm
1501 lang.scm
1857 tests.scm
2007 top.scm
CS784 (PM)
2
EOPL3 Source Code
•
All the code in the book, as a zip archive (211 Kb).
•
•
•
•
•
http://www.eopl3.com/allcode.zip
tested under PLT Scheme versions 372 and 4.2.
It should run unchanged in Racket 5.1.3 .
To make it more consistent with current Racket code, remove
(module name (lib "eopl.ss" "eopl") .... )
around each file, and write
#lang eopl
at the top of the file instead.
If the module says
(module name mzscheme .... ) use
#lang mzscheme
instead
(NOT #lang racket -- the syntax for require/provide is slightly different).
CS784 (PM)
3
Interpreter vs Compiler
Input: Abstract Syntax of a program (AST)
Output:“Meaning” of the program
An interpreter carries out the meaning of a
program.
A compiler transforms a program in one
language into a program in a lower-level
language preserving the meaning.
CS784 (PM)
4
Fig 3.2 The LET language
Concrete/Abstract Syntax
Comments on the syntax
• Six kinds of expressions.
• Assume Scheme syntax for id
and number.
• Minus is used as a function
name.
• Uses std math notation for
apply.
• then-body and else-body are
single expressions.
• exp1 is the first expression and
body is the second expression.
CS784 (PM)
5
Examples in the LET language
1. let x = 5 in -(x,3)
2. let z = 5
in let x = 3
in let y = -(x,1)
% here x = 3
in let x = 4
in -(z, -(x,y)) % here x = 4
3. let x = 7
in let y = 2
in let y =
let x = -(x,1)
in -(x,y)
in -(-(x,8), y)
CS784 (PM)
6
scan&parse
(scan&parse "-(55, -(x,11))")
#(struct:a-program
#(struct:diff-exp
#(struct:const-exp 55)
#(struct:diff-exp
#(struct:var-exp x)
#(struct:const-exp 11))))
CS784 (PM)
7
Values Of The Language
•
•
•
•
Expressed values are the values of exp.
Denoted values are bound to variables.
Not always the same, in general.
In LET, they are the same:
• ExpVal = Int + Bool
• DenVal = Int + Bool
CS784 (PM)
8
Functions in our LET-Interpreter
constructors
1. const-exp
2. zero?-exp
3. if-exp
4. diff-exp
5. var-exp
6. let-exp
observer
1. value-of
CS784 (PM)
: Int →Exp
: Exp → Exp
: Exp × Exp × Exp → Exp
: Exp × Exp → Exp
: Var → Exp
: Var × Exp × Exp → Exp
: Exp × Env → ExpVal
9
Spec of value-of
1. (value-of (const-exp n) ρ) = (num-val n)
2. (value-of (var-exp var) ρ)
= (apply-env ρ var)
3. (value-of (diff-exp exp1 exp2) ρ)
= (num-val
((expval->num (value-of exp1 ρ))
(expval->num (value-of exp2 ρ))))
Three more remaining.
CS784 (PM)
10
Notation
Notation

[]
Denotes
env
Empty env
[ var = val ]  (extend-env var val )
«exp»
AST for expression exp
(num-val n),
n
val
CS784 (PM)
(expval->num val).
Note: [[n]] =n
11
Figure 3.3 An example calculation
CS784 (PM)
12
Specifying Programs
• initial environment
[i=1, v=5, x=10]
• (value-of-program exp)
= (value-of exp [i=[1],v=[5], x= [10]])
CS784 (PM)
13
Spec of value-of
4. (value-of (if-exp exp1 exp2 exp3) ρ)
= (if (expval->bool (value-of exp1 ρ))
(value-of exp2 ρ)
(value-of exp3 ρ))
5. (value-of (let-exp var exp1 body) ρ)
= (value-of body
[var = (value-of exp1 ρ)] ρ)
CS784 (PM)
14
Fig 3.4 A conditional expression
CS784 (PM)
15
Eval of an example let
CS784 (PM)
16
Eval of an example let (contd)
CS784 (PM)
17
Fig 3.6 LET lang AST def
(define-datatype program program?
(a-program
(exp1 expression?)))
(define-datatype expression
expression?
(const-exp
(num number?))
(diff-exp
(exp1 expression?)
(exp2 expression?))
(zero?-exp
(exp1 expression?))
CS784 (PM)
(if-exp
(exp1 expression?)
(exp2 expression?)
(exp3 expression?))
(var-exp
(var identifier?))
(let-exp
(var identifier?)
(exp1 expression?)
(body expression?)))
18
(init-env) = [i= 1,v= 5,x=10]
(define init-env
(lambda ()
(extend-env
'i (num-val 1)
(extend-env
'v (num-val 5)
(extend-env
'x (num-val 10)
(empty-env))))))
CS784 (PM)
19
Fig 3.7a Expressed values
• (define-datatype expval expval?
(num-val
(num number?))
(bool-val
(bool boolean?)))
CS784 (PM)
20
Fig 3.7b Expressed values
• (define expval->num
(lambda (val)
(cases expval val
(num-val (num) num)
(else (report-expval-extractor-error
’num val)))))
CS784 (PM)
21
Fig 3.7c Expressed values
• (define expval->bool
(lambda (val)
(cases expval val
(bool-val (bool) bool)
(else (report-expval-extractor-error
`bool val)))))
CS784 (PM)
22
value-of: Exp × Env → ExpVal
CS784 (PM)
23
run, value-of-program
CS784 (PM)
24
(value-of (zero?-exp exp1) env)
CS784 (PM)
25
(value-of (if-exp e1 e2 e3) env)
CS784 (PM)
26
(value-of (let-exp …) env)
CS784 (PM)
27
Download