Guía visual y didáctica — con la gramática de ejemplo del curso
FIRST(α) es el conjunto de terminales con los que pueden comenzar las cadenas derivadas de α. En otras palabras: ¿qué token puede aparecer primero?
| NT | Razonamiento | FIRST resultado |
|---|---|---|
| F |
F ::= (E) → empieza con ( F ::= id → empieza con id Ninguna alternativa tiene ε → no se agrega ε |
(id |
| T' |
T' ::= *FT' → empieza con * T' ::= ε → agrega ε |
*ε |
| T |
T ::= FT' Toma FIRST(F) = {(, id} ¿F puede ser ε? NO → nos detenemos aquí |
(id |
| E' |
E' ::= +TE' → empieza con + E' ::= ε → agrega ε |
+ε |
| E |
E ::= TE' Toma FIRST(T) = {(, id} ¿T puede ser ε? NO → nos detenemos aquí |
(id |
Cuando tienes una secuencia A B C, avanza al siguiente símbolo SOLO cuando el anterior puede ser ε. En cuanto encuentres uno que no puede ser ε, para.
FOLLOW(A) es el conjunto de terminales que pueden aparecer inmediatamente después de A en alguna forma sentencial. Solo aplica a No-Terminales.
| NT | FOLLOW resultado |
|---|---|
| E | )$ |
| E' | )$ |
| T | +)$ |
| T' | +)$ |
| F | *+)$ |
Al analizar B en cualquier producción: (1) ¿Hay algo a la derecha? → agrega su FIRST sin ε. (2) ¿Ese algo puede ser ε o B está al final? → agrega FOLLOW del jefe (lado izquierdo del renglón).
PREDICT de una producción A::=α es el conjunto de tokens que activan esa producción. Le dice al parser: "cuando veas este token, usa esta regla".
| # | Producción | FIRST(α) | ¿ε? | FOLLOW(A) | PREDICT |
|---|---|---|---|---|---|
| 1 | E → TE' | (id | NO | — | (id |
| 2 | E' → +TE' | + | NO | — | + |
| 3 | E' → ε | ε | SÍ | )$ | )$ |
| 4 | T → FT' | (id | NO | — | (id |
| 5 | T' → *FT' | * | NO | — | * |
| 6 | T' → ε | ε | SÍ | +)$ | +)$ |
| 7 | F → (E) | ( | NO | — | ( |
| 8 | F → id | id | NO | — | id |
Solo hay dos casos: (1) Si la producción NO tiene ε, PREDICT = FIRST. (2) Si la producción SÍ tiene ε, PREDICT = FIRST sin ε + FOLLOW del no-terminal izquierdo.
Es una tabla M[A, a] donde A es un No-Terminal (fila) y a es un terminal o $ (columna). La celda contiene el número de producción a aplicar. Las celdas vacías significan ERROR.
| NT | id | + | * | ( | ) | $ |
|---|---|---|---|---|---|---|
| E | 1 | — | — | 1 | — | — |
| E' | — | 2 | — | — | 3 | 3 |
| T | 4 | — | — | 4 | — | — |
| T' | — | 6 | 5 | — | 6 | 6 |
| F | 8 | — | — | 7 | — | — |
| Paso | Stack | Input | Acción |
|---|---|---|---|
| 1 | $E | id+id$ | M[E,id]=1 → E→TE' |
| 2 | $E'T | id+id$ | M[T,id]=4 → T→FT' |
| 3 | $E'T'F | id+id$ | M[F,id]=8 → F→id |
| 4 | $E'T'id | id+id$ | id==id → consume, avanza |
| 5 | $E'T' | +id$ | M[T',+]=6 → T'→ε (desaparece) |
| 6 | $E' | +id$ | M[E',+]=2 → E'→+TE' |
| 7 | $E'T+ | +id$ | +==+ → consume, avanza |
| 8 | $E'T | id$ | M[T,id]=4 → T→FT' |
| 9 | $E'T'F | id$ | M[F,id]=8 → F→id |
| 10 | $E'T'id | id$ | id==id → consume, avanza |
| 11 | $E'T' | $ | M[T',$]=6 → T'→ε (desaparece) |
| 12 | $E' | $ | M[E',$]=3 → E'→ε (desaparece) |
| 13 | $ | $ | ✅ $==$ → CADENA RECONOCIDA |
Fila = No-Terminal que proceso ahora. Columna = Token que veo en la entrada. Celda = Qué producción aplico. Si la celda está vacía → ERROR. Si una celda tiene dos producciones → la gramática NO es LL(1).