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.
Descripción:
En el archivo
src/bison/parser.y, se utilizan variables de estado globales (g_loopsyg_fns) dentro de los bloques de acción de Bison para validar semánticamente si sentencias comobreak,continueoreturnse encuentran en el contexto adecuado (dentro de bucles o funciones, respectivamente):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_loopsquede permanentemente con un valor mayor a cero, permitiendo la escritura debreakvá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
breakesté dentro de un bucle yreturndentro de una función) deben realizarse mediante un recorrido posterior sobre el AST ya generado.