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ía#
Louden 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> ::= nombreBart hijo_de HomeroBart hijo_de Homero hermano_de LisaMorty hijo_de Beth hijo_de Rick
Ejemplo 1#
Bart 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 2#
Bart 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> ::= nombreno ambígua:
<p> ::= nombre hijo_de <p><p> ::= <p> hermano_de nombre<p> ::= nombreLL1 (no recursiva por izquierda):
<p> ::= nombre <p0><p0> ::= <p0> ::= hijo_de <p> <p0> ::= hermano_de <p>Ejercicio interactivo familang v2#
1. <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 PattyMaggie hijo_de : Homero hijo de Abraham y_de Marge hermano_de : Patty y_de SelmaLuke 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
ifoswitch-> 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 v2#
1. <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 PattyMaggie hijo_de : Homero hijo de Abraham y_de Marge hermano_de : Patty y_de SelmaLuke hermano_de : Alex y_de Haley hijo_de : Phil hijo_de Frank y_de Claire hermano_de Mitchell hijo_de : Dede y_de Jay
Intervalo termdown 10m#
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