Skip to content

Desincronización de variables de estado global por validación semántica durante el análisis sintáctico #9

Description

@CrysoK

Descripción:
En el archivo src/bison/parser.y, se utilizan variables de estado globales (g_loops y g_fns) dentro de los bloques de acción de Bison para validar semánticamente si sentencias como break, continue o return se encuentran en el contexto adecuado (dentro de bucles o funciones, respectivamente):

| "break" { 
  if(g_loops <= 0) {
    yyerror("'break' fuera de un ciclo.");
    YYERROR;
  } else $$ = ast_new_break();
}

Problema:
Dado que Bison procesa la entrada de forma incremental y realiza operaciones de retroceso o descarte de estados durante la recuperación de errores, la ocurrencia de un error de sintaxis en mitad de la lectura de un bloque (por ejemplo, dentro de un ciclo o una función) puede interrumpir el flujo normal e impedir que estas variables globales se decrementen o incrementen correctamente.

Impacto:
Esto corrompe el estado interno del parser para sentencias subsecuentes. Por ejemplo, en el modo interactivo (REPL), un error de sintaxis dentro de un bucle puede causar que g_loops quede permanentemente con un valor mayor a cero, permitiendo la escritura de break válidos en el ámbito global en ejecuciones posteriores sin reportar el error correspondiente.

Solución propuesta:
Separar estrictamente el análisis sintáctico del análisis semántico. Bison sólo debe encargarse de validar la estructura gramatical y generar el AST correspondiente. Las validaciones de contexto (comprobar que break esté dentro de un bucle y return dentro de una función) deben realizarse mediante un recorrido posterior sobre el AST ya generado.

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions