Presentation is loading. Please wait.

Presentation is loading. Please wait.

Cs784 (Prasad)L6AST1 Abstract Syntax. cs784 (Prasad)L6AST2 Language of -expressions ::= | (lambda ( ) ) | ( ) E.g., concrete syntax Scheme S-expressions.

Similar presentations


Presentation on theme: "Cs784 (Prasad)L6AST1 Abstract Syntax. cs784 (Prasad)L6AST2 Language of -expressions ::= | (lambda ( ) ) | ( ) E.g., concrete syntax Scheme S-expressions."— Presentation transcript:

1 cs784 (Prasad)L6AST1 Abstract Syntax

2 cs784 (Prasad)L6AST2 Language of -expressions ::= | (lambda ( ) ) | ( ) E.g., concrete syntax Scheme S-expressions ( lambda (x) ( f ( f x ) ) )

3 cs784 (Prasad)L6AST3 Abstract Syntax (vs Concrete Syntax) lambda-exp app-exp var-exp id body rand app-exp rator

4 cs784 (Prasad)L6AST4 Overview Parse-expression Unparse-expression Interpreter Concrete Syntax Abstract Syntax Results

5 cs784 (Prasad)L6AST5 Representing Abstract Syntax with Records (define-datatype expression expression? (var-exp (id symbol?)) (lambda-exp (id symbol?) (body expression?)) (app-exp (rator expression?) (rand expression?)))

6 cs784 (Prasad)L6AST6 (define parse-expression (lambda (datum) (cond ((symbol? datum) (var-exp datum)) ((pair? datum) (if (eqv? (car datum) 'lambda) (lambda-exp (caadr datum) (parse-expression (caddr datum))) (parse-expression (caddr datum))) (app-exp (app-exp (parse-expression (car datum)) (parse-expression (car datum)) (parse-expression (cadr datum))) (parse-expression (cadr datum))) ) ) (else (eopl:error 'parse-expression "Invalid concrete syntax ~s" datum)) ))) Parse: Concrete to Abstract Syntax

7 cs784 (Prasad)L6AST7 > (current-directory “I:\\tkprasad\\cs784\\EOPL-CODE\\interps") > (load "chez-init.scm") > (load "2-2-2.scm") > (parse-expression 'x) (var-exp x) > (parse-expression '(lambda (x) (f x))) (lambda-exp x (app-exp (var-exp f) (var-exp x))) > (parse-expression 45) Error reported by parse-expression: Invalid concrete syntax 45 debug>e >(unparse-expression '(lambda-exp x (app-exp (var-exp f) (var-exp x)))) (lambda (x) (f x)) Example (Petite Scheme)

8 cs784 (Prasad)L6AST8 Example (PLT Scheme)

9 cs784 (Prasad)L6AST9 Unparse: Abstract to Concrete Syntax (define unparse-expression (lambda (exp) (cases expression exp id (var-exp (id) id) (lambda-exp (id body) (list 'lambda (list id) (unparse-expression body)) (unparse-expression body)) ) (app-exp (rator rand) (list (unparse-expression rator) (unparse-expression rand)) ) (unparse-expression rand)) ) )))

10 cs784 (Prasad)L6AST10 Role of Induction and Recursion Define data structures (infinite values) by induction. Seed elements. Closure operations. Define functions (operations) by recursion. Boundary/Basis case. Composite/Recursive case. Prove properties using structural induction. Basis case. Inductive step.

11 cs784 (Prasad)L6AST11 Representing Environment

12 cs784 (Prasad)L6AST12 Alternative 1 (define empty-env (lambda () '())) (define extend-env (lambda (syms vals env) (cons (list syms vals) env) )) (define apply-env (lambda (env sym) (if (null? env) (eopl:error 'apply-env "No binding for ~s" sym) (let ((syms (car (car env))) (vals (cadr (car env))) (env (cdr env))) (let ((pos (rib-find-position sym syms))) (if (number? pos) (list-ref vals pos) (apply-env env sym))))) ))

13 cs784 (Prasad)L6AST13 Alternative 2 (define empty-env (lambda () (lambda (sym) (eopl:error 'apply-env "No binding for ~s" sym)) ) ) (define extend-env (lambda (syms vals env) (lambda (sym) (let ((pos (list-find-position sym syms))) (if (number? pos) (list-ref vals pos) (apply-env env sym)))) ) ) (define apply-env (lambda (env sym) (env sym) ) )

14 cs784 (Prasad)L6AST14 Alternative 3 (define-datatype environment environment? (empty-env-record) (extended-env-record (syms (list-of symbol?)) (vals (list-of scheme-value?)) (env environment?))) (define scheme-value? (lambda (v) #t))

15 cs784 (Prasad)L6AST15 (cont’d) (define empty-env (lambda () (empty-env-record) )) (define extend-env (lambda (syms vals env) (extended-env-record syms vals env))) (define apply-env (lambda (env sym) (cases environment env (empty-env-record () (eopl:error 'apply-env "No binding for ~s" sym)) (extended-env-record (syms vals env) (let ((pos (list-find-position sym syms))) (if (number? pos) (list-ref vals pos) (apply-env env sym)))) ) ))

16 cs784 (Prasad)L6AST16 Queue (define reset (lambda (q) (vector-ref q 0))) (define empty? (lambda (q) (vector-ref q 1))) (define enqueue (lambda (q) (vector-ref q 2))) (define dequeue (lambda (q) (vector-ref q 3))) (define Q (create-queue)) ((enqueue Q) 55) ((empty? Q)) ((dequeue Q)) ((empty? Q)) ((reset Q)) ((dequeue Q))

17 cs784 (Prasad)L6AST17 (define create-queue (lambda () (let ((q-in '()) (q-out '())) (letrec ((reset-queue (lambda () (set! q-in '()) (set! q-out '())) ) (empty-queue? (lambda () (and (null? q-in) (null? q-out))) ) (enqueue (lambda (x) (set! q-in (cons x q-in))) ) (dequeue (lambda () (if (empty-queue?) (eopl:error 'dequeue "Not on an empty queue") (begin (if (null? q-out) (begin (set! q-out (reverse q-in)) (set! q-in '()))) (let ((ans (car q-out))) (set! q-out (cdr q-out)) ans))))) ) (vector reset-queue empty-queue? enqueue dequeue)) )))


Download ppt "Cs784 (Prasad)L6AST1 Abstract Syntax. cs784 (Prasad)L6AST2 Language of -expressions ::= | (lambda ( ) ) | ( ) E.g., concrete syntax Scheme S-expressions."

Similar presentations


Ads by Google