NoteScript · Autómata de pila sobre tokens
En Compiladores: el analizador léxico convierte el texto en tokens. Este autómata realiza el análisis sintáctico: comprueba su orden y que cada bloque tenga el cierre correcto. No ejecuta las instrucciones ni comprueba su significado.
AP determinista: cada transición consume 1 token y puede apilar (push) o desapilar (pop) un bloque. Un único estado de cuerpo q2 sirve a CUADERNO, SECCION, SUBSECCION y EJEMPLO; lo que cambia es el tope de la pila.
Las flechas se aplican solo si el tope cumple la tabla siguiente. AUTOR y FECHA requieren CUADERNO; cada FIN debe coincidir con el bloque del tope.
Qué se permite en q2 según el tope de la pila
| Tope | Tokens válidos en q2 | Cierre (pop) |
|---|---|---|
CUADERNO | AUTOR, FECHA, SECCION, simples*, LISTA, TABLA, CODIGO, EJEMPLO | FIN_CUADERNO → q15 |
SECCION | SUBSECCION, SECCION (anidada), simples*, LISTA, TABLA, CODIGO, EJEMPLO | FIN_SECCION |
SUBSECCION | simples*, LISTA, TABLA, CODIGO, EJEMPLO | FIN_SUBSECCION |
EJEMPLO | simples*, LISTA, TABLA, CODIGO (sin EJEMPLO anidado) | FIN_EJEMPLO |
*simples = TITULO, TEXTO, NOTA, TAREA, CHECK, FORMULA, GUARDAR (→ q3, 1 CADENA) y ENLACE (→ q5 → q6, 2 CADENA).
Función de transición Transiciones: estado, token y tope → destino y operación
ε = pila vacía; — en «Tope» = cualquier tope de bloque permitido; — en «Pila» = sin cambio. Cada paso consume un token, incluido EOF. Se acepta únicamente en qOK después de cerrar CUADERNO y consumir EOF.
| Estado | Token | Tope | Destino | Pila |
|---|---|---|---|---|
| q0 | CUADERNO | ε | q1 | — |
| q1 | CADENA | ε | q2 | push CUADERNO |
| q2 | AUTOR · FECHA | CUADERNO | q3 | — |
| q2 | simples (1 arg) | según tabla | q3 | — |
| q3 | CADENA | — | q2 | — |
| q2 | ENLACE | — | q5 | — |
| q5 / q6 | CADENA | — | q6 / q2 | — |
| q2 | SECCION | CUADERNO / SECCION | q4 | — |
| q4 | CADENA | — | q2 | push SECCION |
| q2 | SUBSECCION | SECCION | q16 | — |
| q16 | CADENA | — | q2 | push SUBSECCION |
| q2 | EJEMPLO | CUADERNO / SECCION / SUBSECCION | q17 | — |
| q17 | CADENA | — | q2 | push EJEMPLO |
| q2 | FIN_SECCION · FIN_SUBSECCION · FIN_EJEMPLO | = bloque | q2 | pop |
| q2 | LISTA | cualquiera | q7 | push LISTA |
| q7 | MARCADOR_ITEM | LISTA | q8 | — |
| q8 / q9 | TEXTO_LIBRE / NEWLINE | LISTA | q9 / q7 | — |
| q7 | FIN_LISTA | LISTA | q2 | pop |
| q2 | TABLA | cualquiera | q10 | push TABLA |
| q10 | CELDA | TABLA | q11 | — |
| q11 | SEPARADOR_COL | TABLA | q12 | — |
| q12 | CELDA | TABLA | q11 | — |
| q11 | NEWLINE | TABLA | q10 | — |
| q10 | FIN_TABLA | TABLA | q2 | pop |
| q2 | CODIGO | cualquiera | q13 | — |
| q13 | CADENA (lenguaje) | — | q14 | push CODIGO |
| q14 | TEXTO_CODIGO | CODIGO | q14 | — |
| q14 | FIN_CODIGO | CODIGO | q2 | pop |
| q2 | FIN_CUADERNO | CUADERNO | q15 | pop (pila vacía) |
| q15 | EOF | ε | qOK ✓ | — |
| cualquiera | token sin transición definida (incluido EOF prematuro) | — | qErr | — |
Un error léxico se detecta antes de este autómata: por ejemplo, una cadena sin comillas de cierre. Un error sintáctico aparece cuando los tokens no cumplen estas transiciones.
Ejemplo paso a paso
CUADERNO "Mis apuntes"
SECCION "Introducción"
TEXTO "Hola"
FIN_SECCION
FIN_CUADERNO
El léxico reconoce cada palabra reservada y convierte cada texto entre comillas en CADENA. En este ejemplo los espacios y saltos de línea se omiten; NEWLINE se conserva dentro de LISTA y TABLA porque sus reglas lo necesitan.
| Paso | Token | Recorrido | Pila después del paso (base → tope) |
|---|---|---|---|
| 0 | — | q0 | ε |
| 1 | CUADERNO | q0 → q1 | ε |
| 2 | CADENA («Mis apuntes») | q1 → q2 | CUADERNO |
| 3 | SECCION | q2 → q4 | CUADERNO |
| 4 | CADENA («Introducción») | q4 → q2 | CUADERNO → SECCION |
| 5 | TEXTO | q2 → q3 | CUADERNO → SECCION |
| 6 | CADENA («Hola») | q3 → q2 | CUADERNO → SECCION |
| 7 | FIN_SECCION | q2 → q2 | CUADERNO |
| 8 | FIN_CUADERNO | q2 → q15 | ε |
| 9 | EOF | q15 → qOK | ε · entrada aceptada |
Un caso de error
CUADERNO "Mis apuntes"
SECCION "Introducción"
FIN_CUADERNO
Al leer FIN_CUADERNO, el tope todavía es SECCION. No existe una transición válida: se pasa a qErr.
Error sintáctico, línea 3: se encontró FIN_CUADERNO; se esperaba FIN_SECCION para cerrar el bloque abierto.