2011-06-24 64 views
8

Estoy usando bison + flex para analizar el archivo. Por error, se invoca a yyerror(). ¿Cómo puedo obtener el número de línea o cadena que infringe las reglas para imprimirlo con el mensaje de error?bison/flex: imprimir la línea errónea

Respuesta

8

El número de línea es fácil: yylineno es el número de línea. Especifique %option yylineno en la parte superior de su archivo .l.

Bueno, casi fácil. Lookahead a veces puede hacer que el número de línea se desactive en uno. En lugar de decir algo como "Se produjo un error en la línea #xxx", es posible que desee decir que el error se produjo cerca de la línea #xxx.

En cuanto al resto, depende de usted. Deberá capturar la sintaxis no válida y llamar al controlador de error o advertencia correspondiente. Consulte el libro O'Reilly "flex & bison" para obtener más información; tiene un capítulo completo sobre mensajes de error. Un capítulo entero es demasiado para reproducir en este Q & Un sitio.

+2

Gracias por una respuesta rápida. "En lo que respecta al resto, depende de ti":) bueno, ese es el punto de mi pregunta: ¿cómo capturar la línea violenta? –

+1

@ user497208: Una respuesta tardía a su última pregunta: Usted (inadvertidamente) me está pidiendo que escriba un libro o un capítulo de un libro. Escribir un libro, o incluso un capítulo o sección de un libro, está un poco más allá de los sitios de Q & A de alcance de Internet, como Stack Overflow. Di el nombre de un libro que cubre este tema en detalle. Léelo! –

2

yylineno le da la lineno siendo procesado

También puede que el usuario sepa qué texto dio el error con yytext, en el lado de la flexión:

0|([1-9]{DIG}*) { 
        String msg("some error with number: "); msg.append(yytext); 
        yyerror(msg.c_str()); 
        } 

yytext sólo contiene el texto para el emparejado regla.

Si desea dar toda la línea tendrá que hacerlo usted mismo, abriendo el archivo buscando la línea número yylineno e imprimiéndola, un buen lugar para hacerlo es proporcionar su propia implementación de la función yyerror.

Cuestiones relacionadas