Clase 4. Árboles de Sintaxis Abstracta (AST)
NotasClase_annotated.pdf
Ejemplos
Ejemplo lc-exp
#lang eopl
#|
<lc-exp> ::= <identificador>
var-exp(id)
::= "lambda" "(" <identificador> ")" <lc-exp>
lambda-exp(id, exp)
::= "(" <lc-exp> <lc-exp> ")"
app-exp(rator, rand)
|#
(define-datatype lc-exp lc-exp?
(var-exp (id symbol?))
(lambda-exp (id symbol?)
(exp lc-exp?))
(app-exp (rator lc-exp?)
(rand lc-exp?)))
;;;Area del programador
;;Constructores
;;lambda(x) lambda (y) z
(define exp1
(lambda-exp 'x (lambda-exp 'y (var-exp 'z))))
;;(x y)
(define exp2
(app-exp (var-exp 'x) (var-exp 'y)))
;;Observadores
;; cases
;;Ocurre libre
;; 1. si es un var-exp la variables deben ser iguales
;; 2. Si es un lambda-exp debe ser diferente del identificador y ocurrir libre en la exp
;; 3. Si es un app-exp debe ocurrir libre en rator o en rand
(define occurs-free?
(lambda (exp var)
(cases lc-exp exp
(var-exp (id) (eqv? var id))
(lambda-exp (id exp1)
(and
(not (eqv? var id))
(occurs-free? exp1 var)))
(app-exp (rat ran)-
(or
(occurs-free? rat var)
(occurs-free? ran var))))))
Caso listas
#lang eopl
#|
<lista-s> ::= '()
empty-list()
:: <symbol> <lista-s>
non-empty-list(s,l)
|#
(define-datatype lista-s lista-s?
(empty-list)
(non-empty-list (s symbol?)
(l lista-s?)))
;;Area del programador
(define lista1
(non-empty-list 'x (non-empty-list 'y (empty-list))))
;;Función que me busque un simbolo
;;find-sym: <lista-s> => <bool>
(define find-sym
(lambda (l s)
(cases lista-s l
(empty-list () #F)
(non-empty-list (sy ls)
(if
(eqv? sy s)
#T
(find-sym ls s))))))
(display (find-sym lista1 'y)) ;T
(display "\n")
(display (find-sym lista1 'w)) ;F
Caso ambientes
#lang eopl
#|
<env> ::= '()
empty-env-record()
(<identificador>* <expression>*)
extend-env-record(lid lval)
|#
(define-datatype environment environment?
(empty-env-record)
(extend-env-record
(lid (list-of symbol?))
(lval (list-of value?))
(env environment?)
))
(define value? (lambda (x) #T))
(define e
(extend-env-record
'(a b c)
'(1 2 3)
(extend-env-record
'(e f g)
'(4 5 6)
(empty-env-record))))
Ejercicio en clase
ejercicio_annotated.pdf
#lang eopl
#|
<lc-exp> ::= <identificador>
var-exp(id)
::= "(" "lambda" "(" <identificador>* ")" <lc-exp> ")"
lambda-exp(lid, exp)
::= "(" <lc-exp> <lc-exp> ")"
app-exp(rator, rand)
|#
(define-datatype lc-exp lc-exp?
(var-exp (id symbol?))
(lambda-exp (lid (list-of symbol?))
(exp lc-exp?))
(app-exp (rator lc-exp?)
(rand lc-exp?)))
;;Area del programador
;;(lambda (x y z ) (lambda (x y) (x (lambda (x) y))))
(define exp1
(lambda-exp
'(x y z)
(lambda-exp
'(x y)
(app-exp
(var-exp 'x)
(lambda-exp
'(x)
(var-exp 'y))))))
;;unparser: lc-exp --> lista
(define unparser
(lambda (exp)
(cases lc-exp exp
(var-exp (d) (list 'var-exp d))
(lambda-exp (lid body)
(list 'lambda-exp lid
(unparser body)))
(app-exp (rator rand)
(list
'app-exp
(unparser rator)
(unparser rand))))))
(define lista1 (unparser exp1))
;;parser: lista -> lc-exp
(define parser
(lambda (lst)
(cond
[(eqv? (car lst) 'var-exp)
(var-exp (cadr lst))]
[(eqv? (car lst) 'lambda-exp)
(lambda-exp
(cadr lst)
(parser (caddr lst)))]
[(eqv? (car lst) 'app-exp)
(app-exp
(parser (cadr lst))
(parser (caddr lst)))]
[else (eopl:error "La expresión no tiene la forma correcta")])))