270 likes | 395 Views
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
E N D
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
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 #langeoplat the top of the file instead. • If the module says(module name mzscheme .... ) use #langmzschemeinstead (NOT #lang racket -- the syntax for require/provide is slightly different).
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.
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.
Examples in the LET language • let x = 5 in -(x,3) • 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 • let x = 7 in let y = 2 in let y = let x = -(x,1) in -(x,y) in -(-(x,8), y)
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))))
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
Functions in our LET-Interpreter • constructors • const-exp : Int →Exp • zero?-exp : Exp → Exp • if-exp : Exp × Exp × Exp → Exp • diff-exp : Exp × Exp → Exp • var-exp : Var → Exp • let-exp : Var × Exp × Exp → Exp • observer • value-of : Exp × Env → ExpVal
Spec of value-of • (value-of (const-exp n) ρ) = (num-val n) • (value-of (var-exp var) ρ)= (apply-envρ var) • (value-of (diff-exp exp1 exp2) ρ)=(num-val(- (expval->num (value-of exp1 ρ))(expval->num (value-of exp2 ρ)))) • Three more remaining.
Specifying Programs • initial environment • [i=1, v=5, x=10] • (value-of-program exp) = (value-of exp [i=[1],v=[5], x= [10]])
Spec of value-of • (value-of (if-exp exp1 exp2 exp3) ρ) = (if (expval->bool (value-of exp1 ρ)) (value-of exp2 ρ) (value-of exp3 ρ)) • (value-of (let-expvarexp1 body) ρ) = (value-of body [var = (value-of exp1 ρ)] ρ)
Fig 3.6 LET lang AST def (if-exp (exp1 expression?) (exp2 expression?) (exp3 expression?)) (var-exp (var identifier?)) (let-exp (var identifier?) (exp1 expression?) (body expression?))) • (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?))
(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))))))
Fig 3.7a Expressed values • (define-datatypeexpvalexpval? (num-val (num number?)) (bool-val (boolboolean?)))
Fig 3.7b Expressed values • (define expval->num (lambda (val) (cases expvalval (num-val (num) num) (else (report-expval-extractor-error ’numval)))))
Fig 3.7c Expressed values • (define expval->bool (lambda (val) (cases expvalval (bool-val (bool) bool) (else (report-expval-extractor-error `boolval)))))