Different Levels of Syntax Lexical syntax Basic symbols names values operators etc Concrete syntax Rules for writing expressions statements programs Input to compilersinterpreters Abstract syntax ID: 418476
Download Presentation The PPT/PDF document "Abstract Syntax" is the property of its rightful owner. Permission is granted to download and print the materials on this web site for personal, non-commercial use only, and to display it on your personal computer provided you do not modify the materials and that you retain all copyright notices contained in the materials. By downloading content from our website, you accept the terms of this agreement.
Slide1
Abstract SyntaxSlide2
Different Levels of Syntax
Lexical syntax
Basic symbols (names, values, operators, etc.)
Concrete syntaxRules for writing expressions, statements, programsInput to compilers/interpretersAbstract syntax“Internal” representationCaptures semantics
CS784(PM)
2Slide3
3
Overview
Parse-expression
Unparse-expression
Interpreter
Concrete
Syntax
Abstract
Syntax
Results
CS784(PM)Slide4
Concrete vs. Abstract Syntax
Expressions with common meaning (should) have the same abstract syntax
.
C: a+b*cAssumes certain operator precedence (why?)Forth: bc*a+ (reverse Polish)
This expression tree represents the
meaning
of expression
Not the same as parse tree (why?)
Does
the value depend on traversal order?
abc
*+ (or is this it?)
CS784(PM)
4Slide5
5
Parse tree vs. AST
+
expr
1
2
+
3
expr
expr
(
)
(
)
expr
expr
1
2
+
3
+
expr
expr
CS784(PM)Slide6
6
Abstract Syntax Tree
More useful representation of syntax tree
Less clutterActual level of detail depends on your designBasis for semantic analysisLater annotated with various informationType informationComputed values
CS784(PM)Slide7
7
Compilation in a Nutshell
Source 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
a
lvalue
int
b
boolean
Decorated AST
int
;
;
CS784(PM)Slide8
λ-expressions
<exp> ::=
<identifier>
| (lambda (<identifier> ) <exp>) | (<exp> <exp>) Compare with Scheme S-expressions.
EOPL3 p52: Lc-exp
CS784(PM)
8Slide9
Lc-exp ::=
Identifier
var
-exp (var)(lambda (Identifier) Lc-exp)
lambda-exp (bound-var
body)
(
Lc
-exp
Lc
-exp)app-exp (rator
rand)Abstract syntaxCS784(PM)
9Slide10
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)
10Slide11
Syntax Driven Representation
(define-datatype expression expression?
(var-exp
(id symbol?))
(lambda-exp
(id symbol?)
(body expression?))
(app-exp
(rator expression?)
(rand expression?)))
11
CS784(PM)Slide12
Figure 2.2: (lambda (x) (f (f x)))
CS784(PM)
12Slide13
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)13Slide14
14
DrRacket
CS784(PM)Slide15
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)15Slide16
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)
16Slide17
The Environment
Environment:
table of variable-value pairs
Chronologically later var-value pair overridesConstructorsempty-env extend-env Observerapply-envCS784(PM)
17Slide18
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 (var
1). otherwisefrom EOPL3 p36CS784(PM)
18Slide19
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)=8
CS784(PM)19Slide20
Representing Environment
Many representations are possible
Speedy access
Memory frugalChange in the interface: Syms x Vals(define extend-env (lambda (
syms vals
env
) … ))
CS784(PM)
20Slide21
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)Slide22
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)
22Slide23
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)
23Slide24
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)
24Slide25
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)25Slide26
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)Slide27
27
(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))
)))
CS784(PM)