Semantics of PLs via Interpreters: Getting Started CS784: Programming Languages Prabhaker Mateti
Dec 14, 2015
2
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)
3
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 eoplat the top of the file instead.
• If the module says(module name mzscheme .... ) use #lang mzschemeinstead (NOT #lang racket -- the syntax for require/provide is slightly different).
CS784 (PM)
4
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)
5
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)
6
Examples in the LET language
1. let x = 5 in -(x,3)2. let z = 5
in let x = 3in let y = -(x,1) % here x = 3
in let x = 4in -(z, -(x,y)) % here x = 4
3. let x = 7in let y = 2
in let y =let x = -(x,1)in -(x,y)
in -(-(x,8), y)
CS784 (PM)
7
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)
8
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)
9
Functions in our LET-Interpreter
constructors
1. const-exp : Int →Exp
2. zero?-exp : Exp → Exp
3. if-exp : Exp × Exp × Exp → Exp
4. diff-exp : Exp × Exp → Exp
5. var-exp : Var → Exp
6. let-exp : Var × Exp × Exp → Exp
observer
7. value-of : Exp × Env → ExpVal
CS784 (PM)
10
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)
11
Notation
Notation Denotes env
[] Empty env
[ var = val ] (extend-env var val )«exp» AST for expression exp
n (num-val n),
val (expval->num val).
Note: [[n]] =n
CS784 (PM)
13
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)
14
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)
18
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?))
(if-exp (exp1 expression?)
(exp2 expression?)
(exp3 expression?))
(var-exp (var identifier?))
(let-exp (var identifier?)
(exp1 expression?)
(body expression?)))
CS784 (PM)
19
(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)
20
Fig 3.7a Expressed values
• (define-datatype expval expval?(num-val
(num number?))(bool-val
(bool boolean?)))
CS784 (PM)
21
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)
22
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)