Download Parte 1 - Lenguajes de Programación

Document related concepts

Expresión S wikipedia , lookup

Búsqueda de patrones wikipedia , lookup

Clojure wikipedia , lookup

Transcript
Lenguajes de Programación
Generación de código ejecutable - Parte I
Manuel Soto Romero
Universidad Nacional Autónoma de México
Facultad de Ciencias
3 de marzo de 2017
Manuel Soto Romero (UNAM)
Lenguajes de Programación
3 de marzo de 2017
1 / 12
Análisis para obtener código ejecutable
Para obtener código ejecutable dado un código fuente, pasamos por
distintos análisis:
Manuel Soto Romero (UNAM)
Lenguajes de Programación
3 de marzo de 2017
2 / 12
Análisis para obtener código ejecutable
Para obtener código ejecutable dado un código fuente, pasamos por
distintos análisis:
I
Análisis léxico
I
Análisis sintáctico
I
Análisis semántico
I
Optimizaciones
En esta sesión revisaremos el análisis léxico y sintáctico
Manuel Soto Romero (UNAM)
Lenguajes de Programación
3 de marzo de 2017
2 / 12
Sintaxis concreta
Nos referimos con sintaxis concreta a cómo se escriben las
expresiones de un determinado lenguaje.
Lo usual es describir estas reglas usando EBNF:
Manuel Soto Romero (UNAM)
Lenguajes de Programación
3 de marzo de 2017
3 / 12
Sintaxis concreta
Nos referimos con sintaxis concreta a cómo se escriben las
expresiones de un determinado lenguaje.
Lo usual es describir estas reglas usando EBNF:
Lenguaje WAE
<expr> := <id>
| <num>
| {<binop> <expr> <expr>}
| {with {<id> <expr>} <expr>}
<id> := a | b | c | ...
<num> := 1 | 2 | 3 | ...
<binop> := + | - | * | /
Manuel Soto Romero (UNAM)
Lenguajes de Programación
3 de marzo de 2017
3 / 12
Análisis léxico
Una expresión en sintaxis concreta, es realmente una cadena. El
primer análisis por el que pasa un código consiste en tomar una
cadena y separarla en lexemas.
Manuel Soto Romero (UNAM)
Lenguajes de Programación
3 de marzo de 2017
4 / 12
Análisis léxico
Una expresión en sintaxis concreta, es realmente una cadena. El
primer análisis por el que pasa un código consiste en tomar una
cadena y separarla en lexemas.
Por ejemplo, en la expresión:
a = a + b
Los lexemas son: a, =, a, + y b.
Manuel Soto Romero (UNAM)
Lenguajes de Programación
3 de marzo de 2017
4 / 12
Análisis léxico
Una expresión en sintaxis concreta, es realmente una cadena. El
primer análisis por el que pasa un código consiste en tomar una
cadena y separarla en lexemas.
Por ejemplo, en la expresión:
a = a + b
Los lexemas son: a, =, a, + y b.
Analizadores léxicos más avanzados regresan parejas de la forma
(tipo, valor).
[(id,a),(asig,=),(id,a),(op,+),(id,b)]
Manuel Soto Romero (UNAM)
Lenguajes de Programación
3 de marzo de 2017
4 / 12
Notación quote
Para ahorrarnos el trabajo de obtener los átomos de una expresión,
hacemos uso de una primitiva típica de los descendientes de Lisp
llamada quote.
Esta notación permite escribir expresiones complejas, evitando que el
intérprete las evalúe, lo que permite trabajar con ellas como si fueran
símbolos o listas.
Manuel Soto Romero (UNAM)
Lenguajes de Programación
3 de marzo de 2017
5 / 12
Notación quote
Para ahorrarnos el trabajo de obtener los átomos de una expresión,
hacemos uso de una primitiva típica de los descendientes de Lisp
llamada quote.
Esta notación permite escribir expresiones complejas, evitando que el
intérprete las evalúe, lo que permite trabajar con ellas como si fueran
símbolos o listas.
Tómalo literal, no lo interpretes
Manuel Soto Romero (UNAM)
Lenguajes de Programación
3 de marzo de 2017
5 / 12
Ejemplo
En la frase
El perro del ayudante
Manuel Soto Romero (UNAM)
Lenguajes de Programación
3 de marzo de 2017
6 / 12
Ejemplo
En la frase
El perro del ayudante
Si usamos quote:
Manuel Soto Romero (UNAM)
Lenguajes de Programación
3 de marzo de 2017
6 / 12
Ejemplo
En la frase
El perro del ayudante
Si usamos quote:
¡Tómalo literal!
Manuel Soto Romero (UNAM)
Lenguajes de Programación
3 de marzo de 2017
6 / 12
Ejemplo
En la frase
El perro del ayudante
Si usamos quote:
¡Tómalo literal!
Manuel Soto Romero (UNAM)
¡No lo interpretes!
Lenguajes de Programación
3 de marzo de 2017
6 / 12
Ejemplo (serio)
Manuel Soto Romero (UNAM)
Lenguajes de Programación
3 de marzo de 2017
7 / 12
Ejemplo (serio)
Si tenemos la expresión {+ 17 29}
Manuel Soto Romero (UNAM)
Lenguajes de Programación
3 de marzo de 2017
7 / 12
Ejemplo (serio)
Si tenemos la expresión {+ 17 29}
Sin quote:
46
Manuel Soto Romero (UNAM)
Lenguajes de Programación
3 de marzo de 2017
7 / 12
Ejemplo (serio)
Si tenemos la expresión {+ 17 29}
Sin quote:
46
Con quote:
’{
Manuel Soto Romero (UNAM)
+
17
29
first
second
third
Lenguajes de Programación
}
3 de marzo de 2017
7 / 12
Ejemplo (serio)
Si tenemos la expresión {+ 17 29}
Sin quote:
46
Con quote:
’{
+
17
29
first
second
third
}
Nos regresa una lista que incluye todos los lexemas de la expresión. Si
tuvieramos una expresión con sólo un lexema, nos regresa un símbolo.
Manuel Soto Romero (UNAM)
Lenguajes de Programación
3 de marzo de 2017
7 / 12
Ejemplo (serio)
Si tenemos la expresión {+ 17 29}
Sin quote:
46
Con quote:
’{
+
17
29
first
second
third
}
Nos regresa una lista que incluye todos los lexemas de la expresión. Si
tuvieramos una expresión con sólo un lexema, nos regresa un símbolo.
La primitiva read toma expresiones ingresadas por el usuario y les
aplica automáticamente quote.
Manuel Soto Romero (UNAM)
Lenguajes de Programación
3 de marzo de 2017
7 / 12
Análisis sintáctico
La fase de análisis sintáctico, consiste en, a partir de las expresiones
devueltas por el analizador léxico construir el árbol de sintaxis
abstracta correspondiente.
Manuel Soto Romero (UNAM)
Lenguajes de Programación
3 de marzo de 2017
8 / 12
Análisis sintáctico
La fase de análisis sintáctico, consiste en, a partir de las expresiones
devueltas por el analizador léxico construir el árbol de sintaxis
abstracta correspondiente.
¿Por qué no trabajamos directamente con la sintaxis concreta del
lenguaje?
Manuel Soto Romero (UNAM)
Lenguajes de Programación
3 de marzo de 2017
8 / 12
Análisis sintáctico
La fase de análisis sintáctico, consiste en, a partir de las expresiones
devueltas por el analizador léxico construir el árbol de sintaxis
abstracta correspondiente.
¿Por qué no trabajamos directamente con la sintaxis concreta del
lenguaje?
Sintaxis concreta:
+ 2 3
2 + 3
2 3 +
Manuel Soto Romero (UNAM)
Lenguajes de Programación
3 de marzo de 2017
8 / 12
Análisis sintáctico
La fase de análisis sintáctico, consiste en, a partir de las expresiones
devueltas por el analizador léxico construir el árbol de sintaxis
abstracta correspondiente.
¿Por qué no trabajamos directamente con la sintaxis concreta del
lenguaje?
Sintaxis concreta:
+ 2 3
2 + 3
2 3 +
Sintaxis abstracta:
(add (num 2) (num 3))
Manuel Soto Romero (UNAM)
Lenguajes de Programación
3 de marzo de 2017
8 / 12
WAE en sintaxis abstracta
(define-type WAE
[id (i symbol?)]
[num (n number?)]
[binop (f procedure?) (l WAE?) (r WAE?)]
[with (name symbol?) (named-expr WAE?) (body WAE?)])
Manuel Soto Romero (UNAM)
Lenguajes de Programación
3 de marzo de 2017
9 / 12
WAE en sintaxis abstracta
(define-type WAE
[id (i symbol?)]
[num (n number?)]
[binop (f procedure?) (l WAE?) (r WAE?)]
[with (name symbol?) (named-expr WAE?) (body WAE?)])
Este TDA nos permite definir el árbol de sintaxis abstracta, en forma
de lista.
Por ejemplo, para representar el árbol de {+ 17 29} tenemos
(binop + (num 17) (num 29)). Un árbol ternario en este caso.
Manuel Soto Romero (UNAM)
Lenguajes de Programación
3 de marzo de 2017
9 / 12
La función parse
(define (parse sexp)
...)
Esta función toma el valor regresado por el analizador léxico y
construye el árbol de sintaxis abstracta.
Manuel Soto Romero (UNAM)
Lenguajes de Programación
3 de marzo de 2017
10 / 12
La función parse
(define (parse sexp)
...)
Esta función toma el valor regresado por el analizador léxico y
construye el árbol de sintaxis abstracta.
I
La conversión de números e identificadores es trivial pues quote
regresa simplemente un número o símbolo en estos casos.
I
Para convertir operaciones binarias y asignaciones locales,
tenemos que procesar la lista, usando las primitivas car y cdr.
Manuel Soto Romero (UNAM)
Lenguajes de Programación
3 de marzo de 2017
10 / 12
La función parse
Manuel Soto Romero (UNAM)
Lenguajes de Programación
3 de marzo de 2017
11 / 12
La función parse
(define (parse sexp)
(cond
[(symbol? sexp) (id sexp)]
[(number? sexp) (num sexp)]
[(list? sexp)
(case (car sexp)
[(+) ...]
[(with) ...])]))
Manuel Soto Romero (UNAM)
Lenguajes de Programación
3 de marzo de 2017
11 / 12
Ejercicios
Manuel Soto Romero (UNAM)
Lenguajes de Programación
3 de marzo de 2017
12 / 12
Ejercicios
Los ejercicios se encuentran en
http://lenguajesfc.com/laboratorio.html
Sólo pueden entregar aquellos alumnos que aparezcan en la lista
de asistencia de la sesión. No es válido apuntar a miembros del
equipo que no estén presentes.
Manuel Soto Romero (UNAM)
Lenguajes de Programación
3 de marzo de 2017
12 / 12