+ All Categories
Home > Documents > Abstract Syntax

Abstract Syntax

Date post: 24-Feb-2016
Category:
Upload: madge
View: 90 times
Download: 0 times
Share this document with a friend
Description:
Abstract Syntax. Different Levels of Syntax. Lexical syntax Basic symbols (names, values, operators, etc.) Concrete syntax Rules for writing expressions, statements, programs Input to compilers/interpreters Abstract syntax “Internal” representation Captures semantics. Overview. - PowerPoint PPT Presentation
Popular Tags:
27
Abstract Syntax
Transcript
Page 1: Abstract Syntax

Abstract Syntax

Page 2: Abstract Syntax

Different Levels of Syntax

• Lexical syntax– Basic symbols (names, values, operators, etc.)

• Concrete syntax– Rules for writing expressions, statements, programs– Input to compilers/interpreters

• Abstract syntax– “Internal” representation– Captures semantics

CS784(PM) 2

Page 3: Abstract Syntax

3

Overview

Parse-expression

Unparse-expression Interpreter

Concrete Syntax

Abstract Syntax

Results

CS784(PM)

Page 4: Abstract Syntax

Concrete vs. Abstract Syntax• Expressions with common meaning (should)

have the same abstract syntax.– C: a+b*c

• Assumes certain operator precedence (why?)– Forth: bc*a+ (reverse Polish)

This expression tree represents themeaning of expression

Not the same as parse tree (why?)Does the value depend on traversal order?abc*+ (or is this it?)

CS784(PM) 4

Page 5: Abstract Syntax

5

Parse tree vs. AST

+

expr

1 2 + 3

expr

expr

( ) ( )

expr

expr

1 2

+

3

+

exprexpr

CS784(PM)

Page 6: Abstract Syntax

6

Abstract Syntax Tree

• More useful representation of syntax tree– Less clutter– Actual level of detail depends on your design

• Basis for semantic analysis• Later annotated with various information

– Type information– Computed values

CS784(PM)

Page 7: Abstract Syntax

7

Compilation in a NutshellSource code(character stream)

Lexical analysis

Parsing

Token stream

Abstract syntax tree(AST)

Semantic Analysis

if (b == 0) a = b;

if ( b ) a = b ;0==

if==b 0

=a b

if==

int b int 0=

int alvalue

int bboolean

Decorated ASTint ;

;

CS784(PM)

Page 8: Abstract Syntax

8

λ-expressions

1. <exp> ::= 2. <identifier> 3. | (lambda (<identifier> ) <exp>) 4. | (<exp> <exp>)

• Compare with Scheme S-expressions.• EOPL3 p52: Lc-expCS784(PM)

Page 9: Abstract Syntax

Lc-exp ::=

• Identifier– var-exp (var)

• (lambda (Identifier) Lc-exp)– lambda-exp (bound-var body)

• (Lc-exp Lc-exp)– app-exp (rator rand)

• Abstract syntax

CS784(PM) 9

Page 10: Abstract Syntax

EOPL3 Scheme: define-datatype

• Syntax definition:(define-datatype type-name type-predicate-name

{(variant-name {(field-name predicate)}* )} + )• An Example:

(define-datatype environment environment? (empty-env-record) (extended-env-record (syms (list-of symbol?)) (vals (list-of scheme-value?)) (env environment?)))

• Data types built by define-datatype may be mutually recursive.

CS784(PM) 10

Page 11: Abstract Syntax

Syntax Driven Representation

(define-datatype expression expression? (var-exp (id symbol?)) (lambda-exp (id symbol?) (body expression?)) (app-exp (rator expression?) (rand expression?)))

11CS784(PM)

Page 12: Abstract Syntax

Figure 2.2: (lambda (x) (f (f x)))

CS784(PM) 12

Page 13: Abstract Syntax

Concrete to Abstract Syntax(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))) (app-exp (parse-expression (car datum))

(parse-expression (cadr datum)))) ) (else (eopl:error

'parse-expression "Invalid concrete syntax ~s" datum)) )))

CS784(PM) 13

Page 14: Abstract Syntax

14

DrRacket

CS784(PM)

Page 15: Abstract Syntax

Unparse: Abstract to Concrete Syntax

(define unparse-expression (lambda (exp) (cases expression exp (var-exp (id) id) (lambda-exp (id body) (list 'lambda (list id) (unparse-expression body)) ) (app-exp (rator rand) (list (unparse-expression rator) (unparse-expression rand)) ))))

CS784(PM) 15

Page 16: Abstract Syntax

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.

CS784(PM) 16

Page 17: Abstract Syntax

17

The Environment

• Environment:– table of variable-value pairs– Chronologically later var-value pair overrides

• Constructors– empty-env – extend-env

• Observer– apply-env

CS784(PM)

Page 18: Abstract Syntax

The Environment Spec

• (empty-env) = ∅• (apply-env f var) = f (var)• (extend-env var v f] ) = g,

– where g(var1 )= v, if var1 = var= f (var1). otherwise

• from EOPL3 p36

CS784(PM) 18

Page 19: Abstract Syntax

An Example Env e

• (define e(extend-env ’d 6(extend-env ’y 8

(extend-env ’x 7(extend-env ’y 14

(empty-env))))))

• e(d)=6, e(x)=7, e(y)=8CS784(PM) 19

Page 20: Abstract Syntax

20

Representing Environment

• Many representations are possible• Speedy access• Memory frugal• Change in the interface: Syms x Vals

(define extend-env (lambda (syms vals env) … ))

CS784(PM)

Page 21: Abstract Syntax

Alt-1: env is a List of Ribs

CS784(PM) 21

• left rib: list of variables• right rib: corresponding list of values.• Exercise 2.11 EOPL3 (Ribcage)

Page 22: Abstract Syntax

Alt-1: List of Ribs (Ribcage)(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)))))))

CS784(PM) 22

Page 23: Abstract Syntax

Alt-2: env is a Unary Function

(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) ))

CS784(PM) 23

Page 24: Abstract Syntax

Alt-3: Tagged Records

(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))(define empty-env (lambda () (empty-env-record) ))(define extend-env (lambda (syms vals env) (extended-env-record syms vals env)))

CS784(PM) 24

Page 25: Abstract Syntax

Alt-3: Tagged records

(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)))))))

CS784(PM) 25

Page 26: Abstract Syntax

26

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))

CS784(PM)

Page 27: Abstract Syntax

27

1. (define create-queue2. (lambda ()3. (let ((q-in '()) (q-out '()))4. (letrec 5. ((reset-queue6. (lambda ()7. (set! q-in '()) (set! q-out '())) )8. (empty-queue?9. (lambda ()10. (and (null? q-in) (null? q-out))) )11. (enqueue12. (lambda (x)13. (set! q-in (cons x q-in))) )14. (dequeue15. (lambda ()16. (if (empty-queue?)17. (eopl:error 'dequeue "Not on an empty queue")18. (begin19. (if (null? q-out)20. (begin21. (set! q-out (reverse q-in)) (set! q-in '())))22. (let ((ans (car q-out)))23. (set! q-out (cdr q-out))24. ans))))) )25. (vector reset-queue empty-queue? enqueue dequeue))26.)))

CS784(PM)


Recommended