Práctica 7 (19/10)
#
Orden del día- Gramáticas
- Gramáticas LL1
- Ejercicio interactivo gramáticas LL1
- Parser LL1
- Ejercicio interactivo parsing LL1
- Intervalo 10m
- Explicación lab 4 + criterios de corrección
#
BibliografíaLouden 4.2, 3.2. Ullman 4.2.1. Apuntes de la teórica.
#
Qué es una Gramática- Conjunto de símbolos terminales (
if
,int
,{
... ) - Conjunto de símbolos no terminales (
IfStmt
,VarDecl
,BlockExpr
) - Conjunto de producciones (
BlockExpr -> { CompoundStmt }
) - Un símbolo inicial
Gramática:
T = tokens ;)
Referencia tokens no terminales de C: aquí
#
Cómo escribimos una gramática<simbolo_no_terminal>
symbolo_terminal
- Producción
<un_no_terminal> ::= los <simbolos> generados <de_este> lado
Derivación = aplicar producciones sucesivamente.
#
Gramática de Familang<p> ::= <p> hijo_de <p><p> ::= <p> hermano_de <p><p> ::= nombre
Bart hijo_de Homero
Bart hijo_de Homero hermano_de Lisa
Morty hijo_de Beth hijo_de Rick
#
Ejemplo 1Bart hijo_de Homero hermano_de Lisa
estado | producción | ¿cuál? |
---|---|---|
<p> | <p> ::= <p> hijo_de <p> | 1 |
<p> hijo_de <p> | <p> ::= <p> hermano_de <p> | 2 |
<p> hijo_de <p> hermano_de <p> | <p> ::= nombre | 1 |
nombre hijo_de nombre hermano_de <p> | <p> ::= nombre | 1 |
nombre hijo_de nombre hermano_de nombre | <p> ::= nombre | 1 |
#
Ejemplo 2Bart hijo_de Homero hermano_de Lisa
estado | producción | ¿cuál? |
---|---|---|
<p> | <p> ::= <p> hermano_de <p> | 1 |
<p> hermano_de <p> | <p> ::= <p> hijo_de <p> | 1 |
<p> hijo_de <p> hermano_de <p> | <p> ::= nombre | 1 |
nombre hijo_de nombre hermano_de <p> | <p> ::= nombre | 1 |
nombre hijo_de nombre hermano_de nombre | <p> ::= nombre | 1 |
#
Gramáticas LL1- No recursivas por izquierda
- No ambígua
familang original:
<p> ::= <p> hijo_de <p><p> ::= <p> hermano_de <p><p> ::= nombre
no ambígua:
<p> ::= nombre hijo_de <p><p> ::= <p> hermano_de nombre<p> ::= nombre
LL1 (no recursiva por izquierda):
<p> ::= nombre <p0><p0> ::= <p0> ::= hijo_de <p> <p0> ::= hermano_de <p>
#
Ejercicio interactivo familang v21. <p> ::= : nombre <p0> y_de <p>2. <p> ::= nombre <p0>3. <p0> ::= 4. <p0> ::= hijo_de <p> 5. <p0> ::= hermano_de <p>
- Ejemplo:
Maggie hermano_de : Lisa hijo_de : Homero y_de Marge y_de Bart hermano_de Maggie
Maggie hermano_de Lisa hermano_de Bart hijo_de: Homero hijo_de Abraham y_de Marge hermano_de Patty
Maggie hijo_de : Homero hijo de Abraham y_de Marge hermano_de : Patty y_de Selma
Luke hermano_de : Alex y_de Haley hijo_de : Phil hijo_de Frank y_de Claire hermano_de Mitchell hijo_de : Dede y_de Jay
#
¿Qué es un parser LL1? (1/3)Es un parser descendiente recursivo que usa un stack explícito.
- Funciones -> derivaciones
Estructuras de datos:
- Cola de tokens ( ya la teníamos )
- callstack -> Stack de estado
if
oswitch
-> Tabla M
#
¿Qué es un parser LL1? (2/3)stack_estado=[símbolo_inicial]cola=listado_de_tokenswhile len(cola) > 0: if cola[0]==stack_estado[0]: cola.pop() stack_estado.pop() else: produccion = M[stack_estado[0],cola[0]] stack_estado.push(*produccion.lado_derecho)
#
¿Qué es un parser LL1? (3/3)stack_estado=[símbolo_inicial]cola=listado_de_tokensdef match(): cola.pop() stack_estado.pop()def apply(produccion): stack_estado.push(*produccion.lado_derecho)
while len(cola) > 0: if cola[0]==stack_estado[0]: match() else: apply(M[stack_estado[0],cola[0]])
#
Ejercicio interactivo de parsing familang v21. <p> ::= : nombre <p0> y_de <p>2. <p> ::= nombre <p0>3. <p0> ::= 4. <p0> ::= hijo_de <p> 5. <p0> ::= hermano_de <p>
- Ejemplo:
Maggie hermano_de : Lisa hijo_de : Homero y_de Marge y_de Bart hermano_de Maggie
Maggie hermano_de Lisa hermano_de Bart hijo_de: Homero hijo_de Abraham y_de Marge hermano_de Patty
Maggie hijo_de : Homero hijo de Abraham y_de Marge hermano_de : Patty y_de Selma
Luke hermano_de : Alex y_de Haley hijo_de : Phil hijo_de Frank y_de Claire hermano_de Mitchell hijo_de : Dede y_de Jay
termdown 10m
#
Intervalo #
Explicación Lab 4 + criterios de corrección- Aceptar el assignment (link ahora o en el mail luego)
- Clonar el assignment YAYAYA
- Puntaje (hasta 11! punto extra):
- Entrega (Pasan los test): 7 puntos
- Terminan el lab entero antes de las 22: +1ptos
- El último commit es previo al martes 25/10 23:59: +3ptos