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.

consume token push (abre bloque) pop (cierra bloque) error → qErr

Qué se permite en q2 según el tope de la pila

TopeTokens válidos en q2Cierre (pop)
CUADERNOAUTOR, FECHA, SECCION, simples*, LISTA, TABLA, CODIGO, EJEMPLOFIN_CUADERNO → q15
SECCIONSUBSECCION, SECCION (anidada), simples*, LISTA, TABLA, CODIGO, EJEMPLOFIN_SECCION
SUBSECCIONsimples*, LISTA, TABLA, CODIGO, EJEMPLOFIN_SUBSECCION
EJEMPLOsimples*, 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.

EstadoTokenTopeDestinoPila
q0CUADERNOεq1—
q1CADENAεq2push CUADERNO
q2AUTOR · FECHACUADERNOq3—
q2simples (1 arg)según tablaq3—
q3CADENA—q2—
q2ENLACE—q5—
q5 / q6CADENA—q6 / q2—
q2SECCIONCUADERNO / SECCIONq4—
q4CADENA—q2push SECCION
q2SUBSECCIONSECCIONq16—
q16CADENA—q2push SUBSECCION
q2EJEMPLOCUADERNO / SECCION / SUBSECCIONq17—
q17CADENA—q2push EJEMPLO
q2FIN_SECCION · FIN_SUBSECCION · FIN_EJEMPLO= bloqueq2pop
q2LISTAcualquieraq7push LISTA
q7MARCADOR_ITEMLISTAq8—
q8 / q9TEXTO_LIBRE / NEWLINELISTAq9 / q7—
q7FIN_LISTALISTAq2pop
q2TABLAcualquieraq10push TABLA
q10CELDATABLAq11—
q11SEPARADOR_COLTABLAq12—
q12CELDATABLAq11—
q11NEWLINETABLAq10—
q10FIN_TABLATABLAq2pop
q2CODIGOcualquieraq13—
q13CADENA (lenguaje)—q14push CODIGO
q14TEXTO_CODIGOCODIGOq14—
q14FIN_CODIGOCODIGOq2pop
q2FIN_CUADERNOCUADERNOq15pop (pila vacía)
q15EOFεqOK ✓—
cualquieratoken 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.

PasoTokenRecorridoPila después del paso (base → tope)
0—q0ε
1CUADERNOq0 → q1ε
2CADENA («Mis apuntes»)q1 → q2CUADERNO
3SECCIONq2 → q4CUADERNO
4CADENA («Introducción»)q4 → q2CUADERNO → SECCION
5TEXTOq2 → q3CUADERNO → SECCION
6CADENA («Hola»)q3 → q2CUADERNO → SECCION
7FIN_SECCIONq2 → q2CUADERNO
8FIN_CUADERNOq2 → q15ε
9EOFq15 → 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.