Arboles de sintaxis abtracta¶
En este momento tenemos limitaciones con respecto a la presentación, vimos dos representaciones
- Basada en listas
- Basada en procedimientos
Sin embargo estamos limitados por el lenguaje de programación (Racket), vamos a utilizar los arboles de sintaxis abstracta
¿Que son?¶
Son represent aciones desde la gramatica, donde relaciona la estructura del tipo de dato con respecto a su especificación
<lc-exp> ::= <identifier>
var-exp(id)
::= "lambda" "(" <identifier>* ")" <lc-exp>
lambda-exp(lid, exp)
::= "(" <lc-exp> <lc-exp> ")"
app-exp(rator, rand)
Usando los constructores var-exp, lambda-exp y app-exp
(var-exp 'x)
graph TD
var-exp -->|id| x
(lambda-exp (list x y z) (var-exp 'y))
graph TD
lambda-exp -->|lid|A[x,y,z]
lambda-exp -->|exp|B[var-exp]
B -->|id|y
(app-exp
(app-exp
(lambda-exp '(a b c) (lambda '(x y z) (var-exp 'x)))
(var-exp 'z)
)
(lambda-exp '(a b c d e f) (var-exp 'e))
)
graph TD
A[app-exp] -->|rator| B[app-exp]
A[app-exp] -->|rand| C[lambda-exp]
B -->|rator| D[lambda-exp]
B -->|rand| E[var-exp]
D -->|lid| F[a,b,c]
D -->|exp| G[lambda-exp]
G -->|lid| H[x,y,z]
G -->|exp| I[var-exp]
I -->|id| J[x]
E -->|id| K[z]
C -->|lid| L[a,b,c,d,e,f]
C -->|exp| M[var-exp]
M -->|id| N[e]
Esta representación permite
- Saber si el código fuente está bien escrito
- Representar los datos de una forma independiente de los lenguajes de programación
(app-exp
(app-exp
(app-exp
(app-exp
(var-exp 'x)
(lambda-exp '(a b c)
(var-exp 'y)
)
)
(app-exp
(lambda '(x y z) (var-exp 'p))
(lambda '(m n o p q r t u)
(lambda '(v w x y z)
(lambda
'(a b c)
(var-exp 'p)
)
)
)
)
)
(app-exp
(var-exp 's)
(var-exp 'r)
)
)
(app-exp
(app-exp
(var-exp 'a)
(var-exp 'b)
)
(var-exp 'x)
)
)
graph TD
A[app-exp] -->|rator| B[app-exp]
A -->|rand| C[app-exp]
B[app-exp] -->|rator| D[app-exp]
B -->|rand| E[app-exp]
D[app-exp] -->|rator| F[app-exp]
D -->|rand| G[app-exp]
F -->|rator| H[var-exp]
H -->|id| I[x]
F -->|rand| J[lambda-exp]
J -->|lid| K[a,b,c]
J -->|exp| L[var-exp]
L -->|id| M[y]
G -->|rator| N[lambda-exp]
G -->|rand| O[lambda-exp]
N -->|lid| P[x,y,z]
N -->|exp| Q[var-exp]
Q -->|id| R[p]
O -->|lid| S[m n o p q r t u]
O -->|exp| T[lambda-exp]
T -->|lid| U[v w x y z]
T -->|exp| V[lambda-exp]
V -->|lid| W[a b c]
V -->|exp| X[var-exp]
X -->|id| Y[p]
C -->|rator| Z[app-exp]
C -->|rand| AA[var-exp]
AA -->|id| AF[x]
Z -->|rator| AB[var-exp]
AB -->|id| AC[a]
Z --> |rand| AD[var-exp]
AD -->|id| AE[b]
E -->|rator| AG[var-exp]
AG -->|id| AH[s]
E -->|rand| AI[var-exp]
AI -->|id| AJ[r]