lex/flex yylineno一直为1的两种解决办法
起因
在使用lex做词法分析的demo时,发现错误并不能准确地定位到行,比如一个语法错误发生在第三行,但yylineno
显示为1;于是我又更改了文件,让错误出现在其它行,发现yylineno
仍然显示1。
现象描述
其实这是一个类似flex自动设置的东西,即flex有能力管理yylineno
,但因为这个开销可能比较大,然后并没有将更新yylineno
设置为默认选项。针对此,可以有以下两种解决方式。
方法1
在.l
文件设计的时候,打开针对此选项的拓展,即添加%option yylineno
,这样yylineno
就会自动更新。如下图所示:
方法2
在.l
文件的头c代码部分引入yylineno
变量,并在pattern为[\n]时,action将yylineno
加一。因为在使用lex
编译.l
文件后产生的lex.yy.c
文件内会管理yylineno
变量,因此我们只需要在.l
文件中使用extern
关键字引入yylineno
变量即可。如下图所示: