2012-07-29 19 views

Respuesta

9

Esto parece funcionar:

%syntax_error { 
     int n = sizeof(yyTokenName)/sizeof(yyTokenName[0]); 
     for (int i = 0; i < n; ++i) { 
       int a = yy_find_shift_action(yypParser, (YYCODETYPE)i); 
       if (a < YYNSTATE + YYNRULE) { 
         printf("possible token: %s\n", yyTokenName[i]); 
       } 
     } 
} 

Se trata de todas las fichas posibles e imprime las que son aplicables en el estado actual del analizador.

Tenga en cuenta que cuando llega un token incorrecto, el analizador no llama inmediatamente a syntax_error, sino que trata de reducir lo que está en la pila esperando que el token se pueda desplazar posteriormente. Solo cuando no se puede reducir nada más y el token actual no se puede desplazar, el analizador llama syntax_error. Las reducciones cambiarán el estado del analizador, lo que significa que puede ver menos tokens de los que hubieran sido aplicables antes de las reducciones. Sin embargo, debería ser suficiente para informes de errores.

+2

¡Exactamente lo que estaba pidiendo! Sin embargo, has olvidado un 'yypParser' como primer parámetro de yy_find_shift_action :) –

1

No existe un método directo para generar dicha lista en Limón. Pero puede intentar hacer esto usando la salida de depuración de la herramienta Limpiar y depurar rastros del analizador generado. Después de llamar a ParseTrace, la función generada por el analizador imprime una lista de cambios y reducciones que se aplica a la secuencia de entrada. El último cambio antes de error de sintaxis contiene el número de estado actual antes del error. Encuentre este estado en el archivo * .out para su analizador y vea la lista de tokens esperados para él.

Cuestiones relacionadas